Установка и настройка 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.

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

Иллюстрация 1
Схема Nginx+Apache

 

 

 

 

 

 

 

 

 

 

 

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

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

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

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

sudo apt-get install nginx

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

user apache; #измените на тот же самый под которым запущен Apache
worker_processes 2; #измените на кол-во ваших процессоров/ядер
worker_rlimit_nofile 8192;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
  use epoll;
  accept_mutex off;
}

http {
  server_names_hash_bucket_size 64;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;

  # опции реверс-прокси
  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;

  # опции gzip сжатия
  gzip on;
  gzip_http_version 1.0;
  gzip_comp_level 6;
  gzip_min_length 0;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
  gzip_disable "MSIE [1-6].";
  gzip_vary on;

  # подключение конфигурационных файлов виртуальных хостов
  include /etc/nginx/virtual.d/*.conf;
}

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, со следующим содержимым:

server {
  listen 80;
  server_name DOMAIN.TLD www.DOMAIN.TLD;
  access_log off;
  error_log off;
  location / { proxy_pass http://127.0.0.1:8080; }
  location ~* ^.+.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|bz2|pdf|odt|txt|tar|bmp|rtf|js|swf|avi|mp4|mp3|ogg|flv)$ {
    expires 30d; #как часто обновлять ваш статичный контент
    root /srv/DOMAIN.TLD/html;
  }
}

Замените 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 для высвобождения системных ресурсов.

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

nginx -t

и

apachectl configtest

или

apache2ctl configtest

в 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 со следующим содержимым:

LoadModule rpaf_module modules/mod_rpaf-2.0.so

<IfModule mod_rpaf-2.0.c>
  RPAFenable On
  RPAFsethostname On
  RPAFproxy_ips 127.0.0.1
</IfModule>

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

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

Оцените статью
( Пока оценок нет )
Блог админа