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.conflisten = /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个站点配置在nginxphp-fpm conf 文件以使用端口 9003,并且我已经重新启动了这两个服务,但我没有看到 netstat -an | grep 9003 如何在socket或tcp配置之间切换?

以上是关于nginx 502 网关错误的主要内容,如果未能解决你的问题,请参考以下文章

nginx 502 网关错误

EC2 实例 (Nginx) 上的 502 错误网关错误

phpMyAdmin 502 网关错误 [CentOS7, nginx]

nginx 和 SSL:502 错误网关

PHP-FPM 和 Nginx:502 错误网关

nginx 服务于 Django 静态媒体 | 502错误的网关