Настройка связки веб серверов Nginx и Apache

Несмотря на то, что эта тема изрядно избита и  в интернете по этому поводу написано уйму статей, я всё же не могу просто обойти эту тему стороной и ничего про это не сказать и пусть даже мой пост-manual, возможно, будет не самым длинным и подробным, но зато я постараюсь описать ключевые аспекты настройки связки (взаимодействия) веб серверов и на одном сервере.

Сразу скажу, что эта статья будет побольше похожа на инструкцию (manual — учебник) содержащую в себе алгоритм действий.

Естественно понятие взаимодействия или связки веб серверов представляет под собой некоторою работу в паре, т.е. всё выстроено по иерархии. Один сервер стоит «сверху» и общается с клиентом, его называют фронтендом, другой «снизу» или «сзади», его называют бэкендом. Если выражаться более корректно, то один сервер частично выступает в роли прокси сервера (proxy server), а другой выполняет свою прямую обязанность выступая в роли веб сервера ( server). Поскольку nginx требует меньше ресурсов системы, поэтому в роли proxy сервера выступает именно он. Т.е. nginx получает запросы и смотрит, что именно запрашивается, если статические файлы, то он сам выступает в роли сервера и сразу отдаёт клиенту статику, если же запрашиваются динамические файлы, то он работает в режиме proxy и отдаёт запрос на обработку серверу apache, после чего получает ответ и отдаёт его клиенту.

Стоит заметить, что в настройке той самой связки nginx и apache ничего сложно нет, просто перекидываем apache на другой порт, отличный от 80, который предназначен для http протокола, а на 80-ый сетевой порт «вешаем» веб сервер nginx, который и будет разбирать запросы и отвечать клиентам работая прокси сервером.

Для чего это нужно?

Наверно это и ежу понятно, но я вкратце отвечу. Нужно это для повышения производительности системы, т.е. для снижения нагрузки ибо сам мощный и популярный веб сервер apache слишком требователен к ресурсам даже по пустякам. Поэтому обычно статику отдаёт прокси сервер nginx а динамику (серверные скрипты) обрабатывает apache.

Настройка веб серверов

С логикой работы вроде разобрались. Статические файлы отдает nginx, а динамикой занимается apache. Теперь давайте приступать к работе. Рассказывать я буду на примере операционной системы Linux Ubuntu.

Шаг первый: установка веб сервера Apache, интерпретатора PHP, СУБД и веб сервера nginx.

Установка веб сервера Apache:

apt-get install apache2

Установка интерпретатора языка PHP:

apt-get install php5-cli

Советую ставить его как модуль к Apache ибо так проще, быстрее и производительнее нежели использовать интерфейс fastCGI.
Установка СУБД MySQL:

apt-get install mysql-server
apt-get install mysql-client-core-5.1

Установка web сервера nginx:

apt-get install nginx

Конфигурации nginx

  • путь /etc/nginx/ — тут конфиги сервера nginx находятся
  • файл nginx.conf — главный файл конфигов
  • папка sites-enabled/ — конфигурации отдельных сайтов
  • папка conf.d/ — дополнительные конфигурационные файлы сервера nginx

Apache ставим на прослушку любого порта кроме 80

Шаг второй: Вешаем apache на порт 8080 (или на другой, кроме 80).
Вносим изменения в конфигурацию апача, а точнее в файл ports.conf, который находится здесь: /etc/apache2/ports.conf. Правим следующие директивы.

NameVirtualHost *:8080
Listen 8080

Все виртуальные хосты (сайты) тоже нужно повесить на порт 8080. Директива Listen может быть и в основном файле конфигурации веб сервера apache — apache2.conf, поэтому обязательно это учтите при поиске данной директивы. Я так заостряю на этом внимание потому, что эту директиву нельзя прописывать более одного раза, т.е. она не перекрывается. Иначе вы не сможете запустить веб сервер и операционная система скажет, что порт уже занят.

Если не хотите, чтобы ваши сайты отдавались клиентам напрямую задним веб-сервером Apache при запросе их через сетевой порт 8080 и были доступны таким образом, то в директивах VirtualHost указываем, что прослушивать сетевой порт 8080 надо не отовсюду а только в запросах с локального хоста, т.е. от сервера-фронтэнда.
Заменяем это:

