Настройка связки Apache и Nginx в Debian 7

Материал из Home wiki
Версия от 20:12, 24 июля 2018; KOleg (обсуждение | вклад) (→‎Установка mod_rpaf)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Настройка связки Apache(2.2.X) и Nginx в Debian 7

У ставшего стандартным LAMP-сервера имеется ряд существенных недостатков. К примеру, mod_php требует использования mpm_prefork_module, то есть отсутствует поддержка нитей и для обработки запросов создаются полноценные процессы, на что требуется время и оперативная память. И памяти требуется очень много: от нескольких мегабайт до нескольких десятков, иногда сотен мегабайт, но это скорее зависит от обрабатываемых скриптов. В любом случае, не эффективно расходовать 10 мегабайт на отдачу маленькой картинки.

В связи с этим кажется разумной мысль найти легковесное решение для отдачи статики, а на Apache возложить только обработку php-скриптов. Таким решением стал проксирующий веб-сервер nginx. Есть и альтернативные решения, но они не столько популярны.

Почему бы вообще не отказаться от Апача? Решение Apache + mod_php стало стандартным и все к нему привыкли. Кроме того, все привыкли к .htaccess и mod_rewrite. Связка Apache + Nginx в Debian позволяет оставить привычную среду для исполнения скриптов и устранить узкие места. То есть повышается скорость отдачи статики и снижается потребление оперативной памяти.

В итоге будем иметь следующее: Nginx будет получать запросы от пользователей и в случае, если клиент запрашивает файл с расширением из заданного списка, то обрабатывает запрос самостоятельно, в противном случае передает запрос на Apache, получает результат и передает его пользователю.

Будем считать, что на вашем сервере LAMP уже установлен и работает.


Установка nginx в Debian

Существуют официальные репозитории nginx. Для их использования создадим файл /etc/apt/sources.list.d/nginx.list и добавим в него следующие строки:

deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx

После чего следует добавить PGP-ключ, обновить базу пакетов и установить nginx:

wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
aptitude update
aptitude install nginx

Посмотреть версию nginx:

nginx -v
nginx version: nginx/1.6.1

UPD. Как подсказывают в комментариях, если устанавливать nginx сразу из репозитория разработчиков, то директории /etc/nginx/sites-enabled и /etc/nginx/sites-available не создадутся. Поэтому, возможно, лучше сначала установить из дебиановского репозитория и затем обновить из репозитория разработчиков, как указано выше.

Стоит обратить внимание на то, что nginx не поддерживает подключение модулей “на лету” (как apache) и следует сразу выбрать версию (light, full, extras) с нужными модулями, иначе для их подключения придется компилировать nginx вручную. Подробнее ознакомиться с доступными пакетами под разные дистрибутивы Linux можно на странице http://nginx.org/en/linux_packages.html

Если у вас уже установлен Apache, то nginx не запустится, так как 80 порт уже занят.


Настройка Apache

По умолчанию Apache слушает на всех интерфейсах на 80 порту, который нам нужно освободить для nginx. Поэтому мы перевесим Apache на внутренний интерфейс и 81 порт.

Для этого в файле /etc/apache2/ports.conf приводим пару строк к такому виду:

NameVirtualHost *:81
Listen 127.0.0.1:81

А также придется поправить порты во всех виртуальных хостах, ссылки на которые в Debian расположены в директории /etc/apache2/sites-enabled/:

<VirtualHost *:81>

Смысл использования внутреннего интерфейса в снижении поверхности атаки, а порт изменяется для того, чтобы не пересекаться с nginx.

После перезапуска Apache ваши сайты будут недоступны. Поэтому стоит заранее настроить nginx чтобы можно было его сразу запустить.


Настройка Nginx

В nginx порт, на котором слушать, указывается для каждого виртуального хоста в отдельности. Кроме того, для каждого сайта, который у вас уже был настроен в Apache, нужно создать отдельный файл в /etc/nginx/sites-available/ и затем сделать симлинк в /etc/nginx/sites-enabled/. Рассмотрим содержимое файла виртуального хоста на примере этого сайта:

server {
listen 80;
server_name debian-help.ru www.debian-help.ru;

location / {
proxy_pass http://127.0.0.1:81;
}

location ~* \.(html|jpeg|jpg|gif|png|css|js|pdf|txt|tar|ico)$ {
root /var/www/debianhelp/;
expires 60d;
}
}

Указываем на каком порту слушать и на какие доменные имена откликаться. Указываем, что все запросы нужно перенаправлять на Apache, кроме запросов к файлам с определенными расширениями, которые нужно обрабатывать самостоятельно, для которых указана корневая директория и время хранения их в кэшах браузеров пользователей.

Осталось сделать симлинк:

ln -s /etc/nginx/sites-available/debianhelp /etc/nginx/sites-enabled/

Однако для Apache теперь адресом источника входящего запроса будет адрес, на котором слушает nginx, так как nginx, принимает запросы и передает их дальше уже от своего имени, что может отразиться на работоспособности сайтов. Нам нужно передавать информацию об адресе клиента в отдельном заголовке, а также научить apache читать эти заголовки.

По умолчанию, nginx читает дополнительные конфигурационные файлы из директории /etc/nginx/conf.d/. Создадим в этой директории файл proxy.conf и добавим в него строки:

proxy_redirect              off;
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

Теперь nginx можно запускать.


Установка mod_rpaf

Фактически, mod_rpaf нужно только установить и проверить, чтобы он был подключен к Apache.

aptitude install libapache2-mod-rpaf
apachectl -M

Если в списке нет rpaf_module (shared), то делаем симлинк из директории /etc/apache2/mods-available в /etc/apache2/mods-enabled и перезапускаем Apache. Данный модуль нужен только в Apache версии 2.2.х !

Выводы

В результате настройки связки Apache и Nginx в Debian запросы от пользователей будет получать nginx и в зависимости от того, что запрашивается, будет выдавать результат либо самостоятельно, либо передавать дальше. Целью является разгрузить достаточно тяжелый Apache передавая ему только запросы на выполнение php-скриптов. Тем самым мы ускоряем работу сайтов и снижаем потребление оперативной памяти. Кроме того, получаем больше гибкости в настройке сервера беря лучшее от обоих программ.,