nginx 502 网关错误
Posted
技术标签:
【中文标题】nginx 502 网关错误【英文标题】:nginx 502 bad gateway 【发布时间】:2011-05-14 05:38:05 【问题描述】:使用 spawn fcgi 生成 php5-cgi 时,我得到一个 502 Bad Gateway with nginx。
我使用它来跨越服务器上的一个实例,使用 rc.local 中的以下行开始
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
大概我收到错误是因为 spawn-fcgi / php5-cgi 死掉了,那里没有任何东西可以解析 php。
我在任何地方都可以看到的日志中没有得到任何东西,我没有想法(并且是使用 nginx 设置的新手)
【问题讨论】:
首先,不要放弃! nginx 是一个很棒的软件。尝试使用 php-fpm。不要错过带有设置的/etc/php5/fpm
目录,并注意 php.ini 的副本,它可能会覆盖您自己的 php.ini 配置...配置日志,以便在失败时查看。
尝试以 root 身份登录服务器并在命令提示符中键入 /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
。 (这与您的 rc.local 中的行相同。)您是否收到任何错误消息?
我相信这个问题在serverfault.com 上会更合适(并获得更多答案)。
感谢 netcoder,这是个好主意。我会把它移到那里。
这有什么线索吗? tail /var/log/nginx/error.log
【参考方案1】:
对我来说,错误出现在 Nginx 的默认文件中 位于 /etc/nginx/sites-available/default
我注意到使用的php-fpm版本是7.0,我下载的php版本是7.2 我只是将版本更改为 7.2,它就可以工作了。
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
【讨论】:
【参考方案2】:我执行了我的localhost
,页面显示了502 bad gateway
消息。这对我有帮助:
-
编辑
/etc/php5/fpm/pool.d/www.conf
将listen = /var/run/php5-fpm.sock
更改为listen = 127.0.0.1:9000
确保位置是set properly in nginx.conf。
运行sudo service php5-fpm restart
也许对你有帮助。
来源:http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
【讨论】:
如文章所说,之后运行sudo service php5-fpm restart
。
在不同的情况下exactly 相同的操作可能会有所帮助,这很有趣。
对于任何试图使用 nginx 进行 phabricator 设置的人来说,这就是诀窍!
sudo service php5-fpm restart ------ 谢谢
第 1 点,帮助我找到了正确的 fpm 版本,我正在尝试使用 php7.0-fpm.sock
,但在我的情况下实际上是 php7.2-fpm.sock
,因为版本是 7.2 而不是 7.0,我忽略了这一点nginx 默认安装在评论中列出了这个版本,我认为 nginx 一定是从我安装的 php 版本中配置的,叹息!【参考方案3】:
如果您使用的是 Ubuntu,并且上述所有操作都让您失望了,那么 AppArmor 很可能是罪魁祸首。
这里有一个很好的解决方法:https://www.digitalocean.com/community/tutorials/how-to-create-an-apparmor-profile-for-nginx-on-ubuntu-14-04
长话短说:
vi /etc/apparmor.d/nginx
或者
sudo aa-complain nginx
sudo service nginx restart
看到一切正常......然后
sudo aa-logprof
我仍然遇到 Nginx 无法读取 error.log 的问题,即使它拥有所有可能的权限,包括在 Apparomor 中。我猜这与条目的顺序有关,或者与Passenger 或PHP-Fpm 的一些交互...我已经没有时间解决这个问题,现在已经回到Apache。 (Apache 的性能也更好,仅供参考。)
如果您删除配置文件,AppArmor 只会让 Nginx 为所欲为:
rm /etc/apparmor.d/nginx
service apparmor reload
令人震惊但并不令人惊讶的是,许多关于修复 Nginx 错误的帖子都求助于完全禁用 SELinux 或删除 AppArmor。这是一个坏主意,因为您会失去对大量软件的保护。仅删除 Nginx 配置文件是对配置文件进行故障排除的更好方法。一旦您知道问题不在您的 Nginx 配置文件中,您就可以花时间创建适当的 AppArmor 配置文件。
如果没有 AppArmor 配置文件,特别是如果您也运行像乘客这样的东西,我会给您的服务器大约一个月的时间来获得后门。
【讨论】:
【参考方案4】:我在设置 Ubuntu 服务器时遇到了同样的问题。原来我遇到了问题,因为套接字文件的权限不正确。
如果您因权限问题而遇到问题,您可以取消注释以下行:/etc/php5/fpm/pool.d/www.conf
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
或者,虽然我不推荐,但您可以使用以下命令为所有组授予读写权限。
sudo chmod go+rw /var/run/php5-fpm.sock
【讨论】:
【参考方案5】:您必须匹配 PHP-FPM 和 Nginx 的设置才能通过套接字或 TCP 进行通信。
所以转到/etc/php5/fpm/pool.d/www.conf
并查找此行:
listen = /var/run/php5-fpm.sock
那就去/etc/nginx/nginx.conf
寻找这个:
upstream php
server unix:/var/run/php5-fpm.socket;
匹配这些值,你就应该准备好了。
【讨论】:
是的,我在尝试启动 Silex 应用程序时遇到了类似的问题。文档建议使用路径“/var/run/php-fpm/www.sock”配置 vhost,但在我的 php-fpm 配置中它被设置为监听“/var/run/php5-fpm.sock”,所以我有也为虚拟主机配置设置相同的值。【参考方案6】:希望这个提示可以挽救他人的生命。就我而言,问题是我的内存不足,但只是轻微地,很难考虑。浪费了3个小时。我建议运行:
sudo htop
或
sudo free -m
...以及在服务器上运行有问题的请求以查看您的内存是否没有用完。如果在我的情况下确实如此,您需要创建一个交换文件(除非您已经有一个)。
我已按照本教程在 Ubuntu Server 14.04 上创建交换文件,并且效果很好: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
【讨论】:
【参考方案7】:尝试禁用 xcache 或 apc 模块。似乎导致某些版本的问题是将对象保存到会话变量。
【讨论】:
【参考方案8】:转到/etc/php5/fpm/pool.d/www.conf
,如果您正在使用套接字或此行未注释
listen = /var/run/php5-fpm.sock
也设置几个其他值:-
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
别忘了重启 php-fpm 和 nginx。确保您使用相同的 nginx 所有者和组名。
【讨论】:
【参考方案9】:改变
fastcgi_pass unix:/var/run/php-fpm.sock;
到
fastcgi_pass unix:/var/run/php5-fpm.sock;
【讨论】:
【参考方案10】:您可以使用以下方法使 nginx 忽略客户端中止:
location /
proxy_ignore_client_abort on;
【讨论】:
我很好奇,想了解您的回答,因为它可能与我遇到的问题有关(根据 502 网关) - 什么是“客户端中止”?我的意思是,你所指的“客户端”是什么,php? 嘿@stefgosselin,我的(有限的)理解是proxy_ignore_client_abort on
导致nginx 跟踪每个连接(连接到nginx 的任何人都是“客户端”)并监视它是否在没有发送请求的情况下关闭.这是客户的“不正确行为”,但有些人还是这样做了。【参考方案11】:
当我执行sudo /etc/init.d/php-fpm start
时,出现以下错误:
Starting php-fpm: [28-Mar-2013 16:18:16] ERROR: [pool www] cannot get uid for user 'apache'
我猜/etc/php-fpm.d/www.conf
需要知道网络服务器正在运行的用户,并假设它是 apache,而对于 nginx,它实际上是 nginx,需要更改。
【讨论】:
【参考方案12】:如果运行的是 linux 服务器,请确保您的 IPTABLES 配置正确。
执行 sudo iptables -L -n
,您将收到您的开放端口列表。如果没有 Iptables 规则来打开为 fcgi 脚本服务的端口,您将收到 502 错误。打开正确端口的 Iptables 规则必须列在之前任何明确拒绝所有数据包的规则(即"REJECT ALL -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
或类似形式的规则)
在我的配置中,要正确打开端口,我必须执行此命令(假设我的 fcgi 服务器在端口 4567 上运行):
sudo iptables -I INPUT 1 -p tcp --dport 4567 -j ACCEPT
警告:这将向全世界开放 4567 端口。
所以这样做可能会更好:
sudo iptables-save >> backup.iptables
sudo iptables -D INPUT 1 #Delete the previously entered rule
sudo iptables -I INPUT 1 -p tcp --dport 8080 -s localhost -j ACCEPT # Add new rule
这样做为我消除了 502 错误。
【讨论】:
【参考方案13】:类似的设置在这里看起来只是我的代码中的一个错误。在我的应用程序开始时,我查找了有问题的 URL,这很有效:echo '<html>test</html>'; exit();
在我的例子中,问题是一个未初始化的变量,它只在特殊情况下失败。
【讨论】:
【参考方案14】:出现 502 错误是因为 nginx 无法切换到 php5-cgi。您可以尝试重新配置 php5-cgi 以使用 unix 套接字而不是 tcp .. 然后调整服务器配置以指向套接字而不是 tcp ...
ps auxww | grep php5-cgi #-- is the process running?
netstat -an | grep 9000 # is the port open?
【讨论】:
端口不开放是什么流程? 在我的情况下,服务已启动,但netstat -an | grep 9000
????的结果中没有任何内容
您将其配置为在哪个端口上运行? 9000 基于上面的命令行参数 (-p 9000)
我和@shgnInc有同样的问题,我有4个站点,前3个在9000 - 9002上运行,但第4个站点配置在nginx和php-fpm conf 文件以使用端口 9003,并且我已经重新启动了这两个服务,但我没有看到 netstat -an | grep 9003
如何在socket或tcp配置之间切换?以上是关于nginx 502 网关错误的主要内容,如果未能解决你的问题,请参考以下文章