Проникнувшись как-то хвалебными одами в адрес веб-сервера nginx, решил я и у себя настроить связку apache + nginx. О том, зачем это нужно, написано много и без меня, но если коротко - значительно быстрее отдаётся статика сайта и решается проблема с порождением множества отжирающих память процессов apache при повышенной нагрузке, что приводит в конце концов к нехватке оперативной памяти и жуткому торможению сервера. Реальный эффект, конечно, будет на действительно высоконагруженных сайтах с горой одновременных запросов, но и для небольшого хостинга это будет нелишним хотя бы в качестве защиты от возможных DDоS-атак. Итак-с, приступим.
На сервере уже имеется установленный apache с ssl и парой виртуальных хостов на борту. Всю динамику и https мы оставляем для работы индейцу в качестве backend'a, а на frontend будем ставить nginx. Первым делом займёмся подготовкой apache.
Перевесим apache на другой порт (в моём варианте - 8080). Для этого отредактируем файлик /etc/apache2/ports.conf и скажем, что теперь apache будет слушать порт 8080 по адресу 127.0.0.1:
iom@gkt:~$ cat /etc/apache2/ports.conf
#NameVirtualHost *:80
#Listen *:80
# Backend for nginx
NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080
<IfModule mod_ssl.c>
# SSL name based virtual hosts are not yet supported, therefore no
# NameVirtualHost statement here
Listen 443
</IfModule>Также изменим в файлах описания виртуальных хостов (/etc/apache2/sites-available/*) строчку VirtualHost *:80 на VirtualHost 127.0.0.1:8080.
Теперь установим модуль rpaf для apache (что это и зачем?):
iom@gkt:~$ sudo aptitude install libapache2-mod-rpafВ моём варианте, когда и frontend, и backend находятся на одной машине, модуль настраивается следующим образом:
iom@gkt:~$ cat /etc/apache2/mods-available/rpaf.conf
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
</IfModule>Теперь подключаем наш модуль и перегружаем веб-сервер:
iom@gkt:~$ sudo a2enmod rpaf
iom@gkt:~$ sudo /etc/init.d/apache2 restartУстановка стандартна для дебиана:
iom@gkt:~$ sudo aptitude install nginxСамое интересное - настройка. Вначале основной файл конфигурации:
iom@gkt:~$ cat /etc/nginx/nginx.conf
user www-data;
#Число процессов рекомендуется приравнять к числу CPU
worker_processes 2;
timer_resolution 100ms;
worker_rlimit_nofile 8192;
worker_priority -5;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
#Число одновременных коннектов к серверу.
worker_connections 1024;
#Для linux 2.6.* хорошим выбором будет epoll
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}По аналогии с apache файлы настройки виртуальных хостов расположены в /etc/nginx/sites-available/, а для включения их в работу нужно создать симлинк в директории /etc/nginx/sites-enabled/. Вначале подкорректируем localhost:
iom@gkt:~$ cat /etc/nginx/sites-enabled/localhost
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
location / {
root /var/www/nginx-default;
index index.html index.htm;
}
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
location /images {
root /usr/share;
autoindex on;
}
# Статистика nginx
location /nginx-status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
}Теперь наш первый виртуальный хост - эта самая страничка notes.ghost.dn.ua:
iom@gkt:~$ cat /etc/nginx/sites-enabled/notes
server {
listen 80;
server_name notes.ghost.dn.ua;
server_name_in_redirect off;
access_log /var/log/nginx/notes.access.log;
location / {
# Перенаправляем запросы backend'у
proxy_pass http://127.0.0.1:8080/;
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;
}
# Статику перечисленных типов отдаём непосредственно
location ~* \.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
root /usr/share/drupal6;
access_log off;
expires 30d;
}
}Второй виртуальный хост host.domain.com:
iom@gkt:~$ cat /etc/nginx/sites-enabled/host.domain.com
server {
listen 80;
server_name host.domain.com;
access_log /var/log/nginx/host.access.log;
# Директория по умолчанию
location / {
root /var/www/;
index index.html index.htm;
}
# По ссылке http://host.domain.com/secret перенаправляем запросы на https://host.domain.com/secret
location /secret {
rewrite ^(/.*)$ https://$host$1 redirect;
}
# По ссылке http://host.domain.com/auth будем запрашивать логин/пароль
location /auth {
root /var/www/;
auth_basic "Login/password";
auth_basic_user_file /var/www/auth/.htpasswd;
}
# Запрещаем доступ к файлам .htaccess|.htpasswd
location ~ /\.ht {
deny all;
}
}Теперь осталось рестартовать nginx и проверить правильность работы сайтов.
Ключевые моменты конфигов я прокомментировал на русском, ну а за подробностями, конечно, лучше обратиться к оригиналу - http://sysoev.ru/nginx/; немало интересных вещей по теме можно почерпнуть на сайте http://habrahabr.ru/blogs/nginx/; ну и, конечно, Google Вам первейший помощник, благо тема nginx'а встречается часто и на русском.