Перестраиваем apache22 + mod_php5 -> nginx + apache22 + mod_php5

На одном из серверов понадобилось добавить чуть больше гибкости web-серверу. Система FreeBSD, web-сервер настроен по олдскульной классике: Apache22 -> mod_php5 -> MySQL. Поскольку ковырять старичка апача особо желания нет, решил просто «накрыть» его nginx-ом и докрутить в нем все свои хотелки (GeoIP, bandwidth limit, различные варианты отдачи в зависимости и User Agent и тд.) Тоесть нужна вот такая схема: Nginx -> Apache22 -> mod_php5 -> MySQL
Основная задача — свести к минимуму Downtime.
Итак, поехали …

Предварительные ласки:
Для того чтобы apache22 получал реальные IP адреса клиентов из nginx, нам понадобится модуль для апача — rpaf2. Устанавливается он из портов или из пакетов:

[root@fr1 ~]# cd /usr/ports/www/mod_rpaf2
[root@fr1 /usr/ports/www/mod_rpaf2]# make install clean

После чего включаем и настраиваем модуль в конфиге apache22 /usr/local/etc/apache22/httpd.conf

LoadModule rpaf_module        libexec/apache22/mod_rpaf2.so

<IfModule rpaf_module>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For
</IfModule>

Также правим хост/порт который будет использовать апач в том же конфиге апача /usr/local/etc/apache22/httpd.conf ставим:

Listen 127.0.0.1:8080
ServerName fr1.my.loc:8080

Теперь виртуалхосты в апаче. Конфиг дефолтный /usr/local/etc/apache22/extra/httpd-vhosts.conf В каждом виртуалхосте меняем порт *:80 на 8080, чтобы было так:

<VirtualHost *:8080>
...
</VirtualHost>

Теперь ковыряем nginx.
Создать директории для конфигов сайтов включенный/доступных:

[root@fr1 ~]# mkdir /usr/local/etc/nginx/sites-{enable,available}

Дальше создаем конфиги для всех сайтов в директории /usr/local/etc/nginx/sites-available, для начала можно сделать простейшие однотипные, дальше некоторые конфиги можно подправить по необходимости …. Включать или отключать сайты нужно симлинком на конкретный конфиг из директории sites-enable в директорию sites-available, ну по классике. Пример простейшего конфига:

[root@fr1 ~]# cat /usr/local/etc/nginx/sites-available/quick_com_ua.conf
server {
   listen 80;
   server_name www.quick.com.ua quick.com.ua;

   access_log /var/log/nginx/quick_com_ua-access.log;
   error_log /var/log/nginx/quick_com_ua-error.log;

   # To Apache Backend
   location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 60;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
   }

   # Static Files
   location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|txt)$ {
        root /home/quick/www/quick.com.ua;
   }
}
[root@fr1 ~]#

Заинклудить включенные саты в основной конфиг nginx /usr/local/etc/nginx/nginx.conf:

[root@fr1 /usr/local/etc/nginx]# cat nginx.conf
#user www;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
   worker_connections  1024;
#   use kqueue;
}

http {
   include       mime.types;
   default_type  application/octet-stream;

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   #access_log  logs/access.log  main;

   sendfile        on;
   #tcp_nopush     on;

   #keepalive_timeout  0;
   keepalive_timeout  60;

   #gzip  on;

   ## <= Servers Section => ##
   include sites-enable/*.conf;
   ## <= END Servers => ##
}
[root@fr1 /usr/local/etc/nginx]#

Создать директорию для логов nginx:

[root@fr1 ~]# mkdir /var/log/nginx

Лучше перестраховаться и проверить права на файлы/директории. Так как для nginx это критично, если листинг директорий nginx сделать не сможет — получите ошибку «403 Forbidden»:

[root@fr1 ~]# find /home/quick -type d -exec chmod 755 '{}' \;
[root@fr1 ~]# find /home/quick -type f -exec chmod 644 '{}' \;

На всякий случай проверить правильно ли сконфигурирован nginx:

[root@fr1 ~]# nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
[root@fr1 ~]#

Супер! Nginx настроен верно, теперь проверим конфиг apache22:

[root@fr1 ~]# apachectl configtest
Performing sanity check on apache22 configuration:
Syntax OK
[root@fr1 ~]#

Все, мы готовы к перезапуску сервисов. Сначала надо перегрузить сервис apache22, а потом запустить nginx
Рекомендую сделать это одной командой, вернее вот такой конструкцией, это отработает быстрее чем стартовать руками поочередно:

[root@fr1 ~]# service apache22 restart && service nginx start

Я подготовил все конфиги верно, поэтому downtime получился всего несколько секунд.

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?