Apache може функціонувати як зворотний проксі, пересилаючи запити клієнтів до серверів бекенду та повертаючи їхні відповіді, використовуючи модуль mod_proxy та пов'язані з ним підмодулі.
Зворотний проксі діє як посередник для запитів клієнтів, направляючи їх до одного або кількох внутрішніх серверів бекенду. Він представляє єдиний інтерфейс для інтернету, приховуючи внутрішню архітектуру мережі. Переваги включають підвищену безпеку, балансування навантаження, термінацію SSL/TLS, кешування та спрощене керування бекендом.
Увімкнення mod_proxy
Щоб налаштувати Apache як зворотний проксі, необхідно увімкнути основний модуль mod_proxy та специфічні підмодулі. Ці модулі забезпечують підтримку різних протоколів та функцій.
Основні модулі:
mod_proxy: Основний проксі-модуль.mod_proxy_http: Для проксіювання HTTP та HTTPS трафіку.mod_proxy_balancer: Необхідний для балансування навантаження між кількома серверами бекенду.mod_proxy_wstunnel: Для проксіювання WebSocket.mod_ssl: Якщо Apache оброблятиме термінацію SSL/TLS для клієнтських з'єднань.
Увімкніть модулі за допомогою команди a2enmod у системах на базі Debian/Ubuntu або розкоментувавши директиви LoadModule у httpd.conf у системах на базі CentOS/RHEL:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_wstunnel
sudo a2enmod ssl
sudo systemctl restart apache2
Базова конфігурація зворотного проксі HTTP
Основними директивами для зворотного проксі є ProxyPass та ProxyPassReverse. Конфігурація зазвичай розміщується в блоці <VirtualHost> або безпосередньо в httpd.conf.
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
# Proxy all requests for /app to a backend server
ProxyPass /app http://backend-app-server:8080/app
ProxyPassReverse /app http://backend-app-server:8080/app
# Proxy all requests for the root path / to another backend
ProxyPass / http://backend-web-server:8000/
ProxyPassReverse / http://backend-web-server:8000/
# For SSL/TLS termination at Apache, and forwarding HTTP to backend
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Ключові директиви
ProxyRequests Off: Це критично важливо. Ця директива вимикає можливості прямого проксі Apache, запобігаючи його використанню як відкритого проксі, що є значним ризиком безпеки. Для зворотного проксі ця директива завжди повинна бути встановлена наOff.ProxyPreserveHost On: Ця директива гарантує, що оригінальний заголовокHostіз запиту клієнта передається на сервер бекенду. Якщо встановленоOff, заголовокHostбуде встановлено на ім'я хоста та порт сервера бекенду.ProxyPass [path] [url]: Зіставляє локальний шлях URL (path) з URL бекенду (url). Apache перехоплює запити, що відповідаютьpath, і пересилає їх наurl.- Приклад:
ProxyPass /app http://backend-app-server:8080/appозначає, що запит доhttp://yourdomain.com/app/page.htmlпересилається наhttp://backend-app-server:8080/app/page.html.
- Приклад:
ProxyPassReverse [path] [url]: Переписує заголовкиLocation,Content-LocationтаURIу відповідях HTTP від сервера бекенду. Це гарантує, що перенаправлення або посилання, згенеровані бекендом, вказують на публічний URL проксі, запобігаючи викриттю клієнтам внутрішніх URL.<Proxy *>: Визначає контроль доступу для самого проксі.Require all grantedдозволяє всім клієнтам використовувати проксі. Для посилення безпеки можна дозволити певні IP-адреси або мережі.
Розширені функції mod_proxy
Балансування навантаження
mod_proxy_balancer дозволяє розподіляти вхідні запити між кількома серверами бекенду, підвищуючи доступність та масштабованість.
<VirtualHost *:80>
ServerName app.yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy balancer://mycluster>
BalancerMember http://backend1.internal:8080 route=1 loadfactor=10
BalancerMember http://backend2.internal:8080 route=2 loadfactor=10
# Optional: ProxySet for specific balancer settings
ProxySet lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
# For session stickiness, the backend must set a cookie like JSESSIONID
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24 # Restrict access to internal network
</Location>
</VirtualHost>
Атрибути BalancerMember
| Атрибут | Опис |