База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Настройка проксирования на примере связки nginx + Apache

При настройке окружения зачастую используют связку веб-серверов nginx+Apache. Как правило, запросы к статическим страницам nginx обрабатывает и отдает клиенту самостоятельно, а к динамическим — передает веб-серверу Apache, выступающим в качестве backend.

Рассмотрим пример настройки подобного проксирования на ОС Ubuntu.

На стороне nginx

Задача реализуема с помощью модуля ngx_http_proxy_module. Подробно о параметрах проксирования рассказано в документации.

В случае с Ubuntu, путь до конфигурационного файла следующий:/etc/nginx/nginx.conf.

Простой пример:

server {

    location / {

        proxy_pass http://localhost:8080/;

    }

    location ~ \.(gif|jpg|png)$ {

        root /data/images;

    }

}

В результате запросы, оканчивающиеся на .gif, .jpg или .png, будут обработаны nginx и направлены в директорию /data/images.

Все остальные запросы будут направлены на проксируемый сервер, который локально слушает порт 8080.

Передача заголовков на проксируемый сервер

При проксировании можно переопределять или добавлять значения заголовков запроса, которые передаются на backend. Если в заголовке — пустая строка, то это поле вообще не будет передаваться проксируемому серверу.

Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивы proxy_set_header.

По умолчанию переопределяются только два поля:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

Передаем на backend заголовки Host, IP и Cookie исходного запроса, поступившего на nginx, в неизменном виде:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass_header Cookie;

ВАЖНО! Если включено кеширование, заголовки “If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range” и “If-Range” исходного запроса не передаются на проксируемый сервер.

Кеширование результатов ответа backend

Кеширование позволяет сократить количество направляемых на backend запросов — nginx сохраняет результат обработки запроса веб-сервером Apache и при следующем обращении к той же странице отдаёт именно его.

По умолчанию кешируются только ответы с кодами 200, 301 и 302.

Основные параметры:

  • proxy_cache — определяет, какой кеш использовать;
  • proxy_cache_valid — позволяет задать время кеширования для разных кодов ответа;
  • proxy_cache_key — используется для конкретных запросов;

Пример конфигурации, при которой все ответы от Apache кешируются на 1 час, а коды 404, 502 и 503 — на 1 минуту:

proxy_cache all;
proxy_cache_valid 404 502 503 1m;
proxy_cache_valid any 1h;
proxy_cache_key "$binary_remote_addr$request_method$uri";
proxy_cache_valid 30m;

Настройка, при которой запросы одного метода с одного и того же IP к определенной странице будут отдаваться из кеша в течение 30 минут:

proxy_cache_key "$binary_remote_addr$request_method$uri";
proxy_cache_valid 30m;

Итоговый файл конфигурации, включающий в себя все ранее описанные случаи:

server {
location / {
proxy_pass http://localhost:8080/;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass_header Cookie;

proxy_cache_valid 404 502 503 1m;
proxy_cache_valid any 1h;
proxy_cache_key "$binary_remote_addr$request_method$uri";
proxy_cache_valid 30m;
}

location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

Перед применением изменений желательно убедиться, что файл конфигурации не содержит ошибок, с помощью команды:

nginx -t

После чего, чтобы изменения вступили в силу, перезапустить сервис nginx:

systemctl restart nginx

На стороне Apache

По умолчанию веб-сервер Apache слушает 80-й порт, но в данной ситуации его использует nginx, и для Apache необходимо задать альтернативный порт. Новое значение порта должно совпадать с тем, что задано в конфигурационном файле nginx (в нашем случае это — 8080).

Конфигурационный файл Apache в большинстве случаев находится здесь:

/etc/apache2/apache2.conf

Пример содержимого:

 
ServerName domain.ru
ServerAlias www.domain.ru
DocumentRoot /var/www/domain.ru
... #другие параметры

Редактировать заголовки запроса/ответа позволяет модуль mod_headers, устанавливаемый при сборке Apache по умолчанию.

Так как ранее в конфигурационный файл nginx мы включили заголовок X-Real-IP, необходимо настроить Apache для обработки этого заголовка, чтобы получить реальное значение IP-адреса посетителя. Для этого используется модуль mod_remoteip. В версиях Apache >2.4 этот модуль присутствует по умолчанию, активировать его можно командой:

a2enmod remoteip

Если используется версия Apache ниже 2.4, необходимо установить и активировать модуль mod_rpaf:

apt install libapache2-mod-rpaf
a2enmod rpaf

Перезагружаем сервис, чтобы применить изменения:

systemctl reload apache2


Была ли эта инструкция полезной?