Быстрая установка Nginx 1.18 и устранение 502 за 10 шагов
Коротко: установите Nginx через apt, настройте server block с корректным fastcgi_pass или proxy_pass, проверьте логи и статус backend (PHP‑FPM/Node/Gunicorn), исправьте путь к сокету/порту и при необходимости увеличьте таймауты или ресурсы — это решает ~90% 502.
Установка и базовая конфигурация
- Обновите систему и установите Nginx:
sudo apt update
sudo apt upgrade -y
sudo apt install nginx -y
sudo systemctl enable --now nginx
nginx -v
- Структура конфигов:
/etc/nginx/nginx.conf,/etc/nginx/sites-available/,/etc/nginx/sites-enabled/. Проверка конфигурации:
sudo nginx -t
sudo systemctl reload nginx
- Создайте простой сайт:
sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com
echo '<h1>OK</h1>' > /var/www/example.com/html/index.html
Создайте серверный блок в /etc/nginx/sites-available/example.com и активируйте его через symlink.
Если сервер в облаке — откройте порты 80/443 в сетевом файрволе провайдера.
Подключение backend: PHP‑FPM, Node.js, Gunicorn
- PHP‑FPM: установите пакет (
php-fpm, версия 7.4/8.1 и т.д.). В конфиге Nginx для PHP укажите точный сокет или порт:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # или 127.0.0.1:9000
fastcgi_read_timeout 60s;
}
Проверьте фактический listen в /etc/php/*/fpm/pool.d/www.conf.
- Node.js (reverse proxy):
upstream node_app { server 127.0.0.1:3000; }
location / {
proxy_pass http://node_app;
proxy_set_header Host $host;
proxy_read_timeout 60s;
}
- Gunicorn/Django:
Аналогично — proxy_pass на 127.0.0.1:8000 и настройте
/static/черезalias.
Диагностика и устранение 502 Bad Gateway
- Смотрим лог Nginx — ключ к проблеме:
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 50 /var/log/nginx/example.com.error.log
Типичные сообщения и их смысл:
No such file or directory— неверный путь к сокету.Connection refused— backend не запущен или слушает другой адрес.upstream timed out— backend долго отвечает или завис.
- Проверяем backend:
- PHP‑FPM:
sudo systemctl status php*-fpm
sudo journalctl -u php8.1-fpm --no-pager -n 200
grep -R "listen =" /etc/php/*/fpm/pool.d/www.conf
- Node/Gunicorn:
sudo ss -tulpn | grep -E '3000|8000'
curl -v http://127.0.0.1:3000
-
Таймауты и лимиты: увеличьте
proxy_read_timeout/fastcgi_read_timeoutдля долгих запросов; настройтеclient_max_body_sizeпри загрузке больших файлов. -
Ресурсы: проверьте
top,free -h. Для PHP‑FPM скорректируйтеpm.max_childrenисходя из памяти.
Частая ошибка: после обновления PHP в конфиге Nginx остался старый сокет (php7.4-fpm.sock) — итог: 502 на всех PHP‑запросах.
Частые ошибки
- Неверный путь к PHP‑FPM сокету или порт.
- Backend слушает только
127.0.0.1, а Nginx проксирует на внешний интерфейс (или наоборот). - Файрвол блокирует порт приложения.
- Переполненные процессы PHP‑FPM — исчерпал
max_children.
FAQ
- Что сначала смотреть при 502? — Логи Nginx, затем статус backend.
- Как быстро проверить, слушает ли порт? —
ss -tulpn | grep PORT. - Помогает ли перезапуск Nginx? — Иногда; сначала исправьте причину на стороне backend, затем перезагрузите Nginx.
Мини‑чек‑лист при 502: проверить логи → подтвердить, что backend запущен и слушает → сверить путь/порт в конфиге → проверить таймауты и ресурсы → nginx -t и reload.