PHP-FPM 和 Nginx: 502 Bad Gateway

配置

  • Ubuntu Server 11.1064位
  • Amazon AWS,Ec2,托管在云上
  • 微实例

在编写其他内容之前,我想声明,我已经检查了 Nginx 502坏网关Nginx + PHP-FPM 502糟糕的网关线程,不幸的是,它们在这方面没有帮助到我。

这个问题似乎相当普遍: nginx 或 php-fpm 的错误配置可能导致 502 Bad Gateway错误,这是我无法摆脱的。请注意,这将显示 甚至当我进入我的域根目录时,而不指定任何特定的目录。

我正在运行一个 AmazonEC2网络服务器,启用了端口9000,打开了端口80,等等。

特别的问题是,我怎样才能摆脱这个讨厌的错误?或者,更好的是,我怎样才能让 php5-fpm真的有用

到目前为止我所做的努力

主要是对配置文件进行一致的编辑,特别是 php-fpm.confnginx.conf

I. < em > 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

Ii . < em > nginx.conf

老实说,这个配置只是我访问过的少数几个网站中的一小部分,但是我可以告诉你,在这个502 Bad Gateway 业务之前,服务器运行良好(没有 PHP 工作)。句号).

问题主要在于事实上有些事情是非常非常错误的。现在,当我尝试做一个 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;
}
}
172045 次浏览

尝试设置这些值,它在 fast-cgi 中解决了问题

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;

如果有人发现这个页面遇到了同样的问题,我找到了答案 给你

对于那些懒得点击并自己解决问题的人来说... ;)

条件:

使用 NGINX 和 PHP 5.3的 Ubuntu 或 Debian 服务器运行良好,但是将 PHP 升级到5.4会出现502个糟糕网关错误。查找在端口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

并将 vhost 中的 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 * * ,则用 ~ ^/index\.php(/|$) {替换 ~ ^/(app|app_dev)\.php(/|$) {

希望这能节省一些人的时间:)

剪辑

当然,您可以在 /etc/php5/fpm/pool.d/www.conf中将 listen = /var/run/php5-fpm.sock更改为 listen = 127.0.0.1:9000,然后重新启动 php5-fpm (这将节省您更改 vhosts 的时间) ,但是您必须假定他们将 php5-fpm 更改为通过套接字运行,而不是出于某种原因监听端口9000。

编辑2

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

在5.4版本中将端口更改为9001,只需在 nginx conf 和 php-fpm 配置中将端口从9000更改为9001即可。

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

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

如果你像我一样在升级 php-fpm 之后遇到了问题,试试这个: Open/etc/php5/fpm/pool. d/www.conf 取消对下列内容的评论:

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

然后重新启动 php-fpm。

希望这条建议能救别人的命。在我的情况下,问题是我的内存不足,但只是轻微的,很难去想它。浪费了三个小时。我建议跑步:

sudo htop

或者

sudo free -m

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

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

对于那些还在纠结这个问题的人,我试着按照建议调整超时,因为我不想停止使用 Unix 套接字... ... 经过大量的故障排除,我发现这个问题是由几个月前我在 php-fpm 中启用的 APC 扩展引起的。禁用这个扩展可以解决间歇性的502错误,最简单的方法是注释以下代码行:

;extension = apc.so

这招对我很管用!

我还发现这个错误可能是在向 MySQL 写入 json _ coding ()数据时引起的。为了解决这个问题,我对 JSON 进行 base64 _ encode ()编码。请不要在解码时改变 JSON 编码的值。NB.24可以变成24

我做了所有这些类似的调整,但是有时候我会得到501/502的错误(每天)。

这是我对 /etc/php5/fpm/pool. d/www.conf的设置,以避免501和502 nginx 错误..。 服务器有16Gb 内存。这个配置是为8Gb 内存服务器所以..。

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

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

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 内存的低端 VPS 和其他人一样,我认为重新使用 pm.max_children会让我的服务器运行得更快,消耗更少的内存,但是我们使用的设置太低,甚至不能启动 PHP-fpm 进程。 我希望这有助于其他人,因为我发现这经过24小时的测试和失败,曾经我的网站主机支持不能解决这个问题。

您应该会看到错误日志。 默认情况下,它的位置是/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;

我对这个游戏已经很晚了,但是我的问题开始于我在服务器上升级了 php。我可以移除。套接字文件,并重新启动我的服务。然后,一切都成功了。不知道为什么会有不同,因为文件大小是0,所有权和权限是相同的,但它工作。

在扰乱 Nginx 配置之前,首先尝试禁用 ChromePHP。

1-打开 app/config/config _ dev. yml

2-评论这些句子:

chromephp:
type:   chromephp
level:  info

ChromePHP 将调试信息 json 编码在 X-ChromePhp-Data 头中,这对于 nginx 与 fastcgi 的默认配置来说太大了。

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

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

之后,不要忘记重新启动 fpm 和 nginx。


附加:

NGINX vhost 路径

  • /etc/nginx/sites-enabled/-Linux
  • ’/usr/local/etc/nginx/sites- 启用/’-Mac

重启 NGINX:

  • sudo service nginx restart-Linux
  • brew service restart nginx-Mac

重新启动 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>-Mac

也许这个答案会有所帮助:

Nginx 错误连接到 php5-fpm. sock 失败(13: 拒绝权限)

解决方案是在/var/www/php/fpm/pool.d/www.conf 中用 nginx 替换 www-data

并分别修改套接字凭据:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock