清阳 发布的文章

银河麒麟系统编译安装PHP8.2的redis模块

php默认编译没有redis模块
本文记录了银河麒麟服务器操作系统(Host版)V10环境下PHP8.2如何编译安装redis模块。
本文配置在上一篇文章国产银河麒麟服务器版(Host)V10 编译安装PHP8.2基础上进行,有疑问可以先熟悉一下更容易上手。

php redis扩展源码下载

一、编译

yum install gcc  make  libzip autoconf -y
cd /usr/local/src/
wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.tar.gz
tar -zxf 5.3.7.tar.gz 
cd phpredis-5.3.7
/usr/local/php82/bin/phpize
./configure --with-php-config=/usr/local/php82/bin/php-config --enable-redis
make && make install

安装成功后,会输出redis.so已经被发送到 /usr/local/php82/lib/php/extensions/no-debug-non-zts-20220829 目录下。

二、配置启用模块

#如果已经生成过 /usr/local/php82/etc/php.ini 则跳过这一步。
cp /usr/local/src/php-8.2.26/php.ini-development  /usr/local/php82/etc/php.ini 
ln -s /usr/local/php82/etc /etc/php82

#在php.ini文件中开启redis模块
echo "extension=redis" >> /usr/local/php82/etc/php.ini

#检查测试:
php -m | grep redis
能匹配到则说明安装和开启php8.2 redis模块成功。

m4mkv5hy.png

国产银河麒麟服务器版(Host)V10 编译安装PHP8.2

本文记录了国产银河麒麟操作系统服务器版V10编译安装PHP8.2的过程

软件准备

国产银河麒麟操作系统服务器版: 下载地址

PHP8.2源码包

PHP使用8.2非线程安全版:下载地址

系统基础软件

#更新系统
yum update -y
#安装常用软件
yum install vim htop lrzsz nc \
wget curl mtr bash-completion -y

#编译软件
yum install gcc  make  libzip autoconf -y

#这些是编译PHP扩展时依赖的组件,提前安装好
yum -y install libzip \
libzip-devel \
libxml2-devel \
openssl-devel \
sqlite-devel \
bzip2-devel  \
libcurl-devel \
gmp-devel \
oniguruma-devel \
readline-devel \
libxslt-devel \
libpng-devel \
libjpeg-devel \
freetype-devel

编译安装PHP8.2

cd /usr/local/src
wget https://www.php.net/distributions/php-8.2.26.tar.gz
tar -zxvf php-8.2.26.tar.gz 
cd php-8.2.26
./configure --prefix=/usr/local/php82 --with-config-file-path=/etc/php82 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --disable-debug --disable-rpath --enable-shared  --enable-soap --with-openssl  --with-mhash  --with-sqlite3 --with-zlib --enable-bcmath --with-iconv --with-bz2 --enable-calendar --with-curl --with-cdb --enable-dom --enable-exif --enable-fileinfo --enable-filter  --enable-ftp --enable-gd --with-jpeg  --with-gettext --with-freetype --with-openssl-dir=/usr/bin/openssl  --enable-gd-jis-conv --with-gettext --with-gmp --with-mhash  --enable-mbstring --enable-mbregex    --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib-dir --with-pdo-sqlite --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets  --enable-sysvmsg --enable-sysvsem --enable-sysvshm  --with-xsl  --with-zip --enable-mysqlnd-compression-support --with-pear --enable-opcache

make && make install

设置PHP环境变量路径

#安装完成后拷贝和修改php.ini文件
cp /usr/local/src/php-8.2.26/php.ini-development  /usr/local/php82/etc/php.ini 
ln -s /usr/local/php82/etc /etc/php82

设置php-fpm systemctl开机启动项

cat > /lib/systemd/system/php-fpm.service<<EOF
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
#Type=notify
Type=forking
PIDFile=/usr/local/php82/var/run/php-fpm.pid
#ExecStart=/usr/local/php82/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php82/etc/php-fpm.conf
ExecStart=/usr/local/php82/sbin/php-fpm --fpm-config /usr/local/php82/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target
EOF

systemctl enable php-fpm
systemctl start php-fpm

其中需要注意的是:/usr/local/php82/var/run/php-fpm.pid

这个需要和你自己的PHP安装路径保持一致

拷贝和生成php-fpm.conf文件,以及 php-fpm.d/www.conf文件

cd /usr/local/php82/etc
cp php-fpm.conf.default php-fpm.conf
cp php-fpm.d/www.conf.default php-fpm.d/www.conf
  • 配置php-fpm.conf文件中的pid路径,使其和 /lib/systemd/system/php-fpm.service 文件中的 PIDFile 值保持一致
    m4midxqj.png
  • 配置 php-fpm.d/www.conf
    m4mifcsb.png

对接设置nginx,使之能够调用php-fpm处理php请求

