PHP-FPM和Nginx:502错误网关


78

组态

  • Ubuntu Server 11.10 64位
  • 托管在云上的Amazon AWS Ec2
  • t1.micro实例

在我写其他东西之前,我想说一下,我已经检查了nginx 502错误的网关Nginx + PHP-FPM 502错误的网关线程,不幸的是,这在我这方面没有帮助。

这个问题似乎很常见:nginx或php-fpm的配置错误可能会导致502 Bad Gateway错误,而这是我一直无法解决的问题。请注意,即使我转到我的域root,也没有指定任何特定目录,这还是会出现。

我正在运行Amazon EC2 Web服务器,并启用了端口9000,端口80已打开等。

特别的问题是,如何摆脱这个讨厌的错误?或者,更好的,我怎样才能php5-fpm实际工作

到目前为止我尝试过的

通常对配置文件进行一致的编辑,尤其是php-fpm.confnginx.conf

一世。 php-fpm.conf

我添加了以下内容,但并没有太大帮助:

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

现在,之后我尝试包括配置文件:

include=/etc/php5/fpm/*.conf

这只会把我弄得更糟。

完整配置

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = no

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

iinginx.conf

坦率地说,此配置是我访问过的一些网站的一部分,但是我可以告诉您,在进行502 Bad Gateway业务之前,服务器运行良好(PHP不能正常运行。)。

问题主要在于一个事实,那就是完全错误,非常错误。现在,当我尝试执行a时service php5-fpm restart,它挂在我猜是无限循环之类的东西上,而我什CTRL至无法C摆脱。

完整配置

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 64;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80;
        server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com;

        location ~ ^(.+\.php)(.*)$ {
            root   /home/wayvac/public;
            fastcgi_pass   unix:/var/run/php5-fpm.pid;  
            #fastcgi_pass   127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm.
            fastcgi_index  index.php;
            set $document_root2 $document_root;
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param   SCRIPT_FILENAME $document_root2$fastcgi_script_name;
            fastcgi_param   PATH_INFO   $fastcgi_path_info;
            fastcgi_param   PATH_TRANSLATED $document_root2$fastcgi_path_info;
            include fastcgi_params;
            fastcgi_param  DOCUMENT_ROOT      $document_root2;
        }       

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
            root /home/wayvac/public;   
            index index.html index.htm index.php;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
            # Some basic cache-control for static files to be sent to the browser
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }

        #include drop.conf;
        #include php.conf;
    }
}

Answers:


151

如果有人通过遇到与我相同的问题找到此页面,那么我在这里找到了答案。

对于那些不愿点击并自己解决的人...;)

条件:

带有NGINX和PHP 5.3的Ubuntu或Debian服务器工作正常,但将PHP升级到5.4会出现502 Bad Gateway错误。查找在端口9000上运行的服务(通常正在运行netstat -lp或类似的服务)不会返回任何内容。

解决方法:

打开/etc/php5/fpm/pool.d/www.conf并记下“ listen”参数(以我为例/var/run/php5-fpm.sock):

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

并将虚拟主机中的fastcgi_pass变量替换为刚才记录的位置。

因此,此示例symfony2配置(从此处获取):

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

变成这个:

  # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

然后重新启动nginx:

sudo /etc/init.d/nginx restart

注意:如果您不在SF2上,替换~ ^/(app|app_dev)\.php(/|$) {~ ^/index\.php(/|$) {**

希望这可以节省一些时间:)

编辑

当然,您可以将更listen = /var/run/php5-fpm.sock改为listen = 127.0.0.1:9000/etc/php5/fpm/pool.d/www.conf然后重新启动php5-fpm(这将使您不必更改虚拟主机),但是您必须假定它们将php5-fpm更改为通过套接字运行,而不是在端口9000上侦听原因。

编辑2

如果您仍然遇到502错误,请参阅此答案


2
Unix套接字仅稍快一些,在高负载下可能会失败drupal.org/node/1635622#comment-6814968
Desmond Hume

没有帮助,它已经被设置成这样,而我一直都在经历502。
vsync 2014年

错误的网关仅意味着Nginx找不到PHP。您确定php-fpm服务已安装并正在运行吗?如果它正在运行,则可能是挂起,请尝试重新启动它。
nealio82 2014年

@ Nealio我正在使用运行nginx的ubuntu服务器。您知道我在哪里可以找到该文件# pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock location ~ ^/(app|app_dev)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; }吗?
user111671 2014年

1
他们似乎最近更改了此设置,使其始终使用原始端口号,即127.0.0.1:9000
markyzm 2014年

28

尝试设置这些值,可以解决fast-cgi中的问题

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;

这为我做到了。由于fastcgi错误在nginx日志中被截断,因此很难确定。谢谢!
jrhorn424

1
继续并将其设置为Symfony2.3的64k :) Symfony的错误输出似乎使缓冲区不堪重负……
Stefan

2
@Jusfeel这些选项应该添加到nginx的配置文件中。
biphobe 2014年

多么神奇的解决方案。谢谢
2015年1

我申请了在nginx下安装的Siwapp,效果很好!非常感谢您:)
akajack '16

11

我做了所有这些类似的调整,但有时(每天)我会遇到5​​01/502错误。

这是我在/etc/php5/fpm/pool.d/www.conf上的设置,以避免501和502 nginx错误…服务器具有16Gb RAM。此配置适用于8Gb RAM服务器,因此…

sudo nano /etc/php5/fpm/pool.d/www.conf

然后为

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

更改之后,重新启动php-fpm

sudo service php-fpm restart

4

如果像我这样升级php-fpm后遇到问题,请尝试以下操作:打开/etc/php5/fpm/pool.d/www.conf取消注释以下行:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

然后重新启动php-fpm。


也为我解决了。conf文件/etc/php/php-fpm.d/www/conf在Arch Linux上。请注意,将权限设置0666为可能不适合生产。相反,生产服务器应匹配Nginx用户和PHP-FPM用户,并保留权限0660以提高安全性。
conradkleinespel '16

3

不要忘记这php-fpm是一项服务。安装后,请确保启动它:

# service php-fpm start
# chkconfig php-fpm on

2

对于其他想尽一切办法的人,我尝试按照建议的方式调整超时,因为我不想停止使用Unix套接字...经过大量的故障排除并且没有太多的尝试之后,我发现这是造成此问题的原因通过几个月前我在php-fpm中启用的APC扩展。禁用此扩展程序可以解决间歇性502错误,最简单的方法是注释掉以下行:

;extension = apc.so

这为我成功了!


1

端口已在5.4中更改为9001,只是在nginx conf中将端口从9000更改为9001,并且在php-fpm配置中为我工作。


1

希望这个技巧可以拯救别人的生命。就我而言,问题是我内存不足,但是只有一点点,很难考虑。浪费了3个小时。我建议运行:

sudo htop

要么

sudo free -m

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

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


0

我还发现将json_encoded()数据写入MySQL时可能导致此错误。为了解决这个问题,我使用了base64_encode()JSON。请注意,解码时,JSON编码可以更改值。Nb。24可以变成24.00


0

在尝试了网络上的每个解决方案之后,我最终使用非常简单的方法解决了这个问题,首先我检查了php-fpm err日志

cat /var/log/php5-fpm.log 

最重复的错误是

" WARNING: [pool www] server reached pm.max_children setting (5), consider raising it "

我编辑PHP-fpm池设置

nano /etc/php5/fpm/pool.d/www.conf

我选了这条线

pm.max_children = 5

追求新价值

pm.max_children = 10

顺便说一句,我正在使用128MB ram的低端VPS。正如其他所有人一样,我在考虑重做pm.max_children将使我的服务器更快地运行,从而消耗更少的内存,但是我们使用的设置太低,甚至无法启动PHP-fpm进程。我希望这对其他人有帮助,因为我经过24小时的测试并失败后才发现此问题,但是我的Webhost支持者始终无法解决该问题。


0

您应该看到错误日志。默认情况下,其位置在/var/log/nginx/error.log中

在我的情况下,502之所以获得成功是因为:

GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:28 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"

当我们确切知道哪里出了问题时,请修复它。对于这些错误,只需修改缓冲区:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;

0

我玩这个游戏很晚,但是当我在服务器上升级php时,我的问题就开始了。我能够删除.socket文件并重新启动服务。然后,一切正常。不确定为什么会有所不同,因为文件的大小为0,并且所有权和权限相同,但是可以正常工作。


0

在弄乱Nginx配置之前,请先尝试禁用ChromePHP。

1-打开app / config / config_dev.yml

2-评论这些行:

chromephp:
    type:   chromephp
    level:  info

ChromePHP将调试信息以json编码打包在X-ChromePhp-Data标头中,对于使用fastcgi的nginx的默认配置而言,该信息太大。



0

在您的NGINX vhost文件中,在location ~ \.php$ {通过FastCGI处理PHP文件(通常是)的location块中,请确保您有以下几行:

proxy_buffer_size          128k;
proxy_buffers              4 256k;
proxy_busy_buffers_size    256k;
fastcgi_buffer_size        16k;
fastcgi_buffers            4 16k;

之后,别忘了重新启动fpm和nginx。


额外:

NGINX虚拟主机路径

  • /etc/nginx/sites-enabled/ -Linux
  • '/ usr / local / etc / nginx / sites-enabled /'-Mac

重新启动NGINX:

  • sudo service nginx restart -Linux
  • brew service restart nginx - 苹果电脑

重新启动FPM:

确定fpm进程名称:systemctl list-unit-files | grep fpm--Linux brew services list | grep php--Mac

然后使用以下命令重新启动它:

  • sudo service <service-name> restart -Linux
  • brew services restart <service-name> - 苹果电脑

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.