问题
最近上线了一台之前的服务器拿来做php,然后把php的版本,拓展包全部和线上的版本保持了一致,为了以防万一把nginx的和php的配置文件,以及版本也全部高度一致,文件描述符和进程数也调整到了565535和10240,结果还是出了问题,请求略微多一些的时候很多php报错日志:
[22-Oct-2018 07:01:54 Asia/Shanghai] PHP Fatal error: Uncaught RedisException: Connection closed in /data/wwwroot/www.test.com/config/config.ini.php:3
[22-Oct-2018 07:01:58 Asia/Shanghai] Db Error: database connect failed. error info :Connection timed out. db config:array (等
分析
1、首次怀疑是php拓展包的原因,因为之前也有拓展包和软件版本不兼容的情况也是这个报错。于是2、对比phpinfo信息,各个拓展的版本,以及配置文件,发现完全一致。
3、接下来怀疑是类和参数,cat /etc/sysctl.conf进行对比,发现一致。
4、然后不死心的重新安装了所有拓展包!问题依旧存在。
5、然后开始怀疑是不上tcp端口数不够用。于是开始用ss进程每分钟检测,发现完全够用
6、之后没有办法了,去查系统日志message,终于在相同的时间点发现问题:kernel: nf_conntrack: table full, dropping packet.很多这个报错,终于找到了,查了下发现是内核参数net.nf_conntrack_max设置太小的问题。
原因
服务器访问量大,内核netfilter模块conntrack相关参数配置不合理,导致新连接被drop掉。防火墙相关的参数
解决
修改内核配置:vim /etc/sysctl.conf
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
使它生效sysctl -p,目前持续观察中
总结
检查内核的时候可能不是每个内核参数都有配置,对比的时候可以sysctl -a,以及多查看系统日志,有时候就是能发现原因。
网友评论