Php nginx 502坏网关
当使用spawn fcgi生成php5 cgi时,我使用nginx得到一个502坏网关 我使用它来跨越服务器上的一个实例,并使用rc.local中的以下行开始Php nginx 502坏网关,php,nginx,fastcgi,Php,Nginx,Fastcgi,当使用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死了,没有任何东西再监听它来解析php,所以我得到了这个错误
/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进行此设置的新手)出现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?
这里有类似的设置,看起来它只是我代码中的一个bug。在我的应用程序开始时,我查找了有问题的URL,结果成功了:
echo'test';退出()代码>
在我的例子中,问题是一个未初始化的变量,只有在特殊情况下才会失败 如果运行linux服务器,请确保IPTABLES配置正确
执行sudo iptables-L-n
,您将收到打开端口的列表。如果没有Iptables规则来打开为fcgi脚本服务的端口,您将收到502错误。打开正确端口的Iptables规则必须列在分类拒绝所有数据包的任何规则之前(即,形式为“拒绝所有--0.0.0.0/0.0.0.0/0拒绝,icmp端口不可访问”
或类似规则)
在我的配置中,为了正确打开端口,我必须执行此命令(假设我的fcgi服务器在端口4567上运行):
警告:这将向全世界开放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错误。当我执行
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
需要知道Web服务器运行的用户身份,并假设它是apache,而对于nginx,它实际上是nginx,需要更改。我执行了我的本地主机
,页面显示了502坏网关
消息。这对我有帮助:
编辑/etc/php5/fpm/pool.d/www.conf
将listen=/var/run/php5 fpm.sock
更改为listen=127.0.0.1:9000
确保位置正确
运行sudo服务php5 fpm重启
也许对你有帮助
来源:您可以使用以下命令使nginx忽略客户端中止:
location / {
proxy_ignore_client_abort on;
}
改变
到
转到/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;
}
匹配这些值,您应该都设置好了。尝试禁用xcache或apc模块。在将对象保存到会话变量的某些版本中,这似乎会导致问题。希望此提示可以挽救其他人的生命。在我的情况下,问题是我的内存不足,但只是稍微有些不足,很难考虑。浪费了3小时我建议你跑步:
sudo htop
或
…同时在服务器上运行有问题的请求,以查看内存是否用完。如果与我的情况类似,则需要创建交换文件(除非您已经有了交换文件)
我按照本教程在Ubuntu服务器14.04上创建了交换文件,效果很好:
我在安装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
如果你使用的是Ubuntu,而上面所有的一切都让你失望了,那么AppArmor很可能会责怪你
下面是一个很好的修复指南:
长话短说:
vi /etc/apparmor.d/nginx
或
看到一切都很顺利…然后呢
sudo aa-logprof
尽管Nginx拥有所有可能的权限,包括在Apparomor中的权限,但我仍然无法读取error.log。我猜这与条目的顺序有关,或者与Passenger或PHP Fpm进行了一些交互……我已经没有时间进行故障排除,现在已经回到Apache。(仅供参考,Apache的性能也要好得多。)
AppArmor只是让Nginx做它想做的任何事情,如果您只是删除配置文件:
rm /etc/apparmor.d/nginx
service apparmor reload
令人震惊但并不奇怪的是,很多关于修复Nginx错误的帖子都求助于完全禁用SELinux或删除AppArmor。这是个坏主意,因为你会失去很多软件的保护。删除Nginx配置文件是解决配置文件故障的更好方法。一旦你知道问题不在你的Nginx c中onfig文件,您可以花时间创建适当的AppArmor配置文件
如果没有AppArmor配置文件,特别是如果您也运行类似于Passenger的程序,我会给您的服务器一个月的时间进行后门操作。对于我来说,错误出现在默认文件Nginx
位于/etc/nginx/sites available/default
我注意到使用的php fpm版本是7.0,我下载的php版本是7.2
我只是把版本改成了7.2,它就可以工作了
fastcgi\u pass unix:/var/run/php/php7.0-fpm.sock;首先,不要放弃!nginx是一款很棒的软件。尝试使用php-fpm。不要错过包含设置的/etc/php5/fpm
目录,并注意可能覆盖的php.ini副本
sudo chmod go+rw /var/run/php5-fpm.sock
vi /etc/apparmor.d/nginx
sudo aa-complain nginx
sudo service nginx restart
sudo aa-logprof
rm /etc/apparmor.d/nginx
service apparmor reload