<VirtualHost *:8080>

На это:

<VirtualHost 127.0.0.1:8080>

При это не исключены возможные глюки, поэтому тестируйте сразу. В частности могут быть нежелательные серверные редиректы с других доменов на этот.

Шаг третий: Настраиваем nginx. Вешаем nginx именно на порт 80, для http протокола.

В отличие от apache веб сервер nginx характерен тем, что прослушиваемые порты для него надо прописывать для каждого «сервера». Т.е. порт 80 надо писать для каждого виртуального хоста.

Создаем дополнительный файл конфигурации в директории /etc/nginx/sites-available или же дописываем существующий файл конфигов nginx расположенный по адресу /etc/nginx/nginx.conf. Я лично предпочитаю второй вариант, когда всё в одном файле. Вообще не удобно лазить по миллиону разных папок особенно когда работаешь в консоли. Кто-то, конечно, скажет, что так удобнее и всё такое, но я скажу, что нет. Удобнее когда всё в одном файле, тем более все настройки понятны и известны и легче всё править в одном файле чем открывать миллионы файлов. У некоторых даже доходит до абсурда и они для каждого сайта создают отдельный файл, якобы так лучше и нагляднее. В общем создаём виртуальные хосты в настройках nginx, создаются они директивой server.

server {
    listen *:80; # listen for ipv4
    server_name ВАШ_ДОМЕН алиас_домена(опционально);
    access_log /var/log/nginx/access.log;
    # Перенаправление на back-end
    location / {
        proxy_pass http://127.0.0.1:8080; # говорим перенаправлять на локальный хост, на порт 8080, там "встретит" apache
        proxy_set_header Host $host; # далее просто передаём заголовки запроса
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120; # далее тайм-ауты на соединение, отправку и чтение ответа от бэкэнда
        proxy_send_timeout 120;
        proxy_read_timeout 180;
}
# Статическиое наполнение отдает сам nginx
# back-end этим заниматься не должен
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
        root ПУТЬ_ДО_КОРНЕВОГО_КАТАЛОГА_САЙТА; # для сайта который прописан в директиве server_name
    }
}

Шаг четвертый: установка модуля RPAF для Apache.

Установка модуля RPAF

Т.к. теперь все запросы к серверу Apache приходят не от удалённых клиентов, а от локального proxy сервреа Nginx, то в итоге IP адрес клиента Apache определяет как локальный (127.0.0.1). Для решения этой проблемы понадобится модуль RPAF. Он берет тело заголовка X-Forwarded-For, присланного от фронтенда (Nginx) и заменяет значение заголовка REMOTE_ADDR на бекенде (Apache).

CentOS

Установка в CentOS выполняется следующей командой:

yum install mod_rpaf

Debian/Ubuntu

В Debian или Ubuntu установка и включение модуля RPAF в Apache выполняется следующими командами:

apt-get install libapache2-mod-rpaf
a2enmod rpaf

Настройка модуля RPAF

Файл конфигурации RPAF находится:
Debian/Ubuntu: /etc/apache2/mods-enabled/rpaf.conf
CentOS: /etc/httpd/conf.d/rpaf.conf

Он должен содержать следующие строки:

RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
RPAFheader X-Real-IP

Если у вас установлена ОС CentOS, то в начало этого файла обязательно добавьте строку:

LoadModule rpaf_module modules/mod_rpaf-2.0.so

Завершение настройки

На этом настройка связки nginx и apache закончена. Теперь нужно только перезапусть Apache и Nginx. Команды перезапуска сервисов различаются для ОС (из-за различий в названиях пакетов).

Для CentOS выполните команды:

/etc/init.d/httpd restart
/etc/init.d/nginx restart

Для Debian и Ubuntu команды будут следующие:

/etc/init.d/apache2 restart
/etc/init.d/nginx restart

или так:

service apache2 restart
service nginx restart

Как демоны они уже должны были быть установлены менеджером пакете при установке.

Теперь связка работает, Nginx обрабатывает статичные данные, Apache — динамические. Вот и всё! Дело сделано. Теперь всё работает! Если возникли какие-либо ошибки, то внимательно читайте сообщения и логи ошибок программ.

Поделиться!
Tags: , , , , , , , , , , , , , ,

49.75MB | MySQL:53 | 0,340sec