首页 文章

nginx 502坏网关

提问于
浏览
56

当使用spawn fcgi生成php5-cgi时,我得到了一个带有nginx的502 Bad Gateway .

我使用它来跨越服务器启动的实例,使用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的新设置一样)

13 回答

  • 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

  • 7

    出现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?
    
  • 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所有者和组名 .

  • 1

    您必须匹配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;
    }
    

    匹配这些值,你应该全部设置 .

  • 2

    如果运行Linux服务器,请确保您的IPTABLES配置正确 .

    执行 sudo iptables -L -n ,您将收到您的开放端口列表 . 如果没有Iptables规则来打开服务于fcgi脚本的端口,您将收到502错误 . 必须在任何明确拒绝所有数据包的规则(即 "REJECT ALL -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 或类似形式的规则)之前列出打开正确端口的Iptables规则

    在我的配置上,要正确打开端口,我必须执行此命令(假设我的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错误 .

  • 1

    更改

    fastcgi_pass    unix:/var/run/php-fpm.sock;
    

    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    
  • 2

    当我做 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 需要知道网络服务器正在运行的用户,并假设它实际上是nginx,并且需要进行更改 .

  • 48

    您可以使用以下命令使nginx忽略客户端中止:

    location / {
      proxy_ignore_client_abort on;
    }
    
  • 9

    我在设置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
    
  • 0

    尝试禁用xcache或apc模块 . 似乎导致某些版本的问题是将对象保存到会话变量 .

  • 1

    希望这个提示可以拯救别人的生命 . 在我的情况下,问题是我的内存不足,但只是轻微,很难想到它 . 浪费了3个小时 . 我建议跑步:

    sudo htop
    

    要么

    sudo free -m
    

    ...以及在服务器上运行有问题的请求,看看你的内存是否没用完 . 如果在我的情况下确实如此,则需要创建一个交换文件(除非您已经有一个) .

    我已经按照本教程在Ubuntu Server 14.04上创建交换文件,它工作得很好:http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

  • 5

    如果您使用的是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配置文件,特别是如果你也运行像Passenger这样的东西,我会给你的服务器大约一个月的时间来获得后门服务 .

  • 4

    类似的设置在这里,看起来它只是我的代码中的一个错误 . 在我的应用程序开始时,我查找了有问题的URL,这有效: echo '<html>test</html>'; exit();

    在我的情况下,事实证明问题是一个未初始化的变量,只有在特殊情况下才会失败 .

相关问题