Php nginx 502坏网关

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,所以我得到了这个错误

当使用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,所以我得到了这个错误


我在任何地方都看不到日志中的任何内容,我没有想法(而且是使用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