PHP-FPM и Nginx: 502 плохой шлюз



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




  • Ubuntu Server 11.10 64 бит

  • Amazon AWS, Ec2, размещенный в облаке

  • t1.микро-экземпляр


прежде чем писать что-либо еще, я хотел бы заявить, что я проверил как nginx 502 bad gateway, так и nginx + PHP-FPM 502 Bad Gateway threads, которые, к сожалению, не помогли мне в этом отношении.



проблема кажется довольно распространенной: неправильная конфигурация nginx или php-fpm может привести к 502 Bad Gateway ошибка, от которой я не смог избавиться. Обратите внимание, что это появляется даже когда я иду в свой домен root, без указания какого-либо определенного каталога.



я запускаю веб-сервер 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


ii. nginx.conf



честно говоря, эта конфигурация представляет собой небольшое количество веб-сайтов, которые я посетил, но я могу сказать вам, что до этого 502 Bad Gateway business сервер работал нормально (без работы 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 ; }
if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
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;
}
}
906   14  

14 ответов:

если кто-нибудь найдет эту страницу, столкнувшись с той же проблемой, что и я, я нашел ответ здесь: 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 и запишите параметр' 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**

надеюсь, это сэкономит кому-то немного времени :)

Edit

конечно, вы можете изменить listen = /var/run/php5-fpm.sock до listen = 127.0.0.1:9000 in /etc/php5/fpm/pool.d/www.conf затем перезапустите php5-fpm (что избавит вас от необходимости чтобы изменить ваши vhosts), но вы должны предположить, что они изменили php5-fpm для запуска через сокет, а не прослушивания порта 9000 по какой-то причине.

Edit2

если вы все еще испытываете ошибку 502 см. Этот ответ: ошибка nginx подключение к php5-fpm.sock failed (13: Permission denied)

попробуйте установить эти значения, это решает проблему в 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.конф раскомментируйте следующие строки:

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 Server 14.04 и он работал просто отлично: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

Я также обнаружил, что эта ошибка может быть вызвана при записи данных json_encoded () в MySQL. Чтобы обойти это, я base64_encode () JSON. Пожалуйста, не то, что при декодировании, кодировка JSON может изменить значения. Нотабене. 24 может стать 24.00

все в порядке после попытки каждого решения в Интернете я в конечном итоге figuare из вопроса, используя очень простой метод, сначала я проверил 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

кстати, я использую low end VPS с 128MB ram, как и все остальные, я думал, что redusing pm.max_children заставит мой сервер работать быстрее потребляйте меньше памяти, но настройки, которые мы используем, были слишком низкими, чтобы даже запустить процесс PHP-fpm . Я надеюсь, что это поможет другим, так как я нашел это после 24-часового тестирования и сбоя , когда-либо моя поддержка webhost не смогла решить проблему .

вы должны увидеть журнал ошибок. По умолчанию его расположение находится в /var/log/nginx / error.журнал

в моем случае, 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-Открыть приложение / config / config_dev.в формате YML

2 - прокомментировал эти строки:

chromephp:
    type:   chromephp
    level:  info

chromephp pack отладочная информация JSON-кодируется в заголовке X-ChromePhp-Data, который слишком велик для конфигурации по умолчанию nginx с fastcgi.

в вашем файле NGINX vhost, в блоке location который обрабатывает ваши 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/местные/и т. д./nginx/сайты с поддержкой/' - Мак

перезагрузка 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

Comments

    Ничего не найдено.