nginx как reverse proxy: руководство
На этой странице
Обратный прокси (reverse proxy) стоит перед вашими приложениями и передаёт им запросы посетителей. С nginx на входе приложение на Node.js, Docker-контейнер или панель, работающая на каком-нибудь порту, превращается в https://app.example.com — с HTTPS, правильными заголовками и одним местом для управления всем этим.
В этом руководстве мы шаг за шагом настроим nginx как reverse proxy на Ubuntu: блок server, заголовки, WebSockets, бесплатный HTTPS и ошибки, с которыми вы скорее всего столкнётесь.
Что делает reverse proxy
- Одна публичная точка входа. nginx слушает порты 80 и 443 и передаёт каждый домен или путь нужному приложению, так что сами приложения никогда не смотрят в интернет напрямую.
- HTTPS в одном месте. nginx занимается сертификатами, а приложения за ним могут работать по обычному HTTP на localhost.
- Несколько приложений на одном сервере.
app.example.com,api.example.comиexample.com/blogмогут вести к разным сервисам. - Дополнительно: сжатие, кеширование, лимиты на загрузку и правила доступа — без изменений в самом приложении.
Шаг 1: установите nginx
sudo apt update sudo apt install nginx
Откройте http://your-server-ip — должна появиться приветственная страница nginx. Если вы используете ufw, разрешите веб-трафик командой sudo ufw allow 'Nginx Full'.
Убедитесь, что приложение запущено и отвечает на самом сервере, например через curl http://127.0.0.1:3000. Если это не работает, не заработает и nginx.
Запускайте nginx и свои приложения с полным root-доступом: тарифы HytHost KVM VPS от €2.92/мес.
Тарифы VPSШаг 2: создайте блок server для прокси
В Ubuntu у каждого сайта есть файл в /etc/nginx/sites-available/, который включается ссылкой в sites-enabled. Создайте /etc/nginx/sites-available/app.example.com:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Включите его, проверьте конфигурацию и перезагрузите:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
Направьте A-запись домена на ваш сервер, и http://app.example.com начнёт показывать ваше приложение. Всегда запускайте nginx -t перед перезагрузкой: команда находит опечатки до того, как они уронят сайт.
Заголовки и завершающий слеш
Hostпередаёт домен, который запросил посетитель. Без него nginx отправляет адрес изproxy_pass, и приложения, которые строят ссылки по хосту, ломаются.X-Real-IPиX-Forwarded-Forпередают IP-адрес посетителя. Без них каждый запрос выглядит так, будто пришёл с127.0.0.1.X-Forwarded-Protoсообщает приложению, использовал ли посетитель HTTPS, чтобы оно не уходило в бесконечные редиректы.
Пакет nginx в Ubuntu уже содержит эти строки в /etc/nginx/proxy_params, поэтому include proxy_params; — удобное сокращение.
Завершающий слеш имеет значение. Для приложения, расположенного по пути:
location /app/ {
proxy_pass http://127.0.0.1:3000/;
}
Со слешем после порта /app/login приходит в приложение как /login. Без него приложение получает полный путь /app/login.
WebSockets
Чаты, live-панели и многие админ-панели используют WebSockets, которым нужны два дополнительных заголовка. Добавьте этот map один раз внутри блока http, например в новом файле /etc/nginx/conf.d/websocket.conf:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
Затем в location:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 1h;
nginx закрывает проксируемое соединение, по которому 60 секунд ничего не передаётся; более длинный proxy_read_timeout держит открытыми «тихие» WebSocket-соединения. proxy_http_version 1.1 стал значением по умолчанию только в nginx 1.29.7, а в Ubuntu 24.04 поставляется 1.24, так что оставьте эту строку.
Шаг 3: бесплатный HTTPS с Certbot
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot sudo certbot --nginx -d app.example.com
Certbot получает бесплатный сертификат Let's Encrypt, добавляет настройки HTTPS в ваш блок server и может перенаправлять HTTP на HTTPS. Сертификат продлевается автоматически; проверить это можно командой sudo certbot renew --dry-run. Подробнее о сертификатах — в руководстве как получить бесплатный SSL-сертификат.
Как исправить ошибки 502, 504 и 413
| Ошибка | Обычная причина | Решение |
|---|---|---|
| 502 Bad Gateway | nginx не может достучаться до приложения: оно остановлено, упало или слушает другой порт или адрес | Запустите приложение, проверьте порт через curl http://127.0.0.1:PORT, загляните в /var/log/nginx/error.log |
| 504 Gateway Timeout | Приложение отвечало дольше 60 секунд | Ускорьте запрос или увеличьте proxy_read_timeout для этого location |
| 413 Request Entity Too Large | Загружаемый файл больше стандартного лимита nginx в 1 МБ | Укажите client_max_body_size 50m; в блоке server |
| Бесконечный редирект | Приложение не знает, что посетитель использовал HTTPS | Передавайте X-Forwarded-Proto и сообщите приложению, что оно работает за прокси |
После каждого изменения: sudo nginx -t, затем sudo systemctl reload nginx.
Запуск на VPS от HytHost
Для reverse proxy нужен сервер, на котором вы управляете портами 80 и 443. Тарифы VPS от HytHost работают на KVM с полным root-доступом, SSD-хранилищем и защитой от DDoS; выберите Ubuntu 24.04 и следуйте шагам выше. Запускаете приложения в контейнерах? Сначала установите Docker по руководству как установить Docker на Ubuntu и привяжите порты контейнеров к 127.0.0.1, чтобы к ним мог обращаться только nginx.
Частые вопросы
Reverse proxy передаёт запросы одному или нескольким приложениям за ним. Балансировщик нагрузки — это reverse proxy, который распределяет запросы между несколькими копиями одного и того же приложения. nginx умеет и то и другое: копии перечисляются в блоке upstream.
nginx не может достучаться до приложения за ним. Проверьте, что приложение запущено и слушает адрес и порт из proxy_pass, и посмотрите точную причину в /var/log/nginx/error.log.
Нет, если приложение работает на том же сервере. nginx обслуживает HTTPS для посетителей и общается с приложением по обычному HTTP на 127.0.0.1, а этот трафик никогда не покидает машину.
Дайте каждому приложению свой блок server со своим server_name, например app.example.com и api.example.com, и в каждом укажите proxy_pass на свой порт.
Да. Публикуйте порт каждого контейнера только на 127.0.0.1 и направьте на него proxy_pass. Так контейнеры не будут доступны из публичного интернета, а это важно, потому что опубликованные порты Docker обходят ufw.
Размещайте свои приложения за nginx
Тарифы HytHost KVM VPS с полным root-доступом, SSD-хранилищем и защитой от DDoS — от €2.92/мес.
Live chat 8 AM – 11 PM (Chișinău time) · tickets answered during business hoursЭтот гайд был полезен?