我在 AMAZON EC2 上有一个服务器,通过端口 9000 运行 Nginx +PHP 和 PHP FASTCGI。
服务器运行良好几分钟,过了一会儿(在这种情况下有几千次点击)FastCGI 死机并且 Nginx 返回 502 错误。
Nginx 日志显示
2010/01/12 16:49:24 [error] 1093#0: *9965 connect() failed (111: Connection refused) while connecting to upstream, client: 79.180.27.241, server: localhost, request: "GET /data.php?data=7781 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "site1.mysite.com", referrer: "http://www.othersite.com/subc.asp?t=10"
我该如何调试导致 FastCGI 死亡的原因?
答案1
我意识到 OP 现在可能已经离开了,但是如果有人遇到同样的问题,我希望这会有所帮助。
在默认设置中,NGINX 以用户“nobody”的身份运行,而 spawn-fcgi 以用户“root”的身份生成 php-cgi 子进程。因此,NGINX 无法以其当前权限连接到 fastcgi://127.0.0.1:9000。您只需稍微更改 spawn-fcgi 命令即可解决此问题。
spawn-fcgi -a 127.0.0.1 -p 9000 -f /usr/bin/php-cgi -C 5 -U nobody
或者你可以使用 UNIX 套接字(我更喜欢这种方法)
spawn-fcgi -s /var/run/fcgi.sock -f /usr/bin/php-cgi -C 5 -U nobody
并将 nginx.conf 中的 fastcgi_pass 更改为:
...
location ~ \.php$ {
fastcgi_pass unix:/var/run/fcgi.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_$
}
...
答案2
您可以先检查 PHP 死机时在标准错误上打印的内容。如果这不能说明问题,那么将 strace 连接到 PHP 进程并观察它们的工作情况,然后查看它最后所做的工作可能会有所帮助。在功能强大的进程监控框架下运行 FCGI 进程,例如守护进程工具也是一个好主意——这是我在 nginx 下运行所有 PHP 进程的方式。