【问题标题】:nginx 502 bad gatewaynginx 502 网关错误
【发布时间】: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

标签: php nginx fastcgi


【解决方案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 消息。这对我有帮助:

    1. 编辑/etc/php5/fpm/pool.d/www.conf
    2. listen = /var/run/php5-fpm.sock 更改为listen = 127.0.0.1:9000
    3. 确保位置是set properly in nginx.conf
    4. 运行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配置之间切换?
                      猜你喜欢
                      • 2019-06-05
                      • 2015-08-10
                      • 2021-11-19
                      • 2012-09-25
                      • 2014-12-07
                      • 2020-09-29
                      • 2012-07-16
                      • 2015-04-30
                      • 2020-10-10
                      相关资源
                      最近更新 更多