Зворотний проксі — це сервер, який знаходиться перед одним або кількома веб-серверами, перехоплюючи запити клієнтів і пересилаючи їх відповідному бекенд-серверу, а потім повертаючи відповідь сервера клієнту так, ніби вона надійшла від самого проксі. Він діє як посередник, представляючи єдиний інтерфейс для зовнішніх клієнтів, одночасно керуючи внутрішніми серверними ресурсами.
Що таке зворотний проксі?
Зворотний проксі працює на межі мережі, між клієнтами та вихідними серверами. Коли клієнт робить запит на ресурс, запит спочатку надсилається до зворотного проксі. Потім зворотний проксі вирішує, який бекенд-сервер має обробити запит, пересилає запит цьому серверу, отримує відповідь і передає її назад клієнту. Цей процес прозорий для клієнта, який сприймає відповідь як таку, що надходить безпосередньо від зворотного проксі.
Ця архітектура контрастує з прямим проксі, який знаходиться перед клієнтами та пересилає їхні запити до зовнішніх серверів в інтернеті. Прямий проксі захищає анонімність клієнтів і фільтрує вихідний трафік, тоді як зворотний проксі захищає та оптимізує бекенд-сервери.
Чому вам потрібен зворотний проксі
Впровадження зворотного проксі пропонує кілька переваг для веб-додатків і сервісів, насамперед покращуючи безпеку, продуктивність і надійність.
Покращена безпека
Зворотний проксі функціонує як критичний рівень безпеки для бекенд-інфраструктури.
* Абстракція: Він приховує IP-адреси та характеристики вихідних серверів. Клієнти спілкуються лише зі зворотним проксі, що запобігає прямому розкриттю деталей бекенд-сервера.
* Зменшення атак: Зворотні проксі можуть фільтрувати шкідливий трафік, ідентифікувати та блокувати поширені шаблони атак (наприклад, SQL-ін'єкції, міжсайтовий скриптинг) і поглинати великі обсяги запитів під час DDoS-атаки (розподілена відмова в обслуговуванні), тим самим захищаючи бекенд-сервери від перевантаження.
* Централізовані політики безпеки: Політики безпеки, такі як правила брандмауера веб-додатків (WAF) або елементи керування доступом, можуть бути уніфіковано застосовані на рівні зворотного проксі для всіх бекенд-додатків.
Балансування навантаження
Для додатків, що вимагають високої доступності та масштабованості, балансування навантаження є важливим.
* Розподіл трафіку: Зворотний проксі розподіляє вхідні запити клієнтів між кількома бекенд-серверами. Це запобігає тому, щоб будь-який окремий сервер став вузьким місцем, і забезпечує оптимальне використання ресурсів.
* Висока доступність: Якщо бекенд-сервер виходить з ладу або перестає відповідати, зворотний проксі може виявити проблему та автоматично перенаправити трафік на справні сервери, підтримуючи безперервну доступність послуг.
* Алгоритми балансування навантаження: Можуть бути використані різні алгоритми, зокрема:
* Round Robin: Розподіляє запити послідовно на кожен сервер.
* Least Connections: Маршрутизує запити до сервера з найменшою кількістю активних з'єднань.
* IP Hash: Направляє запити з однієї IP-адреси клієнта до одного бекенд-сервера, що корисно для підтримки "липкості" сесії.
Кешування
Зворотні проксі можуть значно покращити продуктивність додатків за допомогою кешування.
* Зменшення навантаження на вихідні сервери: Статичний контент (наприклад, зображення, файли CSS, JavaScript) і часто доступний динамічний контент можуть зберігатися в кеші зворотного проксі. Наступні запити на цей контент обслуговуються безпосередньо з кешу, зменшуючи навантаження на бекенд-сервери.
* Швидший час відповіді: Обслуговуючи контент з географічно ближчого або легкодоступного кешу, зворотні проксі зменшують затримку та покращують сприйняту швидкість для клієнтів.
Завершення SSL/TLS
Обробка зашифрованого зв'язку може бути інтенсивною для процесора бекенд-серверів.
* Розвантаження шифрування: Зворотний проксі може завершувати SSL/TLS-з'єднання від клієнтів. Він розшифровує вхідні запити, пересилає їх (потенційно незашифрованими або повторно зашифрованими) до бекенд-серверів і шифрує відповіді перед відправленням їх назад клієнтам.
* Покращення продуктивності: Розвантаження криптографічних операцій на зворотний проксі звільняє ресурси бекенд-сервера, дозволяючи їм зосередитися на логіці програми.
* Централізоване керування сертифікатами: Усі SSL/TLS-сертифікати можна керувати в одній точці, що спрощує поновлення та розгортання сертифікатів.
Стиснення
Оптимізація розміру передачі даних має вирішальне значення для продуктивності.
* Економія пропускної здатності: Зворотні проксі можуть стискати відповіді сервера (наприклад, за допомогою Gzip або Brotli) перед відправленням їх клієнтам. Це зменшує обсяг даних, що передаються по мережі, економлячи пропускну здатність і прискорюючи час завантаження сторінок, особливо для клієнтів з повільнішим з'єднанням.
Перезапис URL та A/B тестування
Зворотні проксі пропонують гнучкість в управлінні маршрутизацією запитів.
* Гнучкі правила маршрутизації: Вони можуть перезаписувати URL-адреси, змінювати заголовки або направляти конкретні запити до різних бекенд-сервісів на основі визначених правил (наприклад, шлях URL, заголовки HTTP, файли cookie). Це полегшує архітектури мікросервісів та функціональність API-шлюзів.
* A/B тестування: Маршрутизуючи відсоток користувачів або певні сегменти користувачів до іншої версії програми (наприклад, розгортання нової функції), зворотні проксі дозволяють проводити A/B тестування без необхідності модифікацій на стороні клієнта або змін DNS.
Централізоване ведення журналів та моніторинг
Усі запити клієнтів проходять через зворотний проксі, забезпечуючи єдину точку збору даних.
* Уніфіковане джерело даних: Журнали запитів, шаблони доступу та показники продуктивності можуть централізовано збиратися та аналізуватися на зворотному проксі. Це спрощує моніторинг, усунення несправностей та аудит безпеки для кількох бекенд-сервісів.
Як працює зворотний проксі
Операційний потік зворотного проксі включає кілька кроків:
1. Запит клієнта: Клієнт надсилає HTTP/S-запит до доменного імені, пов'язаного зі зворотним проксі.
2. Прийом запиту: Зворотний проксі отримує запит.
3. Застосування політики: Зворотний проксі застосовує налаштовані правила, які можуть включати:
* Перевірки безпеки (WAF, обмеження швидкості).
* Пошук у кеші (якщо вміст кешовано, він обслуговується безпосередньо).
* Завершення SSL/TLS (якщо застосовно).
* Застосування алгоритму балансування навантаження для вибору бекенд-сервера.
4. Пересилання запиту: Зворотний проксі пересилає запит обраному бекенд-серверу. Він може змінювати заголовки (наприклад, X-Forwarded-For для збереження оригінальної IP-адреси клієнта).
5. Обробка бекендом: Бекенд-сервер обробляє запит і генерує відповідь.
6. Прийом відповіді: Зворотний проксі отримує відповідь від бекенд-сервера.
7. Модифікація відповіді: Зворотний проксі може застосовувати подальші модифікації, такі як стиснення, перед відправленням відповіді клієнту.
8. Відповідь клієнту: Зворотний проксі надсилає остаточну відповідь клієнту, виступаючи як вихідний сервер.
Зворотний проксі проти прямого проксі
Хоча обидва типи проксі діють як посередники, їх призначення та розташування значно відрізняються.
| Функція | Зворотний проксі | Прямий проксі |
|---|---|---|
| Призначення | Захищає та оптимізує бекенд-сервери | Захищає та оптимізує доступ клієнта до інтернету |
| Хто використовує | Власник сервера/веб-сайту | Клієнт/користувач (або організація від імені користувачів) |
| Позиція | Знаходиться перед вихідними серверами | Знаходиться перед клієнтами |
| Видимість | Клієнт бачить проксі; бекенд-сервери бачать проксі | Вихідний сервер бачить проксі; клієнт бачить проксі |
| Основні цілі | Балансування навантаження, безпека, кешування, завершення SSL | Анонімність, контроль доступу, фільтрація контенту, кешування |
| Потік трафіку | Клієнт -> Зворотний проксі -> Вихідний сервер | Клієнт -> Прямий проксі -> Інтернет -> Вихідний сервер |
Поширене програмне забезпечення зворотного проксі
Кілька надійних програмних рішень широко використовуються для реалізації зворотних проксі:
* Nginx: Високопродуктивний веб-сервер, також відомий своїми можливостями зворотного проксі, балансувальника навантаження та кешу HTTP.
* Apache HTTP Server: Завдяки модулям, таким як mod_proxy, Apache може функціонувати як зворотний проксі, хоча Nginx часто віддають перевагу для проксі-серверів з високим трафіком.
* HAProxy: Спеціально розроблений для високодоступного балансування навантаження та проксі-серверів для додатків на основі TCP та HTTP.
* Envoy Proxy: Відкритий вихідний код периферійного та сервісного проксі, розроблений для хмарних додатків, часто використовується в архітектурах сервісних мереж.
* Cloudflare: Популярна мережа доставки контенту (CDN), яка також функціонує як глобальний сервіс зворотного проксі, пропонуючи функції безпеки, продуктивності та надійності.
Приклад конфігурації зворотного проксі Nginx
Базова конфігурація Nginx для зворотного проксі, що розподіляє запити на два бекенд-сервери (наприклад, backend1.example.com та backend2.example.com):
http {
# Визначити групу бекенд-серверів для балансування навантаження
upstream backend_servers {
# Визначення бекенд-серверів. Nginx за замовчуванням використовуватиме round-robin.
server backend1.example.com;
server backend2.example.com;
# server 192.168.1.100:8080; # Також можна використовувати IP:порт
}
server {
listen 80; # Слухати вхідні HTTP-запити на порт 80
server_name yourdomain.com www.yourdomain.com; # Ваше доменне ім'я
# Визначити, як обробляти запити для кореневого шляху та підшляхів
location / {
# Передати запит до групи upstream, визначеної вище
proxy_pass http://backend_servers;
# Зберегти оригінальний заголовок Host від клієнта
proxy_set_header Host $host;
# Зберегти оригінальну IP-адресу клієнта
proxy_set_header X-Real-IP $remote_addr;
# Додати IP-адресу клієнта до заголовка X-Forwarded-For
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Зберегти оригінальний протокол (HTTP або HTTPS)
proxy_set_header X-Forwarded-Proto $scheme;
# Додатково: Налаштувати параметри тайм-ауту
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Приклад для HTTPS (завершення SSL на проксі)
# listen 443 ssl;
# ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
# ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# ... інші налаштування SSL ...
# location / {
# proxy_pass http://backend_servers; # Трафік до бекенду може бути HTTP
# ... заголовки ...
# }
}
}