正常实验
接下来我们通过实验来得到结论
实验思路
对nginx + php 环境的一个大略脚本进行压力测试,压力测试的过程中同时检讨 nginx做事器、php做事器 9000端口的利用情形,得出末了的结论。

实验脚本
test.php
<?phpvar_dump("Hello Word!");?>
压力测试
ab -c 100 -n 10000 http://localhost/test.php
网络监控
在nginx和php做事器上分别实行以下命令,获取网络连接的状态
netstat -anpt | grep :9000
nginx网络连接状态
nginx网络连接状态
PHP网络连接状态
PHP网络连接状态
以上两个图的红框部分为nginx进程与php进程网络通信中利用的nginx做事器的IP和端口,我本地的nginx进程有 1 个、php-fpm进程最大 5 个,如此多的端口足以证明:nginx中fastcgi与php-fpm进程的网络通信为短连接。
TCP主动关闭方与被动关闭方的思考上口试验压力测试的结果为:
正常压力测试结果
红框部分为要求失落败的数量。我们的结果为 0,这个结果表明所有的要求都是正常的,没有发生 502 或 504 的征象。
此时不雅观察上面nginx、php做事器的截图,网络连接状态一栏。
nginx状态为 CLOSE_WAIT、LAST_ACK。表明nginx真个网络连接为TCP被动关闭方。
PHP状态为 TIME_WAIT。表明php真个网络连接为TCP主动关闭方。
非常实验生产环境中我们也偶尔会碰到nginx的网络状态涌现 FIN_WAIT1、FIN_WAIT2 这种主动关闭方的状态;同时PHP的网络状态涌现 CLOSE_WAIT 的这种被动关闭方的状态。我们通过实验来复现一下这个结果。
测试脚本
<?phpvar_dump("Hello Word!");sleep(3);?>
压力测试
ab -c 100 -n 100 http://localhost/test.php
压力测试结果
压力测试结果
上图红框内失落败的要求为 44 个。
网络截图
在nginx和php做事器上分别实行以下命令,获取网络连接的状态
netstat -anpt | grep :9000
nginx网络连接状态
nginx网络连接状态
nginx网络链接涌现主动关闭状态 FIN_WAIT2。
php网络连接状态
php网络连接状态
php网络连接涌现被动关闭状态 CLOSE_WAIT。
缘故原由
当做事器压力过大的时候(以上我们用sleep仿照慢接口),php-fpm处理不过来nginx做事器发送过来的要求。nginx中fastcgi有要求的超时处理机制,fastcgi中的要求如果在等待php-fpm相应的过程中没有在超时前得到结果,就会发送 Fin包 给php-fpm保持的网络要求端,关闭连接,以是这时候nginx做事器上的网络要求就会成为网络连接的主动关闭方,以是涌现 FIN_WAIT2 状态。