Установка и настройка Nginx как frontend для Apache

Ни для кого не секрет, что большинство сайтов интернета работают на серверах под управлением Linux. так же ни для кого не секрет, что львиная доля этих сайтов написана на PHP работающему в связке с БД MySQL. А еще, многие в курсе, что Apache обслуживающий ваш сайт может жрать кучу памяти, серверного времени и вообще тормозить из-за так называемых медленных клиентов — это когда клиент с плохим каналом отправляет запрос на ваш сайт о получении страницы и апач честно отдает её ему и ждет, пока клиент получит эту информацию и вернет ответ об этом. Это узкое место апача, так как при таком подходе остальные клиенты ожидают своей очереди из-за одного медленного клиента. В это же время перестает обслуживаться выполнение скриптов и т.д. В общем ситуация достаточно тривиальная и можно было бы не обращать на это внимания, при условии что у вас сайт не получает к примеру одновременно по 500 посетителей каждую минуту. Что же делать если это именно так?

Выхода из ситуации два — либо ставить вместо Apache+php связку nginx+php-fpm (что в некоторых случаях может заставить вас пересмотреть используемые инструменты в виде CMS и т.п.), либо ставить nginx в качестве frontend для apache. Второй способ может быть и не так сильно ускорит ваш веб-сервер, зато никаких дополнительных настроек для работоспособности веб-ПО на нем выполнять не придется, особенно это касается систем управления контентов зависимых именно от apache.

Итак. Установка nginx в качестве frontend производится в 2 этапа. Первый — установка и настройка nginx, второй — настройка apache на прием запросов от nginx.

Установка и настройка nginx.

Во первых — наглядная картинка схемы работы системы которую мы хотим получить:

Схема Nginx+Apache
Схема Nginx+Apache

 

 

 

 

 

 

 

 

 

 

 

Схема упрощенная, так что гусарам молчать :)

В целом логика понятна — нжикс принимает запросы, статику отдает сразу, а то обработку динамики отдается апачу, который передает результат работы нжиксу и тот далее отдает её уже клиенту. Смысл в том, что нжикс для отдачи статичного контента не ожидает завершения выполнения скриптов как апач, а делает это сразу, паралельно ожидая от апача результата его работы.

Выполним установку и настройку. Я покажу как это сделать на примере Debian. Вам возможно будет удобнее сделать на своём дистрибутиве. Принцип один и тот же.

Устанавливаем Nginx:

Остановите nginx сервер если он был запущен автоматически пакетным менеджером и создайте новый конфигурационный файл nginx.conf к директории по умолчанию /etc/nginx by default – с содержимым примерно такого вида:

Nginx должен запускаться под тем же пользователем что и Apache чтобы избежать ошибок прав доступа. Замените apache на имя пользователя под которым ваш Apache запускается – обычно по умолчанию в Debian и Ubuntu это пользователь www-data. Кроме того в этом конфигурационном файле есть некоторые настройки для улучшения производительности, такие как use epoll — метод событийной модели эффективно работающая на ядрах Linux 2.6+. Эта опция работает в тандеме со следующей, accept_mutex off, что еще немного повышает производительность. Включение sendfile позволяет nginx использовать поддерживаемый ядром sendfile для отправки файлов клиенту вне зависимости от их содержимого. Это поможет при работе с большими статическими файлами — такими как картинки, которые не требуют обработки большого количества  запросов/подтверждений. Включение gzip сжатия для статики может дать вам большое увеличение производительности. Линия начинающаяся с gzip включает сжатие для определенных веб-файлов,  таких как .css и .js файлы, поддерживаемых браузером. Вы можете более полно узнать обо всех доступных опциях в документации к nginx, на wiki проекта.

Создайте директорию /etc/nginx/virtual.d и файл DOMAIN.TLD.conf для каждого виртуального хоста настроенного в Apache, со следующим содержимым:

Замените DOMAIN.TLD на нужное доменное имя, а /srv/DOMAIN.TLD/html на публично-доступную директорию домена. Так же удалите или добавьте расширения файлов определяющих что у вас является статичным контентом; эти файлы будут обслуживать nginx.

Настройка Apache

Теперь у нас nginx работает в качестве frontend веб-сервера, и ожидает запросов на порту 80 – значит вам нужно сконфигурировать Apache для прослушивания другого порта (8080 например) и только запросов посылаемых от имени localhost. В Debian и Ubuntu откройте файл /etc/apache2/ports.conf и измените строку

Listen 80

на

Listen 127.0.0.1:8080.

На CentOS такие же настройки выполняются в файле /etc/httpd/conf/httpd.conf file. В зависимости от вашего дистрибутива, если вы используете name-based виртуальные хосты, вы должны изменить строку

NameVirtualHost *:80

на

NameVirtualHost *:8080.

Если вы настраивали поддержку Keep-Alive в Apache вы должны отключить её, так как она уже поддерживается вашим nginx. Измените

KeepAlive On

на

KeepAlive Off

в файле /etc/httpd/conf/httpd.conf (CentOS) или/etc/apache2/apache2.conf (Debian/Ubuntu).

Вы так же можете отключить модуль mod_deflate так как nginx уже выполняет gzip сжатие. Хорошей идеей будет отключить вообще все неиспользуемые модули Apache для высвобождения системных ресурсов.

Оба сервера теперь должны запускаться без проблем. Если один из них не стартует, проверьте конфигурации:

и

или

в Debian/Ubuntu.

В этом месте наших настроек, если вы посмотрите в файл access.log у Apache вы увидите что все входящие запросы идут только с адреса 127.0.0.1. Для исправления ситуации вам требуется установить mod_rpaf. Пользователи Debian и Ubuntu могут установить пакет libapache2-mod-rpaf  и перезапустить Apache. На CentOS придется установить модуль из исходников. Дополнительно вам потребуются для этого пакеты httpd-devel и gcc. После установки создайте файл /etc/httpd/conf.d/mod_rpaf.conf со следующим содержимым:

Пользователям Debian так же следует проверить файл /etc/apache2/mods-enabled/rpaf.conf на предмет того, что строка с параметром RPAFproxy_ips выглядит так же как в примере для CentOS выше. После перезапуска Apache в файле access.log все IP адреса будут выглядеть нормально, но информации в логе поубавиться. Это нормально, так как статичный контент у нас теперь обрабатывается через nginx.

На этом всё. Надеюсь вам будет полезно :)

Автор: Mirivlad

Скромный труженик консоли и окошек.