PHP-FPM 和 Nginx:502 错误网关
Posted
技术标签:
【中文标题】PHP-FPM 和 Nginx:502 错误网关【英文标题】:PHP-FPM and Nginx: 502 Bad Gateway 【发布时间】:2012-04-17 17:44:56 【问题描述】:配置
Ubuntu 服务器 11.10 64 位 Amazon AWS,Ec2,托管在云端 t1.micro 实例在我写其他东西之前,我想声明我已经检查了nginx 502 bad gateway 和Nginx + php-FPM 502 Bad Gateway 线程,很遗憾在这方面没有帮助我。
这个问题似乎很常见:nginx 或 php-fpm 的错误配置会导致 502 Bad Gateway
错误,这是我无法摆脱的。请注意,即使我转到我的域根目录,它也会出现,而无需指定任何特定目录。
我正在运行一个 Amazon EC2 网络服务器,启用了端口 9000,打开了端口 80,等等。
特别的问题是,我怎样才能摆脱这个讨厌的错误?或者,更好的是,我怎样才能让php5-fpm
实际工作。
到目前为止我所做的尝试
配置文件的大部分一致编辑,特别是 php-fpm.conf
和 nginx.conf
。
i. 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。 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;
【问题讨论】:
【参考方案1】:也许这个答案会有所帮助:
nginx error connect to php5-fpm.sock failed (13: Permission denied)
解决方案是用 /var/www/php/fpm/pool.d/www.conf 中的 nginx 替换 www-data
并分别修改socket凭据:
$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock
【讨论】:
如果 nginx 错误连接到 php5-fpm.sock failed (13: Permission denied),这是正确的解决方案【参考方案2】:如果有人通过遇到与我相同的问题找到此页面,我找到了答案here。
对于那些懒得点击并自己解决的人... ;)
条件:
带有 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
并将 vhost 中的 fastcgi_pass 变量替换为您刚刚记下的位置。
所以这个示例 symfony2 配置(取自 here):
# 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(/|$)
**
希望这可以节省一些时间:)
编辑
当然,您可以将/etc/php5/fpm/pool.d/www.conf
中的listen = /var/run/php5-fpm.sock
更改为listen = 127.0.0.1:9000
,然后重新启动php5-fpm(这样您就不必更改虚拟主机),但您必须假设他们将php5-fpm 更改为出于某种原因,通过套接字而不是在端口 9000 上进行监听。
编辑2
如果您仍然遇到 502 错误,请参阅此answer。
【讨论】:
Unix 套接字只是稍微快一点,在重负载下可能会失败drupal.org/node/1635622#comment-6814968 没用,已经设置成这样了,一直在经历502。 Bad gateway 只是意味着 Nginx 找不到 PHP。您确定 php-fpm 服务已安装并正在运行吗?如果它正在运行,请尝试重新启动它,也许它正在挂起。 @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;
的文件吗?
他们最近似乎改变了这一点并做到了,所以它总是使用原始端口号,即127.0.0.1:9000
【参考方案3】:
在您的 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 虚拟主机路径
/etc/nginx/sites-enabled/
- Linux
'/usr/local/etc/nginx/sites-enabled/' - 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
【讨论】:
【参考方案4】:在弄乱 Nginx 配置之前,请先尝试禁用 ChromePHP。
1 - 打开 app/config/config_dev.yml
2 - 注释这些行:
chromephp:
type: chromephp
level: info
ChromePHP 将调试信息 json-encoded 打包在 X-ChromePhp-Data 头中,这对于使用 fastcgi 的 nginx 的默认配置来说太大了。
【讨论】:
来源:[1]github.com/symfony/symfony/issues/8413#issuecomment-20412848[2]***.com/a/18250782/2056484【参考方案5】:我玩这个游戏已经很晚了,但是当我在服务器上升级 php 时,我的问题就开始了。我能够删除 .socket 文件并重新启动我的服务。然后,一切正常。不知道为什么会有所不同,因为文件大小为 0,并且所有权和权限相同,但它确实有效。
【讨论】:
【参考方案6】:您应该会看到错误日志。 默认情况下,它的位置在 /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;
【讨论】:
【参考方案7】:好吧,在尝试了网络上的每个解决方案后,我最终使用非常简单的方法解决了问题,首先我检查了 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 小时测试和失败后发现了这个问题,我的虚拟主机支持无法解决这个问题。
【讨论】:
【参考方案8】:我做了所有这些类似的调整,但有时我会遇到 501/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
【讨论】:
【参考方案9】:我还发现将 json_encoded() 数据写入 mysql 时可能会导致此错误。为了解决这个问题,我使用 base64_encode() JSON。请注意,在解码时,JSON 编码会改变值。 NB。 24 可以变成 24.00
【讨论】:
【参考方案10】:对于其他努力了解这一点的人,我尝试按照建议调整超时,因为我不想停止使用 Unix 套接字……经过大量故障排除并且没有太多工作要做后,我发现这个问题是由几个月前我在 php-fpm 中启用的 APC 扩展引起的。禁用此扩展解决了间歇性 502 错误,最简单的方法是注释掉以下行:
;extension = apc.so
这对我有用!
【讨论】:
【参考方案11】:希望这个提示可以挽救他人的生命。就我而言,问题是我的内存不足,但只是轻微地,很难考虑。浪费了3个小时。我建议运行:
sudo htop
或
sudo free -m
...以及在服务器上运行有问题的请求以查看您的内存是否没有用完。如果在我的情况下确实如此,您需要创建交换文件(除非您已经有一个)。
我已按照本教程在 Ubuntu Server 14.04 上创建交换文件,并且效果很好: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
【讨论】:
【参考方案12】:如果你和我一样在升级 php-fpm 后遇到问题,试试这个: 打开 /etc/php5/fpm/pool.d/www.conf 取消注释以下行:
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
然后重启php-fpm。
【讨论】:
也为我解决了这个问题。 Arch Linux 上的 conf 文件是/etc/php/php-fpm.d/www/conf
。请注意,将权限设置为 0666
可能不适合生产。相反,生产服务器应该匹配 Nginx 用户和 PHP-FPM 用户,并保持0660
的权限以提高安全性。【参考方案13】:
不要忘记php-fpm
是一项服务。安装后,确保你启动它:
# service php-fpm start
# chkconfig php-fpm on
【讨论】:
【参考方案14】:端口在 5.4 中更改为 9001,只是在 nginx conf 和 php-fpm 配置中将端口从 9000 更改为 9001 对我有用。
【讨论】:
【参考方案15】:尝试设置这些值,它解决了 fast-cgi 中的问题
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
【讨论】:
这是为我做的。由于 fastcgi 错误在 nginx 日志中被截断,因此很难确定。谢谢! 继续为 Symfony2.3 设置为 64k :) Symfony 的错误输出似乎淹没了缓冲区... @Jusfeel 这些选项应该添加到 nginx 的配置文件中。 多么神奇的解决方案。谢谢 我申请了安装在 nginx 下的 Siwapp,效果很好!非常感谢:)以上是关于PHP-FPM 和 Nginx:502 错误网关的主要内容,如果未能解决你的问题,请参考以下文章