Настройка nginx как обратного прокси перед Apache2 на Ubuntu 16.04
nginx — свободный высокопроизводительный HTTP-сервер и обратный прокси. Коротко: nginx быстр с статикой, Apache удобен для сложной обработки и модулей. Эта инструкция покрывает только HTTP (без HTTPS) и ориентирована на Ubuntu 16.04.
Предварительное замечание
В примерах используется hostname server1.example.com и IP 192.168.1.100. Замените их на ваши адреса. Предполагается, что у вас уже есть Apache vhost, который слушает порт 80 на 192.168.1.100 — мы перенесём Apache на локальный порт 8000 и настроим nginx как фронтенд.
Важно: перед изменениями сделайте резервные копии конфигурационных файлов.
Конфигурирование Apache
Цель: перевести Apache с 0.0.0.0:80 на 127.0.0.1:8000, чтобы nginx мог проксировать запросы на него. Откройте /etc/apache2/ports.conf:
nano /etc/apache2/ports.confИзмените Listen и (если есть) NameVirtualHost для порта 80 на 8000:
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 8000
Listen 443
Listen 443
Затем поправьте vhost (например /etc/apache2/sites-available/000-default.conf), чтобы слушать 127.0.0.1:8000:
nano /etc/apache2/sites-available/000-default.conf
[...] Мы хотим, чтобы Apache логировал реальный IP клиента, а не адрес nginx (127.0.0.1). Есть два основных подхода:
- Подменить формат логов, чтобы использовать заголовок X-Forwarded-For. В /etc/apache2/apache2.conf замените %h на %{X-Forwarded-For}i:
nano /etc/apache2/apache2.conf#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined- На Debian/Ubuntu установить модуль libapache2-mod-rpaf, который заменяет клиентский IP на значение из X-Forwarded-For автоматически:
apt-get -y install libapache2-mod-rpafПосле изменений перезапустите Apache:
service apache2 restartCallout: Важное — проверьте, что никаких других сервисов не слушают порт 8000 и что firewall позволяет доступ между nginx и Apache на localhost.
Конфигурирование nginx
Если nginx не установлен:
apt-get -y install nginxСоздайте системные ссылки и запустите сервис:
systemctl enable nginx.service
service nginx restartnginx теперь должен слушать порт 80.
Некоторые стандартные proxy-параметры находятся в /etc/nginx/proxy_params. Откройте файл и проверьте/добавьте необходимые заголовки:
nano /etc/nginx/proxy_paramsproxy_set_header Host $http_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;Вы можете расширить этот файл дополнительными настройками проксирования (таймауты, размеры буферов и т. д.). Пример дополнительных параметров:
proxy_set_header Host $http_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;
client_max_body_size 100M;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;
proxy_read_timeout 300;Теперь изменим default vhost nginx так, чтобы корневая папка совпадала с документ-рутом Apache (/var/www/html), и nginx мог отдавать статические файлы напрямую:
nano /etc/nginx/sites-available/defaultserver {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}Это простая конфигурация, которая проксирует все запросы в Apache. Примените изменения:
service nginx reloadТеперь введите hostname сервера или IP 192.168.1.100 в браузере — вы должны увидеть страницу Apache, отдаваемую через nginx.

