Настройка связки apache + nginx на Debian


Если Вы администратор web-сервера то рано или поздно встает вопрос оптимизации расходов системных ресурсов потребляемых apache. А конкретно у нас есть желание отдавать файлы не обрабатывая их с помощью apache. Решением данной проблемы является установки связки apache + nginx, где nginx является в качестве front-end к apache.

Как будет работать nginx в связке с apache

Apache будет слушать только один ip(127.0.0.1) порт (например 81) - слушаем внутренний ip 127.0.0.1 для того, чтоб ни у кого небыло желания и возможности подключаться напрямую к apache, 81 порт будет слушать apache по той причине, что 80 порт теперь будет слушать nginx
Если будет запрос к файлу с разрешением: (bmp|jpg|jpeg|pjpeg|gif|ico|png|css|doc|txt|js|docx|rtf|ppt|pdf|swf) - можно изменить или дополнить список, тогда запрос к apache не будет производится и nginx сразу будет отдавать файл, что сэкономит время обработки запроса и системные ресурсы.
Все остальные запросы мы будем пробрасывать на apache (127.0.0.1:81), но предварительно установим пакет libapache2-mod-rpaf, который позволит передавать к apache не $_SERVER["REMOTE_ADDR"]=127.0.0.1 , а реальный ip клиента создавшего запрос.


Где взять nginx для Debian - репозиторий nginx
Хорошие ребята (системные администраторы) ведут сборку пакетов nxing и выкладывают все свои труды в репозиторий:

deb http://ftp.ua.debian.org/debian-dou/ squeeze main
deb-src http://ftp.ua.debian.org/debian-dou/ squeeze main

Установка ключей для репозитория nginx

gpg --keyserver subkeys.pgp.net --recv-keys 0A3D4789
gpg --armor --export 0A3D4789 | apt-key add -

После обновления списка пакетов в репозиториях вы сможете установить пакет nginx-plus, который в отличии от обычного пакета nginx собирается с дополнительными модулями ngx_loadavg_variables.patch и ngx_addon's_if_statment.patch.

Итак приступим к установке настройки связки nginx + apache
Первым делом надеюсь опыт в настройке сервера на apache есть.

Необходимо заставить слушать apache 127.0.0.1:81 :

nano /etc/apache2/ports.conf

NameVirtualHost 127.0.0.1:80
Listen 80


меняем на


NameVirtualHost 127.0.0.1:81
Listen 81


Так же если у Вас уже существуют virtualhost в apache, необходимо подобным образов заставить слушать по 127.0.0.1:81, заменив:

<VirtualHost *:80>
на
<VirtualHost 127.0.0.1:81>


Установим libapache2-mod-rpaf чтоб apache получал реальный ip клиента, а не 127.0.0.1

aptitude install libapache2-mod-rpaf

Теперь можно перезапустить apache:

/etc/init.d/apache2 restart

Установим nginx-plus

aptitude install nginx-plus

Перейдем к настройке хостов nginx, которые храняться в директории: /etc/nginx/site-enabled/

Создадим описание для хоста 127.0.0.1, правив уже существующие для него конфиги в apache и nginx.

Конфиг /etc/nginx/sites-enabled/default :

server {
listen 80;
server_name 127.0.0.1;
access_log /var/log/nginx/localhost.access.log;
location ~* ^.+.(bmp|jpg|jpeg|pjpeg|gif|ico|png|css|doc|txt|js|docx|rtf|ppt|pdf|swf|zip|rar|gz)$ {
expires 10d;
log_not_found on;
try_files $uri
/home/user/domains/127.0.0.1/www/$uri;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
location / {
proxy_pass http://127.0.0.1:81/; # делаем переадресацию запросов на apache
proxy_redirect off;
proxy_set_header Host $host;
# Эти настройки необходимы, что бы из скриптов было видно реальные IP пользователя, а не фронт-части
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 64k;
}
}

Думаю понятно, что наш сайт лежит в директории: /home/user/domains/127.0.0.1/www

Теперь отредактируем настройки virtualhost в apache /etc/apache2/sites-enabled/000-default


<VirtualHost 127.0.0.1:81>
DocumentRoot /home/user/domains/127.0.0.1/www
ServerAlias localhost
ServerName www.localhost
ScriptAlias /cgi-bin/ /home/user/domains/127.0.0.1/www/cgi-bin/
<Directory "/home/user/domains/127.0.0.1/www">
AllowOverride All
Order Deny,Allow
Allow from all
Options All
</Directory>
<Directory "/home/user/domains/127.0.0.1/www/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
<IfModule dir_module>
DirectoryIndex index.php index.html index.cgi
</IfModule>
#SuexecUserGroup valualit valualit
ErrorLog "/home/user/domains/127.0.0.1/log/error.log"
CustomLog "/home/user/domains/127.0.0.1/log/access.log" combined
LogLevel warn
</VirtualHost>

Как Вы уже заметили ничего сложного в этом нет, осталось только перезапустить apache и nginx:

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

Если у Вас существуют уже virtualhost, главное не забыть сменить настройки, при работе через панели управления сложность возникает при добавлении и редактировании virtualhost в связки, поскольку по умолчанию настройки расчитаны на работу только с apache, но эту тему я расскажу позже на примере directadmin + apache + nginx.

http://4debian.info/article/page/18-apache-nginx/

Обновлено: 13.03.2015