PHP-FPM和Nginx:502错误的网关

组态

  • Ubuntu服务器11.10 64位
  • 在AWS上托pipe的Amazon AWS,Ec2
  • t1.micro实例

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

这个问题似乎是相当普遍的:configuration错误的nginx或php-fpm可能会导致502 Bad Gateway错误,这是我一直无法摆脱的东西。 请注意, 即使我转到我的域根目录时也会出现这种情况,而不指定任何特定的目录。

我运行的是Amazon EC2networking服务器,启用了端口9000,端口80打开等。

这个问题特别是,我怎样才能摆脱这个肮脏的错误呢? 或者,更好的是,我怎样才能让php5-fpm 实际工作

我迄今为止的尝试

configuration文件的编辑大多是一致的,特别是php-fpm.confnginx.conf

一世。 PHP-fpm.conf

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

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

现在,之后我试着包括我的configuration文件:

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

这只会把我搞得更深。

完整configuration

 ;;;;;;;;;;;;;;;;;;;;; ; 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

诚实地说,这个configuration是我访问过的一些网站的一小部分,但是我可以告诉你,在这个502坏的网关业务之前,服务器运行正常(没有PHP工作时间)。

这个问题主要在于事情非常糟糕,非常错误。 而现在,当我尝试做一个service php5-fpm restart ,它挂在我猜测是一个无限循环或什么,我甚至不能CTRLC出来。

完整configuration

 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; } } 

如果有人通过遇到同样的问题find这个页面,我在这里find答案: http : //www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-lemp -酮的ubuntu-12.04-LTS

对于那些不能自己点击和解决问题的人…;)

条件:

Ubuntu或Debian服务器与NGINX和PHP 5.3工作正常,但升级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 

并用您刚才提到的位置replace您的虚拟主机中的fastcgi_passvariables。

所以这个示例symfony2configuration(取自http://wiki.nginx.org/Symfony ):

  # 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 

注意:replace~ ^/(app|app_dev)\.php(/|$) { ~ ^/index\.php(/|$) {如果你不在SF2上

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

编辑

当然,你可以在/etc/php5/fpm/pool.d/www.conf中将listen = /var/run/php5-fpm.sock改为listen = 127.0.0.1:9000 ,然后重新启动php5-fpm(这会不必改变你的虚拟主机),但是你必须假定他们改变了php5-fpm来运行socket而不是在端口9000上运行。

EDIT2

如果你仍然遇到502错误,请看这个答案: nginx错误连接到php5-fpm.sock失败(13:权限被拒绝)

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

 fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; 

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

这是我在/etc/php5/fpm/pool.d/www.conf中的设置,以避免501和502的nginx错误…服务器有16Gb的RAM。 这个configuration是一个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 

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

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

然后重新启动php-fpm。

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

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

对于任何其他人努力达到这一点,我试图调整超时build议,因为我不想停止使用Unix套接字…经过大量的故障排除,并没有太多继续我发现这个问题正在造成通过几个月前在php-fpm中启用的APC扩展。 禁用这个扩展解决了间歇性的502错误,最简单的方法是通过注释掉以下行:

 ;extension = apc.so 

这为我做了诡计!

在5.4中将端口改为9001,只需将nginx conf中的端口从9000更改为9001,并在php-fpmconfiguration中为我工作。

希望这个技巧会拯救别人的生命。 在我的情况下,问题是我用尽了内存,但只是稍微,很难考虑。 浪费了3小时。 我build议运行:

 sudo htop 

要么

 sudo free -m 

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

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

我也发现这个错误可能会导致写入json_encoded()数据到MySQL。 为了解决它我base64_encode()的JSON。 请不要解码时,JSON编码可以更改值。 铌。 24可以变成24.00

在networking上尝试了所有的解决scheme后,我就结束了使用非常简单的方法解决了这个问题,首先我尝试了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将使我的服务器运行得更快消耗更less的内存,但是我们使用的设置太低,即使启动PHP-fpm进程。 我希望这可以帮助其他人,因为我经过24小时的testing和失败后发现这个问题,我的networking主机支持无法解决这个问题。

你应该看到错误日志。 默认情况下,它的位置在/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的时候开始的。 我能够删除.socket文件并重新启动我的服务。 那么,一切工作。 不知道为什么它有所作为,因为该文件大小为0,所有权和权限是相同的,但它的工作。

在搞乱Nginxconfiguration之前,先尝试先禁用ChromePHP。

1 – 打开app / config / config_dev.yml

2 – 评论这些行:

 chromephp: type: chromephp level: info 

ChromePHP将debugging信息json编码在X-ChromePhp-Data标头中,这对于使用fastcgi的nginx的默认configuration来说太大了。