Nginx + PHP-FPM = 502 Bad Gateway

Вопрос или проблема

Я только что запустил новый облачный сервер Rackspace и выполнил следующее:

apt-get install php5 nginx php-fpm

Когда я перехожу по IP-адресу, я вижу стандартное сообщение Nginx. Затем я скопировал свой файл /etc/nginx/sites-available/default из другой рабочей установки, которую у меня есть:

server {

  listen 80;
  server_name localhost;

  root /srv/www;
  index index.php;

  location / {
    try_files $uri $uri/ /controllers$uri.php;
    location ~ \.php$ {
      try_files $uri /index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
      }
   }
}

Я создал index.php в /srv/www и запустил nginx и php-fpm:

/etc/init.d/nginx start
/etc/init.d/php5-fpm start

Я получаю ошибку 502 Bad Gateway. Я что-то делаю неправильно?

Поскольку я не могу добавить комментарий, я опубликую это как ответ…

Проверьте, настроен ли файл /etc/php5/fpm/pool.d/www.conf (или файл в этой директории) для работы с TCP или UNIX-сокетом. Также проверьте, запущен ли PHP. И просмотрите журналы /var/log/php5-fpm.log или /var/log/php5-fpm/* и /var/log/nginx/* (в зависимости от настроек).

Вы должны найти причину ошибки там.

В моем случае решение было следующим:

1. Изменить слушатель, как предложил @David:

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

В файле найдите listen =, закомментируйте …sock и добавьте 127.0.0.1:9000

;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000

2. Измените на сайте конфигурации Nginx (например, /etc/nginx/sites-available/mysite.com)

server {
       .
       .
       . 
location ~ \.php$ {
       .
       .
       .
 #fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
 fastcgi_pass 127.0.0.1:9000;
       .
       .
       .

3. Увеличьте таймаут и max_children:

/etc/php/7.0/fpm/php.ini  =>   default_socket_timeout = 60000
/etc/php/7.0/fpm/php.ini  =>   pm.max_children = 20
/etc/php/7.0/fpm/pool.d/www.conf  =>   request_terminate_timeout = 60000

4. Увеличьте таймаут в /etc/nginx/nginx.conf:

keepalive_timeout 65000;

После этого перезапустите php-fpm и nginx:

sudo service php7.0-fpm restart
sudo service nginx restart

Я рекомендую перед перезапуском nginx проверить, все ли в порядке:

sudo service nginx configtest 

Ошибка bad gateway означает, что процесс PHP отвечает с ошибкой. Можете ли вы проверить лог ошибок PHP? Также попробуйте разместить файл test.php с <?php phpinfo(); ?> в /srv/www/ и затем попробуйте обратиться к этому домену прямо из командной строки вашего сервера, например:

curl http://127.0.0.1:9000/test.php;

Вы проверяли очевидные вещи, например, есть ли у вас файл в /srv/www/index.php? Запускали ли вы ps aux и grep для nginx и php, чтобы убедиться, что они работают?

Как насчет выполнения: netstat -an | grep LISTEN для проверки, слушает ли демон php-fpm?

В моем случае сработала перезагрузка сервиса fpm. Я только выполнял reload. Забыл, что изменения конфигурации требуют перезапуска для применения.

Убедитесь, что ваш файл в /etc/nginx/sites-available/<ваш сайт> указывает правильную версию PHP. Я обнаружил, что конфигурация для php7.3 не соответствует установленной /run/php/php8.3-fpm, поэтому мне пришлось только обновить эту конфигурацию и перезагрузить nginx.

.

Ответ или решение

Теория:

Ошибка «502 Bad Gateway» в контексте использования Nginx в связке с PHP-FPM часто возникает из-за проблем в взаимодействии между этими двумя службами. Это может быть связано с несколькими факторами, такими как неправильные настройки конфигурации, проблемы с соединением между Nginx и PHP-FPM, или временные проблемы с производительностью и загрузкой системы.

Пример:

Вы настроили новый сервер на Rackspace и установили необходимые пакеты для запуска веб-сайта с использованием Nginx и PHP-FPM:

apt-get install php5 nginx php-fpm

После этого вы скопировали файл конфигурации /etc/nginx/sites-available/default с другого рабочего сервера и обнаружили ошибку 502 Bad Gateway при попытке доступа к серверу.

В файле конфигурации представлены следующие ключевые моменты:

server {

  listen 80;
  server_name localhost;

  root /srv/www;
  index index.php;

  location / {
    try_files $uri $uri/ /controllers$uri.php;
    location ~ \.php$ {
      try_files $uri /index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
      }
   }
}

Однако, несмотря на правильную структуру, при переходе к IP-адресу сервера появляется ошибка.

Применение:

  1. Проверка подключений:

    • Первым шагом необходимо убедиться, что PHP-FPM корректно запущен и слушает указанный порт. Используйте команду:
    netstat -an | grep LISTEN

    Проверьте, слушает ли php-fpm порт 9000 на localhost (127.0.0.1:9000). Если нет, убедитесь, что конфигурационный файл php-fpm настроен на использование TCP-порта.

  2. Изменение конфигураций PHP-FPM:

    • Откройте конфигурацию пула PHP-FPM, например, /etc/php5/fpm/pool.d/www.conf, и проверьте параметр listen.
    ;listen = /var/run/php5-fpm.sock
    listen = 127.0.0.1:9000
    • После изменений перезапустите службу PHP-FPM:
    sudo service php5-fpm restart
  3. Анализ логов:

    • Проверьте логи PHP-FPM и Nginx, чтобы выявить возможные ошибки:
    tail -f /var/log/php5-fpm.log
    tail -f /var/log/nginx/error.log

    Логи помогут определить, где именно возникают проблемы.

  4. Корректировка таймаутов и производительности:

    • В файле конфигурации php.ini попробуйте увеличить таймаут:
    default_socket_timeout = 60
    • В конфигурации пула /etc/php5/fpm/pool.d/www.conf попробуйте увеличить число дочерних процессов:
    pm.max_children = 20
    request_terminate_timeout = 60
    • Для Nginx увеличьте значение keepalive_timeout в основном конфигурационном файле:
    keepalive_timeout 65;

    После внесения изменений перезапустите обе службы:

    sudo service php5-fpm restart
    sudo service nginx restart
  5. Проверка версии PHP:

    • Убедитесь, что Nginx правильно настроен на использование установленной версии PHP, это может особенно касаться путей к сокетам, например:
    fastcgi_pass unix:/var/run/php5-fpm.sock;

    Убедитесь, что путь корректно указывает на вашу версию PHP.

  6. Диагностика и тесты:

    • Добавьте тестовый PHP-скрипт, чтобы проверить основную функциональность PHP на сервере:

    Создайте файл test.php в каталоге /srv/www:

    <?php phpinfo(); ?>

    Выполните тест с использованием curl:

    curl http://127.0.0.1/test.php

    Если скрипт корректно выполняется, это подтверждает, что PHP-FPM и Nginx работают в связке правильно, и необходимо лишь корректировать конфигурации.

В заключение, ошибка 502 Bad Gateway является индикатором проблем во взаимодействии между Nginx и PHP-FPM. Следуя вышеописанным шагам, можно последовательно исключить возможные причины проблемы и наладить корректную работу сервера.

Оцените материал
Добавить комментарий

Капча загружается...