Отдача статических файлов напрямую nginx
Поскольку nginx быстрее отдает статические ресурсы, имеет смысл добавлять отдельную локацию для них. Пример:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
}
}Перезагрузите nginx:
service nginx reloadВы можете добавить заголовок Expires для кэширования браузером:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
expires 30d;
}
}Комбинация: nginx обслуживает максимум, Apache — остальное
Пример конфигурации, в которой nginx отдает статику и проксирует остальные запросы и PHP в Apache:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
expires 30d;
}
location @proxy {
proxy_pass http://127.0.0.1:8000;
include /etc/nginx/proxy_params;
}
location ~* \.php$ {
proxy_pass http://127.0.0.1:8000;
include /etc/nginx/proxy_params;
}
}Перезагрузите:
service nginx reloadВы также можете подключить proxy_cache для ускорения отдачи, если ваше приложение допускает кэширование (не кэшируйте страницы для залогиненных пользователей, корзины и captcha).
Дополнительные практики и отладка
- Проверка заголовков: используйте curl -I -H “Host: example.com” http://your-ip чтобы увидеть, какие заголовки идут к бэкенду.
- Логи Apache: после установки libapache2-mod-rpaf проверьте access.log — IP должен быть реальным клиентским.
- WebSocket: если приложение использует WebSocket, добавьте в конфигурацию nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; и proxy_http_version 1.1.
- Если приложение требует оригинального Host заголовка — убедитесь, что include /etc/nginx/proxy_params содержит proxy_set_header Host $http_host.
Когда это не сработает
- Приложение зависит от TCP-level информации (например, специфические моды Apache), которые не передаются через HTTP-прокси.
- Если вам нужны инкапсулированные соединения с сохранением IP на L4 (без X-Forwarded-For), то нужно использовать маршрутизацию на уровне сети или сопутствующие модули.
- Если приложение интенсивно полагается на сессии с привязкой по клиентскому IP и не доверяет X-Forwarded-For — потребуется дополнительная обработка.
Мини-плейбук: шаги для деплоя (сокращённо)
- Сделать бэкап /etc/apache2 и /etc/nginx.
- Изменить Apache: Listen 8000, VirtualHost 127.0.0.1:8000.
- Настроить логирование Apache (rpaf или LogFormat с X-Forwarded-For).
- Установить nginx и настроить root в /var/www/html.
- Добавить location для статики и proxy_pass на localhost:8000.
- Перезагрузить services: service apache2 restart && service nginx reload.
- Проверить headers и логи.
Чек-лист по ролям
Системный администратор:
- Сделать бэкапы конфигов.
- Перенастроить порты и перезапустить сервисы.
- Проверить, что firewall/SELinux не блокируют соединения.
Разработчик/DevOps:
- Проверить соответствие корневой папки и прав файлов.
- Убедиться, что динамические запросы корректно обрабатываются на Apache.
- Настроить кэширование и исключения для логики приложения.
Инженер по безопасности:
- Проверить заголовки X-Forwarded-For и доверенные прокси.
- Отключить серверные баннеры (server_tokens off;).
- Планировать миграцию на HTTPS (Certbot/Let’s Encrypt).
Критерии приёмки
- Сайт доступен по порту 80 через nginx.
- Статические файлы отдаются nginx напрямую (проверено заголовком и временем ответа).
- Динамические/PHP-запросы корректно проксируются на Apache и приложение работает.
- Логи Apache содержат реальный IP из X-Forwarded-For.
- Перезагрузки сервисов не приводят к ошибкам конфигурации.
Ментальные модели и рекомендации
- Разделение обязанностей: nginx — статика, SSL, балансировка; Apache — сложная логика, модули, PHP через модуль.
- Минимизируйте количество проксируемых запросов: отдавайте статику из nginx.
- Безопасность: даже при работе через nginx, всё равно своевременно обновляйте Apache и nginx.
Небольшой глоссарий (1 строка)
- Reverse proxy — сервер, который принимает клиентские запросы и пересылает их на бэкенд-серверы.
- X-Forwarded-For — заголовок, содержащий исходный IP клиента при проксировании.
- proxy_pass — директива nginx, перенаправляющая запрос к указанному бэкенду.
Советы по безопасности и производительности
- Планируйте переход на HTTPS — используйте Certbot и настройте редирект HTTP->HTTPS.
- Отключите server_tokens в nginx для сокрытия версии.
- Следите за buffer/timeout параметрами в proxy_params для предотвращения DoS при больших upload’ах.
- Рассмотрите использование proxy_cache, если приложение позволяет кэширование.
Отладочные тесты / acceptance tests
- Тест 1: curl -I http://192.168.1.100 — ответ 200 от nginx.
- Тест 2: curl -I http://192.168.1.100/some-static.js — заголовок Expires присутствует.
- Тест 3: Проверить access.log Apache — IP клиента в первой колонке.
- Тест 4: Отправить POST большого файла, убедиться, что client_max_body_size позволяет загрузку.
Ссылки
- nginx: http://nginx.net/
- Apache: http://httpd.apache.org/
- Ubuntu: http://www.ubuntu.com/
Краткое резюме
nginx хорошо работает как фронтенд для Apache: он ускоряет отдачу статических ресурсов, упрощает обработку TLS и даёт гибкие возможности кэширования. Перенастройка Apache на 127.0.0.1:8000 и правильная передача заголовков X-Forwarded-For — ключевые шаги. Для продакшена обязательно планируйте HTTPS и регулярно проверяйте правила кэширования, чтобы не кэшировать персонализированный контент.
Важно: этот туториал охватывает HTTP без SSL. Для продакшна добавьте настройку HTTPS и проверку совместимости вашего приложения с кэшированием и проксированием.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента