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Цей гайд був корисним?