Налаштування Nginx як зворотного проксі для бекенд-застосунків
Вступ
У сучасних серверних середовищах застосунки рідко взаємодіють із інтернетом напряму. Замість цього перед ними розміщується зворотний проксі (reverse proxy), який обробляє всі вхідні запити клієнтів. Nginx — один із найпопулярніших інструментів для цього завдання, оскільки він швидкий, надійний і простий у налаштуванні. У цьому посібнику ви дізнаєтесь, як налаштувати Nginx як зворотний проксі для бекенд-застосунку, що працює на тому ж сервері.
Що таке зворотний проксі?
Зворотний проксі — це сервер, який:
- Приймає запити від клієнтів (браузерів, API тощо)
- Передає ці запити бекенд-застосунку
- Повертає відповідь бекенду назад клієнту
Клієнт ніколи не взаємодіє безпосередньо з бекенд-застосунком.
Зворотний проксі vs прямий доступ
Без зворотного проксі:
Client ---> Backend application (port 3000)
Із зворотним проксі:
Client ---> Nginx (port 80, 443) ---> Backend application (port 3000)
Чому варто використовувати Nginx як зворотний проксі?
Використання Nginx перед вашим застосунком дозволяє:
- Відкривати в інтернет лише порти 80/443
- Приховати бекенд-служби від прямого доступу
- Завершувати HTTPS (TLS) в одному місці
- Додавати логування, контроль доступу та обмеження швидкості
- Запускати кілька застосунків на одному сервері
Для системних адміністраторів це означає кращу безпеку та простіше адміністрування.
Сценарій, який використовується в цьому посібнику
Для простоти ми використаємо таку конфігурацію:
- Nginx слухає порт
80 - Бекенд-застосунок слухає
127.0.0.1:3000 - Запити до
http://example.comперенаправляються на бекенд
Схема руху трафіку
[ Browser ] | v [ Nginx example.com:80,443 ] | v [ Backend app 127.0.0.1:3000 ]
Передумови
Перед початком переконайтесь, що у вас є:
- Linux-сервер із останньою стабільною версією Debian
- Root або sudo-доступ
- Уже запущений бекенд-застосунок (наприклад, Node.js, Python або Java)
- Базові навички роботи з Linux-терміналом
Встановлення Nginx
Оновіть список пакетів і встановіть Nginx та curl (для тестування):
sudo apt update
sudo apt install nginx curl
Перевірте, що Nginx запущений:
systemctl status nginx
У виводі ви повинні побачити "active (running)".
Перевірте Nginx локально:
curl http://localhost
Якщо все працює, ви отримаєте стандартну сторінку привітання Nginx.
Структура конфігурації Nginx
Файли конфігурації Nginx зазвичай знаходяться в /etc/nginx/. Важливі каталоги:
/etc/nginx/nginx.conf— головний конфігураційний файл/etc/nginx/sites-available/— конфігурації сайтів (неактивні)/etc/nginx/sites-enabled/— увімкнені конфігурації (символічні посилання)
Nginx читає конфігурації з каталогу sites-enabled, а не напряму з sites-available. Рекомендується створювати файли в sites-available, а потім створювати символічні посилання в sites-enabled.
Створення конфігурації зворотного проксі
Створіть новий файл сайту
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Додайте конфігурацію зворотного проксі
server { listen 80; server_name 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; } }
Пояснення конфігурації
Блок server
server { listen 80; server_name example.com; }
listen 80;— Nginx слухає HTTP-трафік на порту 80server_name example.com;— доменне ім'я, на яке реагує цей блок
Блок location
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; }
location /— відповідає всім URLproxy_pass— пересилає запити до бекенд-застосунку
Проксі-заголовки
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;
Ці заголовки дозволяють бекенду знати:
- Оригінальне доменне ім'я
- Реальну IP-адресу клієнта
- Чи був запит HTTP або HTTPS
Без цих заголовків застосунок може логувати некоректну інформацію.
Активація конфігурації
Вимкніть сайт Nginx за замовчуванням, щоб уникнути конфліктів на порту 80:
sudo rm /etc/nginx/sites-enabled/default
Створіть символічне посилання для активації сайту:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Перевірте конфігурацію на синтаксичні помилки:
sudo nginx -t
Якщо помилок немає, перезавантажте Nginx:
sudo systemctl reload nginx
Тестування зворотного проксі
На сервері:
curl http://example.com
Відкрийте http://example.com у браузері. Ви повинні отримати відповідь від вашого бекенд-застосунку, а не стандартну сторінку Nginx. Якщо все налаштовано правильно, бекенд-застосунок завантажиться.
Як обробляється запит
- Клієнт надсилає запит до example.com
- Nginx приймає запит на порт 80
- Nginx пересилає запит на 127.0.0.1:3000
- Бекенд обробляє запит
- Відповідь повертається через Nginx
- Клієнт отримує відповідь
Типові помилки та усунення проблем
Бекенд не запущений
- Переконайтесь, що застосунок працює
- Перевірте правильність порту
ss -tuln | grep 3000
Неправильний proxy_pass
- Обов'язково вказуйте
http:// - Перевірте IP-адресу та порт
Забули перезавантажити Nginx
Після кожної зміни:
sudo systemctl reload nginx
Брандмауер блокує доступ
Відкрийте порт 80:
sudo ufw allow 80
Додаткові покращення
Після налаштування зворотного проксі можна:
- Увімкнути HTTPS за допомогою Let's Encrypt
- Запустити кілька бекенд-застосунків
- Додати access- та error-логи
- Налаштувати балансування навантаження
- Додати підтримку WebSocket
Налаштування HTTPS
У продакшн-середовищі завжди слід використовувати HTTPS замість HTTP. HTTPS шифрує трафік між клієнтом і сервером, захищаючи паролі, API-токени, cookie та інші конфіденційні дані. Nginx підтримує HTTPS за допомогою SSL/TLS-сертифікатів. У цьому розділі ви дізнаєтесь:
- Що таке Certbot
- Як встановити Certbot
- Як Certbot автоматично змінює конфігурацію Nginx
- Як вручну налаштувати Nginx із придбаним сертифікатом
Що таке Certbot?
Certbot — це інструмент, який автоматично отримує та встановлює безкоштовні SSL/TLS-сертифікати від Let's Encrypt. Він може:
- Запросити безкоштовний сертифікат
- Підтвердити володіння доменом
- Автоматично налаштувати Nginx
- Налаштувати автоматичне оновлення сертифікатів
Для початківців і більшості продакшн-середовищ Certbot — найпростіший і найбезпечніший спосіб увімкнути HTTPS.
Встановлення Certbot
Оновіть пакети:
sudo apt update
Встановіть Certbot і плагін для Nginx:
sudo apt install certbot python3-certbot-nginx
Пакет python3-certbot-nginx дозволяє Certbot автоматично змінювати конфігурацію Nginx.
Отримання та встановлення сертифіката
Перед запуском Certbot переконайтесь, що:
- Домен вказує на публічну IP-адресу сервера
- Nginx запущений
- Порти 80 і 443 відкриті у брандмауері
Запустіть:
sudo certbot --nginx
Certbot:
- Запитає, який домен потрібно захистити
- Підтвердить володіння доменом
- Автоматично змінить конфігурацію Nginx
- Перезавантажить Nginx
Certbot автоматично змінює конфігурацію Nginx. Він зазвичай додає новий серверний блок для порту 443 (HTTPS), додає шляхи до SSL-сертифікатів, налаштовує перенаправлення HTTP на HTTPS (якщо ви це оберете), та додає рекомендовані SSL-налаштування.
Приклад конфігурації, доданий Certbot:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 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; } }
Certbot також може змінювати блок HTTP для перенаправлення трафіку:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Оскільки Certbot автоматично редагує файли конфігурації, рекомендується:
- Зберігати резервні копії вашої конфігурації
- Розуміти, які зміни були внесені
- Завжди тестувати конфігурацію після змін
Перевірте конфігурацію:
sudo nginx -t
Автоматичне оновлення сертифікатів
Сертифікати Let's Encrypt дійсні 90 днів. Certbot автоматично налаштовує таймер оновлення. Перевірку можна виконати за допомогою:
sudo certbot renew --dry-run
Якщо все налаштовано правильно, оновлення відбуватиметься автоматично без простоїв.
Використання придбаного SSL-сертифіката
Якщо ви купуєте SSL-сертифікат у центрі сертифікації (CA), ви повинні налаштувати Nginx вручну. Після купівлі ви зазвичай отримуєте:
- Файл сертифіката (наприклад,
example.com.crt) - Приватний ключ (
example.com.key) - CA bundle (
ca_bundle.crt)
Створіть захищений каталог:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Скопіюйте файли сертифікатів у цей каталог.
Приклад конфігурації HTTPS із придбаним сертифікатом:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; 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; } }
Додайте HTTP - HTTPS редірект:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Після змін перезавантажте Nginx:
sudo nginx -t
sudo systemctl reload nginx
Для початківців системних адміністраторів рекомендується використовувати Certbot, якщо немає вимоги щодо комерційних сертифікатів.
Підсумок
У цьому посібнику ви дізналися:
- Що таке зворотний проксі
- Як Nginx пересилає запити бекенд-застосункам
- Як створити й увімкнути конфігурацію
- Як тестувати та усувати помилки
- Як налаштувати HTTPS
Налаштування Nginx як зворотного проксі — базова навичка системного адміністратора, яка широко використовується в продакшн-середовищах.