PHP-FPM та Nginx: 502 Bad Gateway


78

Конфігурація

  • 64-розрядна версія Ubuntu Server 11.10
  • 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

Я додав наступне, що не дуже допомогло:

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

Відповіді:


151

Якщо хтось знаходить цю сторінку, зіткнувшись із тією ж проблемою, що і у мене, я знайшов відповідь тут .

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

Стан:

Сервер 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 (взятий звідси ):

  # 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 (який позбавить вас від необхідності змінити ВХости), але ви повинні припустити , що вони змінили php5-FPM запустити через сокет , а не прослуховує порт 9000 для причина.

Редагувати2

Якщо ви все ще відчуваєте помилку 502, перегляньте цю відповідь .


2
Сокети Unix лише незначно швидші і можуть вийти з ладу під великим навантаженням drupal.org/node/1635622#comment-6814968
Десмонд Юм

не допомогло, це вже було встановлено так, і я постійно переживаю 502.
vsync

Поганий шлюз просто означає, що Nginx не може знайти PHP. Ви впевнені, що служба php-fpm встановлена ​​і запущена? Спробуйте перезапустити його, якщо він працює, можливо, він зависає.
nealio82

@Nealio Я використовую сервер ubuntu під управлінням nginx. ви знаєте, де саме я можу знайти файл, на який посилається # 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; }?
user111671

1
Вони, здається, нещодавно змінили це і зробили так, що воно завжди використовує оригінальні номери портів, тобто127.0.0.1:9000
marksyzm

28

Спробуйте встановити ці значення, це вирішує проблему в fast-cgi

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;

Це зробило це для мене. Це було досить важко визначити, оскільки помилка fastcgi була усічена в журналі nginx. Дякую!
jrhorn424

1
вперед і встановіть його на 64k для Symfony2.3 :) виведення помилок Symfony просто здається заваленим буферами ...
Stefan

2
@Jusfeel Ці параметри слід додати до конфігураційного файлу nginx.
біфоф

Яке диво-рішення. Дякую
січень

Я звернувся до Siwapp, встановленого під nginx, і він чудово працює! Щиро дякую :)
akajack

11

Я робив усі подібні налаштування, але час від часу отримував помилки 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

4

Якщо ви зіткнулися з проблемою після оновлення php-fpm, як я, спробуйте наступне: відкрийте /etc/php5/fpm/pool.d/www.conf розкоментуйте такі рядки:

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

потім перезапустіть php-fpm.


Вирішив це і для мене. Файл конф. Знаходився /etc/php/php-fpm.d/www/confна Arch Linux. Зауважте, що встановлення дозволів на 0666, ймовірно, непридатне для виробництва. Натомість робочий сервер повинен відповідати користувачеві Nginx та користувачеві PHP-FPM та зберігати дозволи 0660для підвищення безпеки.
conradkleinespel

3

Не забувайте, що php-fpmце послуга. Після його встановлення обов’язково запустіть:

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

2

Для тих, хто намагається дійти до кінця цього, я спробував скоригувати час очікування, як пропонувалось, оскільки я не хотів припиняти використання сокетів Unix ... після великої кількості усунення несправностей і не надто багато чого іншого, я виявив, що ця проблема спричинена розширенням APC, яке я увімкнув у php-fpm кілька місяців тому. Вимкнення цього розширення вирішило періодичні помилки 502, найпростіший спосіб зробити це, прокоментувавши такий рядок:

;extension = apc.so

Це зробило для мене фокус!


1

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


1

Сподіваюся, ця порада врятує чуже життя. У моєму випадку проблема полягала в тому, що в мене не вистачало пам’яті, але лише трохи, важко було про це думати. На це витрачено 3 години. Я рекомендую запустити:

sudo htop

або

sudo free -m

... поряд із запуском проблемних запитів на сервері, щоб перевірити, чи не закінчується пам’ять. І якщо це так, як у моєму випадку, вам потрібно створити файл підкачки (якщо у вас його вже немає).

Я дотримувався цього підручника для створення файлу підкачки на Ubuntu Server 14.04, і він працював чудово: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/


1

Ви повинні побачити журнал помилок. За замовчуванням його місцезнаходження знаходиться у /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;

0

Я також виявив, що ця помилка може бути спричинена під час запису даних json_encoded () до MySQL. Щоб обійти це, я base64_encode () JSON. Зверніть увагу, що при декодуванні кодування JSON може змінювати значення. Nb. 24 може стати 24.00


0

Добре, спробувавши будь-яке рішення в Інтернеті, я виявив проблему дуже простим методом, спочатку перевірив журнал помилок 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-годинного тестування та не вдалося, коли-небудь моя служба підтримки веб-хостів не змогла вирішити проблему.


0

Я дуже запізнився з цією грою, але моя проблема почалася, коли я оновив php на своєму сервері. Я зміг просто видалити файл .socket і перезапустити мої служби. Тоді все працювало. Не знаю, чому це змінило ситуацію, оскільки файл має розмір 0, а право власності та дозволи однакові, але він спрацював.


0

Перш ніж возитися з конфігурацією Nginx, спробуйте спочатку вимкнути ChromePHP.

1 - Відкрийте додаток / config / config_dev.yml

2 - Прокоментуйте ці рядки:

chromephp:
    type:   chromephp
    level:  info

ChromePHP пакує інформацію про налагодження, закодовану у форматі json, у заголовку X-ChromePhp-Data, який завеликий для конфігурації nginx за замовчуванням із fastcgi.



0

У вашому файлі 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 vhost шляхи

  • /etc/nginx/sites-enabled/ - Linux
  • '/ usr / local / etc / nginx / sites-enabled /' - Mac

Перезапустіть NGINX:

  • sudo service nginx restart - Linux
  • brew service restart nginx - Мак

Перезапустіть 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> - Мак

0

Можливо, ця відповідь допоможе:

Помилка підключення nginx до php5-fpm.sock (13: дозвіл відмовлено)

Рішенням було замінити www-data на nginx у /var/www/php/fpm/pool.d/www.conf

І відповідно змінити облікові дані сокета:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock

це правильне рішення, якщо помилка nginx підключилася до php5-fpm.sock не вдалося (13: дозвіл відмовлено)
Florin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.