PHP-FPM и Nginx: 502 Bad Gateway

конфигурация

  • Ubuntu Server 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 .

я. 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 в ;;;;;;;;;;;;;;;;;;;;; ; 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 и ;;;;;;;;;;;;;;;;;;;;; ; 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. Period.).

Проблема прежде всего заключается в том, что что-то ужасно, ужасно неправильно. И теперь, когда я пытаюсь 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; } } 

Если кто-то найдет эту страницу, столкнувшись с той же проблемой, что и я, я нашел ответ здесь: http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-lemp -он-убунту-12,04-LTS

Для тех из вас, кто не может беспокоиться, щелкнуть и разобраться в себе …;)

Состояние:

Сервер Ubuntu или Debian с NGINX и PHP 5.3 отлично работает, но обновление 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 в вашем 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.

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 … Сервер имеет 16 ГБ оперативной памяти. Эта конфигурация предназначена для сервера 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 

Для кого-то еще, пытающегося разобраться в этом, я попытался настроить таймауты, как было предложено, поскольку я не хотел прекращать использование сокетов Unix … после многого устранения неполадок и не так много, чтобы продолжить. Я обнаружил, что эта проблема вызвана по расширению APC, которое я разрешил в php-fpm несколько месяцев назад. Отключение этого расширения разрешило прерывистые ошибки 502, самый простой способ сделать это – прокомментировать следующую строку:

 ;extension = apc.so 

Это сделал трюк для меня!

Порт был изменен на 9001 в 5.4, только меняя порт от 9000 до 9001 в конфигурации nginx, и в конфигурации php-fpm работал для меня.

Надеюсь, этот совет спасет чужую жизнь. В моем случае проблема заключалась в том, что у меня не хватало памяти, но только немного, было трудно думать об этом. Потратил 3 часа на это. Я рекомендую запустить:

 sudo htop 

или

 sudo free -m 

… наряду с запуском проблемных запросов на сервере, чтобы узнать, не закончилась ли ваша память. И если это так, как в моем случае, вам нужно создать файл подкачки (если у вас его уже нет).

Я пошел по этому руководству, чтобы создать файл подкачки на Ubuntu Server 14.04, и он работал отлично: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

Я также обнаружил, что эта ошибка может быть вызвана при записи данных json_encoded () в MySQL. Чтобы обойти это, я base64_encode () JSON. Пожалуйста, не то, что при декодировании кодировка JSON может изменять значения. В северном направлении 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 

BTW Я использую низкоуровневый 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-encoded в заголовок X-ChromePhp-Data, что слишком велико для конфигурации nginx по умолчанию с fastcgi.