Вопрос или проблема
Я только что запустил новый облачный сервер 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-адресу сервера появляется ошибка.
Применение:
-
Проверка подключений:
- Первым шагом необходимо убедиться, что PHP-FPM корректно запущен и слушает указанный порт. Используйте команду:
netstat -an | grep LISTEN
Проверьте, слушает ли php-fpm порт 9000 на localhost (127.0.0.1:9000). Если нет, убедитесь, что конфигурационный файл php-fpm настроен на использование TCP-порта.
-
Изменение конфигураций 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
- Откройте конфигурацию пула PHP-FPM, например, /etc/php5/fpm/pool.d/www.conf, и проверьте параметр
-
Анализ логов:
- Проверьте логи PHP-FPM и Nginx, чтобы выявить возможные ошибки:
tail -f /var/log/php5-fpm.log tail -f /var/log/nginx/error.log
Логи помогут определить, где именно возникают проблемы.
-
Корректировка таймаутов и производительности:
- В файле конфигурации 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
-
Проверка версии PHP:
- Убедитесь, что Nginx правильно настроен на использование установленной версии PHP, это может особенно касаться путей к сокетам, например:
fastcgi_pass unix:/var/run/php5-fpm.sock;
Убедитесь, что путь корректно указывает на вашу версию PHP.
-
Диагностика и тесты:
- Добавьте тестовый 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. Следуя вышеописанным шагам, можно последовательно исключить возможные причины проблемы и наладить корректную работу сервера.