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,只在特殊情况下失败。