Установка и настройка nginx (мой вариант)

Имеем: Сервер на базе Freebsd + Apache2 (виртуальные хосты) + php5 + mysql. Apache в роли как фронт так и бэк-енд сервера. PHP5 как модуль под апач.

Надо: Установить и настроить nginx в роли фронт-енд сервера, в основном для отдачи статики (картинки, css, js и т.д., все что можно отдать без участия Apache). Причем, если статический файл не найден, то надо перенаправить запрос на бэк-енд сервер, а вдруг он (этот статический файл) должен сгенерироваться динамически на бэк-енде :). Несколько дней танцев с бубном и вуаля:

1. Устанавливаем Nginx:

cd /usr/ports/*/nginx
make config
#Выбираем нужные настройки
portinstall -R nginx

2. Настраиваем Nginx на прием запросов, как фронт-енд сервер:

cat /usr/local/etc/nginx/nginx.conf
#некоторые параметры комментировать не буду,
#сами должны поискать в интернете
#от имени какого пользователя и группы будет работать nginx
user  www www;
#Количество воркеров, автор nginx советует поставить
#в соответствии количеству ядер процессора
worker_processes  2;
timer_resolution 100ms;
worker_rlimit_nofile 8192;
#приоритет воркера, чем меньше (в минус) - тем больше приоритет
worker_priority -5;
#Куда пишем общий лог ошибок (не привязанный к хосту)
error_log  /data/logs/nginx/error.log;
pid     /var/run/nginx.pid;
events {
    worker_connections  2048;
    #Актуально для FreeBSD
    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  /data/logs/nginx/access.log  main;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay      on;
    send_lowat       12000;
    keepalive_timeout  65 20;
    #настройки зжатия на лету статических тектовых данных, js, css, html, xml и т.д.
    gzip  on;
    gzip_min_length 1100;
    gzip_buffers 64 8k;
    gzip_comp_level 6;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain application/xml application/x-javascript application/json text/css;
    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;
    output_buffers   1 32k;
    postpone_output  1460;
    #определяем один раз имя + параметры нашего бэк-енд сервера
    upstream backend {
        server 127.0.0.1:88;
    }
    #Инклудим настройки виртуальных хостов
    include       vhosts/*.vhost;
}

3. Прописываем демон в /etc/rc.conf:

echo 'nginx_enable="YES"' >> /etc/rc.conf

По умолчанию Nginx слушает 80 порт, значит нам необходимо перенастроить Apache на другой порт, но для начала нам необходимо настроить хотя бы один виртуальный хост на nginx.

4. Настраиваем виртуальный хост на nginx:

cat /usr/local/etc/nginx/vhosts/some-host.vhost
server {
        #У нас name-based хосты, а значит слушать можем все интерфейсы на порту 80
        listen 80;
        #Указываем имя нашего виртуального хоста, и домен, который будем слушать
        server_name 100.org.ua www.100.org.ua;
        #Куда будем писать логи
        error_log /data/sites/100.org.ua/logs/nginx.error.log;
        access_log /data/sites/100.org.ua/logs/nginx.access.log;
        #Главный локейшн, который будет все проксить на бэк-енд
        location / {
                root /data/sites/100.org.ua/public_html;
                proxy_pass http://backend;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_connect_timeout 75;
                proxy_send_timeout    75;
                proxy_read_timeout    75;
        }
        #такой же локейшн, как и главный, но для внутренних редиректов
        location @fallback {
                root /data/sites/100.org.ua/public_html;
                proxy_pass http://backend;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_connect_timeout 75;
                proxy_send_timeout    75;
                proxy_read_timeout    75;
        }
        #Тут интересный локейшн, который будет отдавать статику, без участия бэк-енд
        #но, если файла нет, то делать редирект на главный локейшн, то ест на бэк-енд
        location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|rar|zip|7z|chm|asp|pl|doc|xml|csv)$ {
                root /data/sites/100.org.ua/public_html;
                #Вот тут мы проверяем существование файла физически на диске сервера
                try_files $uri @fallback;
                access_log   off;
                expires      1h;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /usr/local/www/nginx-dist;
        }
        location ~ /\.ht {
                deny all;
        }
}

Вот такой вот нехитрый конфиг. Таких конфигов вы можете положить (подключить) сколько угодно.

5. Доустанавливаем модуль для Apache для правильного определения IP клиента:

portinstall -R mod_rpaf2

6. Настраиваем Apache:

cat /usr/local/etc/apache22/httpd.conf
........
Listen 88
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For
........
NameVirtualHost 127.0.0.1:88
........
Include etc/apache22/Includes/*.conf

7. Редактируем виртуальные хосты Апача:

...........
<VirtualHost 127.0.0.1:88>
.............
</VirtualHost>

На этом все необходимые настройки мы произвели, остается только малость, запустить nginx и перезапустить Apache. Все это можно сделать одним махом – перезагрузив сервер :).

Чуть не забыл, если не хотите еще несколько дней танцевать с бубном, указывайте имя пользователя и группу, от которого будет работать nginx, такими же как и у апача, или создателя файлов виртуального хоста.

Всем успехов!

Leave a Reply