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

Nginx_logo.gifПроникнувшись как-то хвалебными одами в адрес веб-сервера 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

и если всё нормально, переходим к основной части - nginx.

Установка стандартна для дебиана:

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'а встречается часто и на русском.

Комментарии

Гость
Гость аватар

файлы xxx.xxx.php.css.123 обрабатываться будут каким сервером?

iom
iom аватар
Откуда: г.Горловка, Украина
Зарегистрирован: 18/06/2009

В приведённом примере - apache-м