Гид по технологиям

Настройка nginx как обратного прокси перед Apache2 на Ubuntu 16.04

• 5 min read • Серверы • Обновлено 28 Nov 2025
nginx как обратный прокси перед Apache на Ubuntu
nginx как обратный прокси перед Apache на Ubuntu

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). Есть два основных подхода:

  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
  1. На Debian/Ubuntu установить модуль libapache2-mod-rpaf, который заменяет клиентский IP на значение из X-Forwarded-For автоматически:
apt-get -y install libapache2-mod-rpaf

После изменений перезапустите Apache:

service apache2 restart

Callout: Важное — проверьте, что никаких других сервисов не слушают порт 8000 и что firewall позволяет доступ между nginx и Apache на localhost.

Конфигурирование nginx

Если nginx не установлен:

apt-get -y install nginx

Создайте системные ссылки и запустите сервис:

systemctl enable nginx.service  
service nginx restart

nginx теперь должен слушать порт 80.

Некоторые стандартные proxy-параметры находятся в /etc/nginx/proxy_params. Откройте файл и проверьте/добавьте необходимые заголовки:

nano /etc/nginx/proxy_params
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;

Вы можете расширить этот файл дополнительными настройками проксирования (таймауты, размеры буферов и т. д.). Пример дополнительных параметров:

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/default
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;  
     }  
}

Это простая конфигурация, которая проксирует все запросы в Apache. Примените изменения:

service nginx reload

Теперь введите hostname сервера или IP 192.168.1.100 в браузере — вы должны увидеть страницу Apache, отдаваемую через nginx.

Страница по умолчанию 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 — потребуется дополнительная обработка.

Мини-плейбук: шаги для деплоя (сокращённо)

  1. Сделать бэкап /etc/apache2 и /etc/nginx.
  2. Изменить Apache: Listen 8000, VirtualHost 127.0.0.1:8000.
  3. Настроить логирование Apache (rpaf или LogFormat с X-Forwarded-For).
  4. Установить nginx и настроить root в /var/www/html.
  5. Добавить location для статики и proxy_pass на localhost:8000.
  6. Перезагрузить services: service apache2 restart && service nginx reload.
  7. Проверить 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 хорошо работает как фронтенд для Apache: он ускоряет отдачу статических ресурсов, упрощает обработку TLS и даёт гибкие возможности кэширования. Перенастройка Apache на 127.0.0.1:8000 и правильная передача заголовков X-Forwarded-For — ключевые шаги. Для продакшена обязательно планируйте HTTPS и регулярно проверяйте правила кэширования, чтобы не кэшировать персонализированный контент.

Важно: этот туториал охватывает HTTP без SSL. Для продакшна добавьте настройку HTTPS и проверку совместимости вашего приложения с кэшированием и проксированием.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро