最近要使用docker部署nginx和php-fpm服务,因为以前部署过无数次的nginx+php-fpm,本以为轻车熟路,很快搞定,但是在这个最熟的环节却出了问题,耗费了小半天的时间,特把解决问题的过程记录如下:(使用docker 部署 nginx,php-fpm的具体步骤网上较多,不再此进行详述了)
遇到的问题。
问题:docker 部署完成 nginx,php-fpm后,运行服务,出现:recv() failed (104: Connection reset by peer) while reading response header from upstream
解决历程:
- 百度后,提示php-fpm默认监听的是127.0.0.1:9000,如果要提供对外服务,需要修改为:listen = 0.0.0.0:9000或者listen=9000,但是修改后问题依旧。
- 再次查找,提示可能是php-fpm进程过少,但是不符合错误出现的现象。
多次修改修改无果后,开始自己查找此错误:
-
telnet 172.17.0.2 9000 出现:
证明php-fpm服务已经启动了,但是未知原因php-fpm把链接中断了。怀疑是底层tcp链接问题,使用netstat -s | grep reject,未发现异常链接。想不出啥原因,查看php-fpm error.log未发现有用信息
-
突然想起,php-fpm一样有工作进程,工作进程的日志貌似默认并没有打印,找到catch_workers_output 选项打开注释,再次访问php页面,这时,错误日志里出现:
问题终于找到了,php-fpm默认只允许127.0.0.1的服务进行访问,以前部署nginx,php-fpm时因为同时部署在一台机器上所以未出现过此问题,而这次nginx和php-fpm是分开部署在docker container中的,所以出现了问题,知道了原因,解决问题就好办了,找到listen.allowed_clients,注释掉(默认为任意IP),运行 php测试页面,搞定