nginx 502坏的网关

当使用spawn fcgi产生php5-cgi时,我得到了一个带有nginx的502错误网关。

我用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死亡,没有什么在那里听parsingPHP。

我在任何地方都看不到任何东西,我没有任何想法(对于nginx来说,这个设置是新的)

我遇到了同样的问题。 我执行我的localhost和页面显示502 bad gateway消息。 这帮助了我:

进入/etc/php5/fpm/pool.d/www.conf ,编辑listen = /var/run/php5-fpm.sock listen = 127.0.0.1:9000

也许它会帮助你。

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

出现502错误是因为nginx无法切换到php5-cgi。 您可以尝试重新configurationphp5-cgi以使用unix套接字而不是tcp。然后调整服务器configuration以指向套接字而不是tcp …

 ps auxww | grep php5-cgi #-- is the process running? netstat -an | grep 9000 # is the port open? 

转到/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所有者和组名。

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

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

如果运行一个linux服务器,确保你的IPTABLESconfiguration是正确的。

执行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或“类似)

在我的configuration中,要正确地打开端口,我必须执行这个命令(假设我的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错误。

更改

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

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

当我做了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需要知道用户,networking服务器正在运行,并假设它是Apache,而对于Nginx,它实际上是Nginx,并需要改变。

你可以让nginx忽略客户端中止使用:

 location / { proxy_ignore_client_abort on; } 

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

希望这个技巧会拯救别人的生命。 在我的情况下,问题是我用尽了内存,但只是稍微,很难考虑。 浪费了3小时。 我build议运行:

 sudo htop 

要么

 sudo free -m 

…在服务器上运行有问题的请求,看看你的内存是否没有用完。 如果它像我的情况,你需要创build一个交换文件(除非你已经有一个)。

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

我在设置Ubuntu服务器时遇到同样的问题。 事实certificate,由于套接字文件的权限不正确,我遇到了问题。

如果由于权限问题而遇到问题,可以从/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 

如果你在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的问题,尽pipe它拥有所有权限,包括Apparomor。 我猜测这和条目的顺序有关,或者与Passenger或者PHP-Fpm进行一些交互……我已经没时间解决这个问题了,现在已经回到Apache了。 (Apache的性能也好多了。)

如果你只是删除configuration文件,AppArmor只是让Nginx做任何事情:

  rm /etc/apparmor.d/nginx service apparmor reload 

令人惊讶的是,很多关于修复Nginx错误的post都意味着完全禁用SELinux或删除AppArmor。 这是一个坏主意,因为你失去了一大堆软件的保护。 只是删除Nginxconfiguration文件是一个更好的方法来解决你的configuration文件。 一旦您知道问题不在您的Nginxconfiguration文件中,您可以花时间创build适当的AppArmorconfiguration文件。

如果没有AppArmorconfiguration文件,特别是如果您运行类似Passenger的服务器,我也会给您的服务器一个月左右的时间。

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

在我的情况下,原来的问题是一个未初始化的variables,只在特殊情况下失败。