Настройка Nginx в качестве frontend к Apache
И так в вкратце что такое nginx? nginx – быстрый и легкий, но очень мощный и эффективный web-сервер, созданный Игорем Сысоевым для использования на серверах компании Рамблер и любезно предоставленный им для использования open-source сообществом. Этот сервер может использоваться как самостоятельный HTTP-сервер или как reverse proxy (frontend) перед веб-сервером Apache или любым другим “тяжелым” веб сервером для снижения нагрузки на backend-сервере от большого количества одновременных HTTP-сессий. В основном nginx используют в связки frontend – backend с Apache, иными словами если идет запрос на получение статичного файла (изображение, CSS или JavaScript), то nginx самостоятельно обрабатывает этот запрос. Если же пользователь обращается к какому-либо скрипту, тогда nginx передает этот запрос на обслуживание к Apache.
На этом покончим с теорией (ее на просторах интернета предостаточно) и приступим к реализации связки nginx-Apache на ОС CentOS/RHEL.
В данном описании я подразумеваю что у вас уже установлен и настроен сервер Apache!
1. Для установки nginx подключаем дополнительный репозиторий пакетов EPEL:
[root@centos ~]# rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
2. Проверим активен ли пакет EPEL при помощи команды - yum repolist
Если строка подчеркнутая красным у вас присутствует значит все в порядке, если ее нет, то репозиторий EPEL надо активировать путем редактирования конфигурационного файла:
[root@centos ~]# vi /etc/yum.repos.d/epel.repo
В самом верху находим строчку - enable, и ставим вместо нуля, цифру 1, сохраняем и выходим.
3. Теперь у нас все готово для установки nginx:
[root@centos ~]# yum install nginx
Кстати в репозитории epel лежит не очень свежая версия nginx (0.6), если вы хотите установить последнюю версию то необходимо подключить репозиторий CentAlt (но помните CentAlt для работы требует подключенного репозитория epel, поэтому вам его в любом случае придется подключить):
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
или для 64 битной ОС:
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
4. Установив nginx приступим к установке модуля для Apache, под названием – mod_rpaf. Вкратце для чего он нужен. Все запросы к Apache приходят с ip адреса на котором работает nginx (порт 80), соответственно в журнальных файлах Apache будет фигурировать только ip адрес nginx сервера, что не совсем корректно. Также без использования данного модуля начнутся проблемы со скриптами в которых используется ip адрес посетителя и перестанет правильно работать механизм ограничения доступа по ip адресам с помощью .htacces. Иными словами данный модуль крайне важен и необходим.
Для начала скачаем модуль к себе на сервер (Кстати, вот тут нам и пригодится репозиторий CentAlt, если не хотите конечно собирать этот модуль из сырцов)):
[root@centos ~]# rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
Установим модуль:
[root@centos ~]# yum install mod_rpaf
5. Приступаем к настройке nginx.
user nginx; #укажем пользователя, от имени которого будет работать nginx
Кстати, многие советуют ставить пользователя nobody, но у меня после установки nobody, стала некоректна работать админка в WordPress!
worker_processes 2; #Теперь скажем nginx-у, какое количество рабочих процессов породить. Обычно, хорошим выбором бывает число процессов, равное числу процессорных ядер в вашем сервере, но я рекомендую умножать число ядер на 2.
error_log /var/log/nginx/error.log debug; #куда будут сыпаться логи об ошибках
pid /var/run/nginx.pid;
worker_rlimit_nofile 80000;
events {
worker_connections 2048; # Общее максимальное количество обслуживаемых клиентов будет равно worker_processes * worker_connections; Иногда могут сработать в положительную сторону даже самые экстремальные значения, вроде 128 процессов, по 128 коннектов на процесс, или 1 процесса, но с параметром worker_connections=16384. В последнем случае, впрочем, скорее всего понадобится тюнить ОС.
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] $status ‘
‘»$request» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «http_x_forwarded_for»‘;
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
Описываем хосты
server {
listen 88.88.88.11:80; #IP и порт на котором слушает nginx
server_name mysite.ru www.mysite.ru; #указываем имена нашего сайта
server_name_in_redirect off;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080/; #указываем ip и порт на котором теперь будет слушать Apache
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}
# Определяем местонахождение и расширения статичных файлов
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
root /home/www/mysite.ru;
}
# htaccess и htpasswd не отдаем
location ~ /\.ht {
deny all;
}
}
}
Данный конфигурационный файл создан только для одного виртуального сайта (хоста), если же у вас их несколько, то имеет смысл описывать все виртуальные хосты в virtual.conf, который расположен по адресу /etc/nginx/conf.d/virtual.conf
Привожу простой пример:
##site.new.ru
server {
listen 127.0.0.1:80;
server_name site.new.ru www.site.new.ru;
...
location ~* ^.+\.(js|gif|jpg)$ {
root /home/www/site.new.ru;
}
}
##site.ru
server {
listen 127.0.0.1:80;
server_name site.ru www.site.ru;
...
location ~* ^.+\.(js|gif|jpg)$ {
root /home/www/site.ru;
}
}
На этом настройку nginx можно считать законченной.
Корректность настройки на предмет ошибок проверяем командой:
[root@centos ~]# nginx -t
6. Приступим к настройке Apache. В файле конфигурации - /etc/httpd/conf/httpd.conf найдите строку
Listen :80 и укажите новый порт на котором будет работь Apache - Listen 127.0.0.1:8080
Далее отредактируйте ваши виртульные хосты в соответсвии с новым портом:
NameVirtualHost 127.0.0.1:8080
<VirtualHost 127.0.0.1:8080>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /home/www/mysite.ru/
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
7. Настраиваем модуль mod_rpaf длч работы с Apache.
7.1 Добавляем в конфигурационный файл Apache, следующие строки:
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 88.88.88.10 127.0.0.1
RPAFheader X-Real-IP
7.2 Следующий шаг активация модуля. Сделать это можно двумя путями:
Первый путь добавить строчку LoadModule rpaf_module modules/mod_rpaf-2.0.so , в конфигурационный файл Apache, но при этом удалить (переименовать) файл mod_rpaf.conf из папки /etc/httpd/conf.d.
Второй путь отредактировать указанный выше файл – mod_rpaf.conf, добавления туда строки -
LoadModule rpaf_module modules/mod_rpaf-2.0.so (существующую строку редактируем или удаляем)
Оба пути являются правильными.
8. Запускаем (или рестартуем) все сервисы:
[root@centos ~]# service httpd start
[root@centos ~]# service nginx start
Естественно ошибок быть не должно, если есть ошибки изучаем логи nginx и Apache.
Полезные команды Nginx:
Проверка синтаксиса в конфигурационном файле nginx:
nginx -t
Смотрим какая версия nginx у нас установлена:
nginx -v
Расширенная информация с какими опциями собран nginx:
nginx -V
На этом настройка nginx закончена.
P.S. На личном примере я убедился в полезности nginx, установив его на свой сервер. По результатам с сайта проверки времени отклика вашего сайта http://tools.pingdom.com/, я сократил время загрузки своих страниц в среднем на 1-2 секунды.
При создании статьи использовалась информация с сайтов:
http://server-tuning.info/nginx/apache-frontend.html
http://www.opennet.ru/base/net/nginx_ipb.txt.html
http://server-tuning.info/nginx/about-nginx.html
http://habrahabr.ru/blogs/nginx/66764/
http://blogdr.ru/nginx-apache-virtualdomain/
Полезные сайты:


Хороший пост. Особенно понравилось что комментарии красным цветом выделены, так легче ориентироваться.
Но вот в других статьях про настройку Nginx есть ешё в конфиге идет настройка error_page – обработка ошибок, а у вас нету. Или по вашему это не нужно?
Спасибо!) Про страницу ошибок как то не задумывался, спасибо что подсказали, надо будет отредактировать статью…