h1 背景

CentOS7上布暑了Docker环境,CentOS7 + Docker + supervisord + Python + gunicorn + nginx的环境配置是从一个开源项目抄来的,应该没问题。上一篇记录了,升级Docker的内容,升级完了,重新构建的镜像,问题依然如故,虽然问题没有解决,但是说明一个问题,最起马可以说明问题出在docker上的可能性不大。

问题依然存在,那就得继续想办法找问题,即然有错那就一定有蛛丝马迹可寻。。。

先问一下万能的百度。。。CentOS 连接数限制,我好像抓住了救命的稻草,研究一下:

ulimit -n
1024

果然是1024,然后照着网上的介绍开改。。。

vi /etc/security/limits.conf 
*       soft    nofile  65535  
*       hard    nofile  65535  
*       soft    nproc  65535  
*       hard    nproc  65535
vi /etc/pam.d/login  
session    required     pam_limits.so

重启系统然后查看

ulimit -n
65535

然后再测试,问题依然一样。。。 不死心,接着百度,看看另一篇设置,优化网络的文章,接着改。。

vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

重启,再试问题如故。。。

再查也没找到更多有用的内容,我得抽支烟冷静一下。。。。

一边抽烟,一边琢磨即然执行压测时报502,那服务端也会有错误日志吧,对查日志,我怎么把这个事给忘了。。。

看看日志都写在哪了?看supervisord.conf文件的日志目录,app-gunicorn.log,找到的是应用程充的输出看看有没有异常信息输出来,也好找到点线索,可惜除了打印出来的调试信息之外什么也没有。然后nginx-app中啥信息也没有 ?难到道请求记录都没有吗?可是有的请求是成功的啊,数据库里有保存的数据为证,这难道真的是个假日志文件?

果不其然,/var/log/下还有一个nginx文件夹,error.log文件中,终于找了点上。。

查看nginx日志发现,Cannot assign requested address,这回有线索了,上网一查结果这回总算找到点头绪,原来是端口号不够用了。

继续百度,等我看到了这个内容时,心里顿时又充满了希望的光芒。。。

ss -s
Total: 3130 (kernel 3431)
TCP:   51582 (estab 2866, closed 48611, orphaned 92, synrecv 0, timewait 48611/0), ports 35279

我去,这是别人的数据,我的当时没留下来,就这么说吧,estab特别少,基本上全是closed的。就是说连接都关闭了在等着释放回收,当下没的可用,这下明白了。

接着百度,总算是有了点思路。 直到看到了这个解释时,我心忽然一亮,刚才优化网络的时候改过这个参数啊,难到没有这两项吗?赶紧对比一下,

执行命令修改如下2个内核参数 (需要root权限) sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用 sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收

果然,如它所说,net.ipv4.tcp_tw_recycle=1 虽然有了,但是 net.ipv4.tcp_timestamps=0,按照它说的试一下,更新一下net.ipv4.tcp_timestamps的值,然后看 ss -s 数据立马就有改观,我的心总算是落下了,

清掉数据重新跑,果然没有再出502失败的,nginx也没有再出理错误日志,先跑着明天配置改过来应该就可以了。

记录一下以行后查,说不定哪天就会遇到。