PHP-FPM и Nginx: 502 плохих шлюза
Конфигурация
- Сервер Ubuntu 11.10 64-разрядный
- Amazon AWS, Ec2, размещенный в облаке
- экземпляр t1.micro
Прежде чем я напишу что-нибудь еще, я хотел бы заявить, что я проверил оба потока nginx 502 плохой шлюз и Nginx +PHP-FPM 502 Плохой шлюз , которые, к сожалению, не помогли мне в этом отношении.
Проблема, по-видимому, довольно распространена: неправильная конфигурация nginx или php-fpm может приводит к ошибке 502 Bad Gateway
, от которой я не смог избавиться. Обратите внимание, что это отображается , даже когда я перехожу в корневой каталог своего домена, не указывая какой-либо конкретный каталог.
Я запускаю веб-сервер Amazon EC2 с включенным портом 9000, открытым портом 80 и т. Д.
В частности, вопрос заключается в том, как я могу избавиться от этой неприятной ошибки? Или, еще лучше, как я могу заставить php5-fpm
действительно работать.
То, Что Я Пытался сделать так Далеко
В основном последовательное редактирование файлов конфигурации, в частности php-fpm.conf
и nginx.conf
.
I. php-fpm.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
Ii.. файл nginx.conf
В честно говоря, эта конфигурация представляет собой небольшое количество веб-сайтов, которые я посетил, но я могу сказать вам, что до этого дела с 502 плохими шлюзами сервер работал нормально (без работы 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;
}
}
14 answers
Если кто-нибудь найдет эту страницу, столкнувшись с той же проблемой, что и я, я нашел ответ здесь: http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-lemp-on-ubuntu-12.04-lts
Для тех из вас, кто не может побеспокоиться нажать и решить это для себя...;)
Условие:
Сервер Ubuntu или Debian с NGINX и PHP 5.3 работает нормально, но обновление PHP до 5.4 приводит к 502 ошибкам шлюза. Глядя для служб, работающих на порту 9000 (обычно работающих под управлением netstat -lp
или аналогичных), ничего не возвращает.
Исправление:
Откройте /etc/php5/fpm/pool.d/www.conf
и запишите параметр "слушать" (в моем случае /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 в вашем vhost на местоположение, которое вы только что отметили.
Итак, этот пример конфигурации symfony2 (взят отсюда: 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
Примечание: замените ~ ^/(app|app_dev)\.php(/|$) {
на ~ ^/index\.php(/|$) {
, если вы не находитесь на SF2**
Надеюсь, это сэкономит кому-то немного времени:)
Редактировать
Конечно, вы могли бы изменить listen = /var/run/php5-fpm.sock
на listen = 127.0.0.1:9000
в /etc/php5/fpm/pool.d/www.conf
, а затем перезапустить php5-fpm (что избавило бы вас от необходимости менять свои vhosts), но вы должны предположить, что они изменили php5-fpm для запуска через сокет, а не для прослушивания порта 9000 по какой-то причине.
Правка2
Если вы все еще испытываете ошибку 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… Сервер имеет 16 Гб оперативной памяти. Эта конфигурация предназначена для сервера оперативной памяти объемом 8 Гб, поэтому...
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
Для всех, кто пытается разобраться в этом, я попытался скорректировать тайм-ауты, как предлагалось, поскольку я не хотел прекращать использовать сокеты Unix... после множества поисков и устранения неполадок я обнаружил, что эта проблема вызвана расширением APC, которое я включил в php-fpm несколько месяцев назад. Отключение этого расширения разрешило периодические ошибки 502, самый простой способ сделать это - прокомментировать следующую строку:
;extension = apc.so
Это сработало для меня!
Порт был изменен на 9001 в 5.4, просто изменение порта с 9000 на 9001 в nginx conf и в конфигурации php-fpm сработало для меня.
Надеюсь, этот совет спасет чью-то жизнь. В моем случае проблема заключалась в том, что у меня закончилась память, но только немного, было трудно думать об этом. Потратил на это 3 часа. Я рекомендую запустить:
sudo htop
Или
sudo free -m
...наряду с выполнением проблемных запросов на сервере, чтобы проверить, не закончилась ли ваша память. И если это действительно так, как в моем случае, вам нужно создать файл подкачки (если у вас его еще нет).
Я следовал этому руководству, чтобы создать файл подкачки в Ubuntu Сервер 14.04, и он работал просто отлично: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
Я также обнаружил, что эта ошибка может быть вызвана при записи данных json_encoded() в MySQL. Чтобы обойти это, я использую base64_encode() в JSON. Пожалуйста, обратите внимание, что при декодировании кодировка JSON может изменять значения. Nb.24 может стать 24.00
Хорошо, после того, как я попробовал все решения в Интернете, я решил решить проблему с помощью очень простого метода, сначала я проверил журнал ошибок php-fpm
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
КСТАТИ, я использую VPS низкого уровня со 128 МБ оперативной памяти, как и все остальные, о которых я думал, повторное использование 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 на своем сервере. Я смог просто удалить файл .socket и перезапустить свои службы. Затем все заработало. Не знаю, почему это имело значение, так как размер файла равен 0, а права собственности и разрешения одинаковы, но это сработало.
Прежде чем связываться с конфигурацией Nginx, попробуйте сначала отключить ChromePHP.
1 - Открыть приложение/config/config_dev.yml
2 - Прокомментируйте эти строки:
chromephp:
type: chromephp
level: info
CHROMEPHP упаковывает информацию об отладке, закодированную в формате json, в заголовок X-chromephp-данных, который слишком велик для конфигурации nginx по умолчанию с fastcgi.
В вашем файле NGINX vhost в блоке расположения, который обрабатывает ваши PHP-файлы (обычно location ~ \.php$ {
) с помощью FastCGI, убедитесь, что у вас есть следующие строки:
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/локальный/etc/nginx/с поддержкой сайтов/' - 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