location ~ \.php$ {
    fastcgi_pass   php-fpm;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

设置 nginx配置文件中的 php-fpm.conf

cat /etc/nginx/conf.d/php-fpm.conf
upstream php-fpm  {
        server unix:/usr/local/php82/var/run/www.sock;
}

#修改完成后重载 nginx
nginx -t && nginx -s reload

至此配置完毕。请自行测试。

查询某个IP下有哪些域名

比如我有台服务器IP: 1.1.1.1
部署了以下网站
a.web.com
b.web.com
dw.web.com
ez.web.com
有什么办法在不知道有这些域名的情况下,确认到这些域名?

方案

可以使用: https://www.shodan.io,这个网站来查询。
这里以: 1.1.1.1 为例:
https://www.shodan.io/host/1.1.1.1
查询结果如下:
m42hfw9z.png

点击红框的地方能看到当前服务器下的域名:
其中 红框为:域名,篮框为开的端口有哪些。
点开红框中即可看到有哪些域名以及二级域名在用。

方法2:

另外使用这个网址也可以查询,并且更加直观,
https://search.censys.io/hosts/

https://search.censys.io/hosts/1.1.1.1 查询结果中
Forward DNS 字段.就是我们要找的结果。

CentOS6 ssh 到 CentOS9 报 no hostkey alg 错误【已解决】

新安装一台CentOS9的服务器,SSH远程连的时候报错 no hostkey alg

原因是:

从 RHEL9 的官网文档《1.0.2. Crypto-policies, RHEL core cryptographic components, and protocols(加密策略、RHEL 核心加密组件和协议)》可以看到 SHA-1 已经在 RHEL9 中弃用了!
在 RHEL 9 中,用于签名的 SHA-1 用法在 DEFAULT 系统范围的加密策略中受到限制。除 HMAC 外,TLS、DTLS、SSH、IKEv2、DNSSEC 和 Kerberos 协议中不再允许使用 SHA-1。不受 RHEL 系统范围的加密策略控制的单个应用程序在 RHEL 9 中也不再使用 SHA-1 hashes。

所以在CentOS中也是一样的情况。

解决办法

重新启用 SHA-1 来验证现有或第三方加密签名

# update-crypto-policies --set DEFAULT:SHA1

执行结果如下:
m46wlhdi.png

{alert type="error"}
注意:LEGACY还启用了许多其他不安全的算法。有关详细信息,请参阅 RHEL 9 Security hardening (RHEL 9 安全强化)文档中的 Re-enabling SHA-1 (重新启用 SHA-1)部分。
{/alert}

PHP版本有效支持和EOL日期

当前 PHP 版本系列的最新有效支持和 EOL 日期。
参考自:https://thephp.foundation/blog/2024/10/02/php-core-roundup-19/

PHP版本发布日期积极维护直至支持结束时间
PHP 8.12021-11-252023-11-252025-12-31
PHP 8.22022-12-082024-12-312026-12-31
PHP 8.32023-11-232025-12-312027-12-31
PHP 8.42024-11-212026-12-312028-12-31
PHP 8.52025-112027-12-312029-12-31

win11版本PHP命令行报错:由于找不到vcruntime140.dll 问题 【已解决】

window 11安装php8.3-nfs非线程安全版本,命令行执行php报错:
报错:由于找不到vcruntime140.dll,无法继续执行代码
解决办法:
访问这个网站
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
找到:
m4b7iitm.png

点击下载,下载链接为:
https://aka.ms/vs/17/release/vc_redist.x64.exe
下载后,安装。即可解决。

腾讯云域名转出到阿里云

本文记录了把域名从腾讯云转出到阿里云的操作过程:

需求如下:
由于在腾讯云下有个域名,但是服务器在阿里云。国内域名需要备案。为了统一管理,需要把域名从腾讯云转移到阿里云,使用阿里云的域名和服务器来统一备案比较方便。

需要注意的是,如果域名是在腾讯云新注册的,需要等待60天才行

如果新域名注册时间不够60天,在腾讯云控制台操作转移会提示:
m21q8qru.png

2024-10-13 13:23:54 星期日
等待中。。。

iptables连接跟踪状态表conntrack爆满网络故障处理[已解决]

本文记录了Openwrt 软路由,由于iptables连接跟踪状态表conntrack达到最大限制,触发一系列奇怪的网络。从故障现象到排查过程,
到优化方案都做了详细的总结

首先介绍下公司的网络设备连接方式:

{message type="info" content=" 电信出口光猫->软路由openwrt->行为管理(深信服AC)->华为核心交换->二层交换机(有线和无线网络)"/}

问题描述:某天接到公司同事反馈 IOS端的 Appstore应用打不开。一开始以为是同事电脑问题。
报错如下:

m0yr91h9.png

故按照管理,重启大法伺候,

重启完之后,故障仍在。没多久,又有其他同事陆续范围,MAC笔记本电脑打不开 Appstore,断网重连,重启电脑都不行。
看来网络确实有问题。

开始排查

排查接入点网络

先尝试有线和无线,2.4G和5G两个WIFI频段都尝试一次,以上问故障都会出现。初步定位为和WIFI热点无关。应该是上层网络节点出问题。

排查路由防火墙设置

排查了常规的iptables防火墙,端口转发,行为管理行为策略。发现都正常。

路由器tcpdump抓包

登录openwrt路由器命令行界面,使用tcpdump -vn 192.168.24.31 抓包debug
这里的 192.168.24.31 是其中的一台苹果手机IP,我们用这台手机访问appstore抓包测试。经排查发现打开appstore 这个app时网络数据包异常,从app服务器发来的udp数据包,无法被手机端接收,服务器发来的3次同样的Udp数据包,均没有被手机端接收到。
问题就出在这里。那么是什么原因导致的呢?

考虑到既然是网络数据包进不来,重置一下网络连接是否有效呢?
然后在openwrt上面重载iptables,再测试发现app store可以正常访问了。

然而。。。,过了1分钟之后,app store就又无法访问了,一脸懵逼。。。
看来这个问题确实跟防火墙有关。
防火墙上配置了一系列端口转发规则,都是业务在用的,无法通过关闭Iptables解决。

在这里卡了大半天,实在找不到解决办法。并且在这期间app store有时候是能访问的,大部分时间都无法访问。看起来相当不稳定,很奇怪的问题。

这里就想着如何追踪iptables工作状态,经过查资料发现。
openwrt 网络连接主要和iptables有关,并且记录在 /proc/net/nf_conntrack 中,这个文件中。

nf_conntrack详解

nf_conntrack(在老版本的 Linux 内核中叫 ip_conntrack)是一个内核模块,用于跟踪一个连接的状态的。连接状态跟踪可以供其他模块使用,最常见的两个使用场景是 iptables 的 nat 的 state 模块。
iptables 的 nat 通过规则来修改目的/源地址,但光修改地址不行,我们还需要能让回来的包能路由到最初的来源主机。这就需要借助 nf_conntrack 来找到原来那个连接的记录才行。而 state 模块则是直接使用 nf_conntrack 里记录的连接的状态来匹配用户定义的相关规则。例如下面这条 INPUT 规则用于放行 80 端口上的状态为 NEW 的连接上的包。

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT。
iptables中的状态检测功能是由state选项来实现iptable的

/proc/net/nf_conntrack内容详解

cat /proc/net/nf_conntrack
ipv4     2 tcp      6 8 CLOSE src=115.231.78.3 dst=107.173.34.159 sport=64904 dport=443 src=107.173.34.159 dst=115.231.78.3 sport=443 dport=64904 [ASSURED] mark=0 zone=0 use=2
ipv4     2 tcp      6 119 TIME_WAIT src=115.231.78.3 dst=107.173.34.159 sport=45761 dport=443 src=107.173.34.159 dst=115.231.78.3 sport=443 dport=45761 [ASSURED] mark=0 zone=0 use=2
ipv4     2 tcp      6 6 CLOSE src=115.231.78.3 dst=107.173.34.159 sport=57985 dport=443 src=107.173.34.159 dst=115.231.78.3 sport=443 dport=57985 [ASSURED] mark=0 zone=0 use=2

每一列表达的意思
第一列:网络层协议名字。
第二列:网络层协议号。
第三列:传输层协议名字。
第四列:传输层协议号。
第五列:无后续包进入时无效的秒数,即老化时间。
第六列:不是所有协议都有,连接状态。
其它的列都是通过名字的方式(key与value对)表述,或和呈现标识([UNREPLIED], [ASSURED], …)。一行的不同列可能包含相同的名字(例如src和dst),第一个表示请求方,第二个表示应答方。
呈现标识含义
[ASSURED]: 在两个方面(即请求和响应)方向都看到了流量。
[UNREPLIED]: 尚未在响应方向上看到流量。如果连接跟踪缓存溢出,则首先删除这些连接。
请注意,某些列名仅出现在特定协议中(例如,TCP和UDP的sport和dport,ICMP的type和code)。 仅当内核使用特定选项构建时,才会显示其他列名称(例如mark)。

经检查发现,这个文件现在有16000行左右。这个值刚好和当前配置的
net.netfilter.nf_conntrack_max=16000 值接近,并且一直在这个值左右徘徊。查阅资料发现这个值是系统用来记录跟踪所有网络连接状态的表。已经超过了最大值。我们修改并添加一下参数再试试:
在 /etc/sysctl.conf 文件中新增以下内容

net.netfilter.nf_conntrack_buckets=262144
net.netfilter.nf_conntrack_generic_timeout=600
net.netfilter.nf_conntrack_udp_timeout=30
net.netfilter.nf_conntrack_udp_timeout_stream=180
net.netfilter.nf_conntrack_tcp_timeout_syn_recv=60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent=120
net.netfilter.nf_conntrack_tcp_timeout_time_wait=120

然后:

sysctl -w net.netfilter.nf_conntrack_buckets=262144
sysctl -w net.netfilter.nf_conntrack_generic_timeout=600
sysctl -w net.netfilter.nf_conntrack_udp_timeout=30
sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=180
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_recv=60
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_sent=120
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=120

使之生效。
再运行 sysctl -p

以防万一。找个业务低峰期重启一下openwrt,重启速度openwrt硬件有关。我们的硬件为inter 10代i7,30秒左右就重启好了。

经过2天的观察,发现app store已经完全正常, /proc/net/nf_conntrack 文件记录数也从1.6w,涨到了2w看起来确实生效了。收工。