nginx 502坏网关

时间:2010-11-23 03:01:40

标签: php nginx fastcgi

当使用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对此设置不熟悉)

14 个答案:

答案 0 :(得分:51)

我执行了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
  5. 也许它会帮助你。

    来自:http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm

答案 1 :(得分:9)

出现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? 

答案 2 :(得分: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所有者和组名。

答案 3 :(得分:8)

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

匹配这些值,您应该全部设置。

答案 4 :(得分:5)

如果运行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错误。

答案 5 :(得分:4)

变化

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

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

答案 6 :(得分: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需要知道网络服务器正在运行的用户,并假设它是apache,对于nginx,它实际上是nginx,需要更改。

答案 7 :(得分:2)

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

location / {
  proxy_ignore_client_abort on;
}

答案 8 :(得分:2)

设置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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

sudo htop

sudo free -m

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

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

答案 11 :(得分:1)

如果您使用的是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这样的东西,我会给你的服务器大约一个月的时间来获得后门服务。

答案 12 :(得分: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;

答案 13 :(得分:0)

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

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