Быстрая установка Nginx 1.18 и устранение 502 за 10 шагов

Коротко: установите Nginx через apt, настройте server block с корректным fastcgi_pass или proxy_pass, проверьте логи и статус backend (PHP‑FPM/Node/Gunicorn), исправьте путь к сокету/порту и при необходимости увеличьте таймауты или ресурсы — это решает ~90% 502.

Установка и базовая конфигурация

  1. Обновите систему и установите Nginx:
sudo apt update
sudo apt upgrade -y
sudo apt install nginx -y
sudo systemctl enable --now nginx
nginx -v
  1. Структура конфигов: /etc/nginx/nginx.conf, /etc/nginx/sites-available/, /etc/nginx/sites-enabled/. Проверка конфигурации:
sudo nginx -t
sudo systemctl reload nginx
  1. Создайте простой сайт:
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

  1. Смотрим лог 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 долго отвечает или завис.
  1. Проверяем 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
  1. Таймауты и лимиты: увеличьте proxy_read_timeout / fastcgi_read_timeout для долгих запросов; настройте client_max_body_size при загрузке больших файлов.

  2. Ресурсы: проверьте 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.