我在高流量站点上使用 php-fpm 运行 nginx。我让 nginx 通过 tcp/ip 与 php-fpm 通信,nginx 和 php-fpm 池都在同一台服务器上运行。
当我使用 tcp/ip 让 nginx 和 php-fpm 池相互通信时,页面加载需要几(5-10)秒才能完成任何操作,当它最终开始时,它不需要时间一切都是为了完成加载。由于 php-fpm 的 statuspage 显示listen backlog 已满,我假设处理请求需要一些时间。Netstat 在 TIME_WAIT 状态下显示了很多(20k+)个连接,不知道这是否相关,但似乎相关。
当我尝试让 nginx 和 php-fpm 通过 UNIX 套接字进行通信时,页面实际加载之前的时间减少到几乎没有,完成页面在我的浏览器中之前的时间减少了 1000 倍。UNIX 套接字的唯一问题是它在日志中给了我很多错误:
*3377 connect() to unix:/dev/shm/.php-fpm1.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 122.173.178.150, server: nottherealserver.fake, request: "GET somerandomphpfile HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/.php-fpm1.sock:", host: "nottherealserver.fake", referrer: "nottherealserver.fake"
我的两个问题是:
有人知道为什么 tcp/ip 方法在实际上似乎连接到 php-fpm 后端之前要等待这么长时间吗?
为什么在使用它而不是 tcp/ip 时 UNIX 套接字会导致问题?
我尝试了什么:
尝试减少 TIME_WAIT 连接数时设置net.ipv4.tcp_tw_recycle
为net.ipv4.tcp_tw_reuse
1(从 30k+ 下降到 20k+)
将net.core.somaxconn
值从默认的 128 增加到 1024(也尝试了更高的值,但在使用 UNIX 套接字时仍然出现相同的错误)
增加了打开文件的最大数量
可能也很相关:尝试使用 lighttpd + fastcgi,在连接最终得到处理之前很长一段时间也有同样的问题。MySQL 不是太忙,不应该是等待时间长的原因。磁盘等待时间为 0%(SSD 磁盘),因此繁忙的磁盘似乎也不是罪魁祸首。
希望有人找到解决此问题的方法,并愿意分享:)