请教 nginx 502 Bad Gateway 错误的问题

2016-05-25 20:31:43 +08:00
 strayberry

查了一下 Nginx 502 Bad Gateway 的含义是请求的 PHP-CGI 已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致 PHP-CGI 进程终止。

FastCGI 配置正确

php-fpm.conf 如下

[global]

pid = /usr/local/php/var/run/php-fpm.pid

error_log = /usr/local/php/var/log/php-fpm.log

log_level = notice

[www]

listen = /tmp/php-cgi.sock

listen.backlog = -1

listen.allowed_clients = 127.0.0.1

listen.owner = www

listen.group = www

listen.mode = 0666

user = www

group = www

pm = dynamic

pm.max_children = 10

pm.start_servers = 2

pm.min_spare_servers = 1

pm.max_spare_servers = 6

request_terminate_timeout = 900

request_slowlog_timeout = 0

slowlog = var/log/slow.log

php-fpm.log 里面无报错

请问可能是哪方面的原因 (lnmp 环境

3248 次点击
所在节点    程序员
12 条回复
strayberry
2016-05-25 20:34:49 +08:00
server {
listen 80;
server_name;
set $root_path ' ';
root $root_path;

index index.php index.html index.htm;

try_files $uri $uri/ @rewrite;

location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}

location ~ \.php {

fastcgi_pass 127.0.0.1:9000;
fastcgi_index /index.php;

fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
root $root_path;
}

location ~ /\.ht {
deny all;
}
}
strayberry
2016-05-25 20:35:31 +08:00
上面为 nginx.conf 的 server 配置
smallpath
2016-05-25 20:51:56 +08:00
502 的原因多了去了, 我遇到最悲惨的一次,是本地 npm install 一个包时没有加--save 参数, 部署时候 require 失败导致 502,足足花了十个小时才排错排出来
haolisand
2016-05-25 20:59:14 +08:00
看看是不访问太多 php-fpm 进程不够用了
moro
2016-05-25 21:09:12 +08:00
502 是服务端错误,你看 php-fpm 日志就可以了。
Balthild
2016-05-25 23:03:58 +08:00
打开 php.ini 中 ERROR_REPORTING
windfarer
2016-05-25 23:09:28 +08:00
nginx 部分配置的问题挺多的,
先把
fastcgi_pass 那句改成 fastcgi_pass unix:/tmp/php-cgi.sock
试一下

参考下这个 https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04
DesignerSkyline
2016-05-25 23:12:55 +08:00
后端出错,检查后端配置是否正常, nginx 可以暂时先不管,因为只要 fastcgi_pass 对应 php 配置一致即可,可以用 127.0.0.1 也可以用 sock
bdbai
2016-05-25 23:16:53 +08:00
@smallpath 配置一下 Node 输出 log 呗
zcrdhm
2016-05-26 08:45:58 +08:00
一看楼上都是没有经验的。
我来告诉楼主。
我猜楼主的配置肯定是 centos6 系列或者是 redhat6 系列,用了 lnmp 结构,但是 PHP 选择了 5.2 系列。
这个问题是 php 版本造成的。直接将 php 升级到 5.4 以上,就完美解决了。
这个问题似乎就是操作系统和 nginx 与 php 版本兼容导致的。只发现在 centos 和 redhat 上出现问题, ubuntu 及其他,暂未发现。
strayberry
2016-05-26 10:32:19 +08:00
已解决

原因是
自己修改过下面 2 处的配置,导致 nginx 配置文件里的设置和 php-fpm 上的设置不一样也会 502 。如果使用 unix 套接字,修改 /usr/local/php/etc/php-fpm.cnf 里设置, php 5.2 为

/tmp/php-cgi.sock
php 5.3 及以上版本为 listen = /tmp/php-cgi.sock ,同时 /usr/local/nginx/conf/nginx.conf 及其 /usr/local/nginx/conf/vhost/ 下面的虚拟主机配置里的 fastcgi_pass unix:/tmp/php-cgi.sock; 不一致就必定 502 。
有时候 unix 套接字模式下可能会 502 ,可以尝试改成 tcp/ip 的方式 php 5.2 下

/tmp/php-cgi.sock
替换为

127.0.0.1:9000
php 5.3 及以上版本 listen = /tmp/php-cgi.sock 替换为 listen = 127.0.0.1:9000 , nginx 配置文件及虚拟主机配置文件里 fastcgi_pass unix:/tmp/php-cgi.sock;替换为 fastcgi_pass 127.0.0.1:9000; 之后重启试试。



参考 https://lnmp.org/faq/lnmp-Nginx-502-Bad-Gateway.html
benteke
2016-05-26 15:38:07 +08:00
这么巧,我昨天在 LNMP 下装 phphub 时也碰到类似问题,看 nginx log ,说的是 php-fpm.sock no such file ,最终是在 V2EX 上搜帖子的时候发现一个妹子说可通过命令重新生成这个文件,还真解决了 502 问题。

TCP/IP sockets 和 UNIX socket 那个好呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/281249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX