FreeBSD: настройка и конфигурирование NGINX + Apache

Настройка выполняется на:

# uname -v
FreeBSD 9.1-PRERELEASE

Apache:

# httpd -v
Server version: Apache/2.2.24 (FreeBSD)
Server built:   Apr  8 2013 10:01:39

Предполагается, что Apache уже установлен и настроен по статье  FreeBSD: Apache+MySQL+PHP (LAMP) + phpMyAdmin.

Установим NGINX:

# cd /usr/ports/www/nginx && make config-recursive

Описание опций:
[ ] DEBUG Режим отладки. Полезно на стадии тестирования и отладки конфигурации
[ ] IPV6 Поддержка протокола IP 6-й версии
[ ] GOOGLE_PERFTOOLS Включить поддержку google-perftools
[X] HTTP_MODULE Включение функций HTTP сервера
[ ] HTTP_ACCESSKEY_MODULE Модуль для генерации защищенных ссылок
[ ] HTTP_ADDITION_MODULE Фильтр, добавляющий текст до и после ответа
[ ] HTTP_DAV_MODULE Модуль для поддержки WebDAV методов PUT, DELETE, MKCOL, COPY и MOVE
[ ] HTTP_EVAL_MODULE Разбирает ответ проксируемого сервера или memcached сервера на переменные
[ ] HTTP_FANCYINDEX_MODULE Модуль позволяющий строить листинг файлов с добавлением стилей
[ ] HTTP_FLV_MODULE Модуль для стриминга флэш-видео в формате flv
[ ] HTTP_GZIP_STATIC_MODULE Модуль для отдачи клиенту предварительно сжатого файла с тем-же именем но с расширением «.gz».
[ ] HTTP_MOGILEFS_MODULE Поддержка файловой системы mogilefs.
[ ] HTTP_PERL_MODULE Встроенный Perl.
[ ] HTTP_RANDOM_INDEX_MODULE Модуль, выдает в качестве индексного файла, случайный файл из каталога.
[ ] HTTP_REALIP_MODULE Модуль для замены адреса клиента в заголовке.
[ ] HTTP_RESPONSE_MODULE Модуль для отдачи произвольного текста, прописанного в директивы модуля.
[X] HTTP_REWRITE_MODULE Модуль для изменения URI с помощью регулярных выражений, выдачи редиректов и выбора конфигурации в зависимости от переменных.
[ ] HTTP_SECURE_LINK_MODULE Модуль для проверки правильности запрошенной ссылки.
[ ] HTTP_SSL_MODULE Модуль поддержки SSL.
[X] HTTP_STATUS_MODULE Модуль, показывающий информационную страницу о текущем статусе Nginx.
[ ] HTTP_SUB_MODULE Модуль для замены в ответе, одной строки, на другую.
[ ] HTTP_UPLOAD_MODULE Модуль для аплоадов multipart/form-data.
[ ] HTTP_UPLOAD_PROGRESS В силу особенностей реализации nginx, без данного модуля не получится организовать показ статуса загрузки файлов.
[ ] HTTP_UPSTREAM_FAIR Модуль для балансировки нагрузки. Отправляет входящие запросы на наименее загруженный бакэнд.
[ ] HTTP_UPSTREAM_KEEPALIVE Поддержка keepalive- соединений с бакэндами, в том числе memcached.
[ ] HTTP_XSLT_MODULE XSLT фильтр.
[ ] HTTP_ZIP_MODULE Модуль для создания zip архивов «на лету».
[ ] MAIL_MODULE Модуль для работы nGinx в качестве почтового прокси сервера.
[ ] MAIL_IMAP_MODULE Модуль IMAP4 прокси.
[ ] MAIL_POP3_MODULE Модуль POP3 прокси.
[ ] MAIL_SMTP_MODULE Модуль SMTP прокси.
[ ] MAIL_SSL_MODULE Модуль для поддержки SSL/TLS для POP3/IMAP/SMTP.
[ ] PASSENGER_MODULE Аналог апачевского mod_rails ( Phusion Passenge ).
[X] WWW Стандартный набор HTML файлов для проверки.

Оставляем всё по-умолчанию, жмём Enter.

Устанавливаем:

# make BATCH=yes install clean

Редактируем файл конфигурации сервера Apache — /usr/local/etc/apache22/httpd.conf. В нём меняем такие параметры:

Listen 127.0.0.1:8080

и

NameVirtualHost 127.0.0.1:8080

Т.е. теперь Apache будет слушать только локальный адрес 127.0.0.1 и только порт 8080.

Теоретически (точнее — раньше, на другом сервере, так и было) можно назначить и тот же порт 80, на котором будет работать сам NGINX. Но на практике — это может привести к сложностям во время настройки. Кроме того, удобнее отслеживать источник проблем, в случае их возникновения, когда оба сервера работают на разных портах.

В случае ошибки такого вида:

[Mon Apr 08 12:55:17 2013] [warn] NameVirtualHost 127.0.0.1:80 has no VirtualHosts

Проверьте конфигурацию VirtualHost-ов, например — в файле/usr/local/etc/apache22/extra/httpd-vhosts.conf — для виртуалхостов так же необходимо установить адрес 127.0.0.1:8080.

Проверяем верность конфиграционных файлов Apache:

# apachectl configtest
Syntax OK

Если всё ОК — то перезагружаем его:

# apachectl restart

Переходим к настройке NGINX.

Главный конфигурационный файл находится в каталоге /usr/local/etc/nginx/ — nginx.conf.

Приводим его к такому виду:

user  www www;
worker_processes  1;
pid /var/run/nginx.pid;
events {
worker_connections   4096;
use kqueue;
}
http {
include       mime.types;
default_type  application/octet-stream;

client_header_timeout         300;
client_header_buffer_size     16k;
client_max_body_size          8m;
client_body_buffer_size       256k;
client_body_timeout           300;

proxy_read_timeout            360;

sendfile                      on;
tcp_nopush                    on;
tcp_nodelay                   on;

client_body_temp_path      /var/nginx/client_body_temp;
proxy_temp_path            /var/nginx/proxy_temp;

limit_conn_zone $binary_remote_addr zone=http:2m;

#————————————-

server {

listen         178.***.***.114:80 default accept_filter=httpready;
server_name   akira;

location / {
proxy_pass         http://127.0.0.1:8080;
proxy_redirect     off;
proxy_buffering    off;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;

client_body_temp_path      /var/nginx/client_body_temp;
proxy_temp_path            /var/nginx/proxy_temp;
}
}
#————————————-

server {
listen 178.***.***.114:8080;
server_name www.domain.co.ua domain.co.ua;
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js|swf|avi|mp3|flv|mpeg)$ {
root /usr/local/www/users/domain/domain.co.ua;
try_files $uri @apache;
}
location ~ /\.ht {
deny  all;
}
location / {
limit_conn         http 5;
proxy_pass         http://127.0.0.1/;
proxy_redirect     off;
proxy_set_header   Connection       close;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_pass_header  Content-Type;
proxy_pass_header  Content-Disposition;
proxy_pass_header  Content-Length;
proxy_set_header   X-Forwarded-Protocol $scheme;
}
location @apache {
limit_conn         http 100;
proxy_pass         http://127.0.0.1;
proxy_redirect     off;
proxy_set_header   Connection       close;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_pass_header  Content-Type;
proxy_pass_header  Content-Disposition;
proxy_pass_header  Content-Length;
proxy_set_header   X-Forwarded-Protocol $scheme;
}
}
#————————————-
}

В данном примере описан только один виртуалхост — domain.co.ua. Остальные параметры можно посмотреть на оф. странице NGINX. Для каждого обслуживаемого NGINX-ом виртуалхоста необходимо добавлять свой аналогичный блок директив.

Проверяем на ошибки:

# 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

И перезапускаем NGINX:

# service nginx onerestart

В случае ошибки такого вида:

nginx: [alert] setsockopt(SO_ACCEPTFILTER, «httpready») for 178.***.***.114:80 failed, ignored (2: No such file or directory)

 

Значит не подгружен модуль ядра accf_http.

Проверить можно командой (FreeBSD):

# kldstat | grep accf_http

Если модуль отсутствует — загрузим его командой:

# kldload accf_http

В случае ошибки такого вида:

# kldload accf_http
kldload: can’t load accf_http: Operation not permitted

Обратитесь к провайдеру, у которого вы брали ваш VPS.

И проверим ещё раз:

# kldstat | grep accf_http
5    1 0xc3d8f000 2000     accf_http.ko

Добавим его в загрузку вместе с системой. Для этого в файл /boot/loader.conf добавляем:

accf_http_load=»YES»

 

Итак — перестартуем NGINX:

# service nginx onerestart
Performing sanity check on nginx configuration:
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
Stopping nginx.
Waiting for PIDS: 14539.
Performing sanity check on nginx configuration:
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
Starting nginx.

Проверяем:

# ps aux | grep nginx
root    34423   0.0  0.0  27068   4476  ??  IsJ   1:18PM 0:00.00 nginx: master process /usr/local/sbin/nginx
www     34424   0.0  0.0  27068   5904  ??  IJ    1:18PM 0:00.00 nginx: worker process (nginx)
root    38826   0.0  0.0  10180    768  11  LL+J  1:20PM 0:00.00 grep nginx

И проверим какие порты прослушиваются:

# netstat -Lan | grep 80
tcp4  0/0/128        178.***.***.114.80

Последний штрих — установка модуля RPAF для Apache, который позволит ему правильно определять IPпользователей.

Устанавливаем:

# cd /usr/ports/www/mod_rpaf2 && make install clean

После установки редактируем файл /usr/local/etc/apache22/httpd.conf и в него добавляем строки:

LoadModule rpaf_module libexec/apache22/mod_rpaf2.so

И ниже:

Timeout             128
KeepAlive           Off
UseCanonicalName    Off
HostnameLookups     Off
RPAFenable          On
RPAFsethostname     Off
RPAFproxy_ips       178.***.***.114
RPAFheader          X-Real-IP

В строке RPAFproxy_ips указываем внешний IP сервера, на котором сейчас работает NGINX.

Проверяем:

# apachectl configtest
Syntax OK

Перезагружаем:

# apachectl restart

Проверим как работает модуль. В файле лога старые записи выглядят как:

178.***.***.114 — — [08/Apr/2013:13:47:03 +0000] «GET /index.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.0″ 200 2524 «http://domain.org.ua/» «Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0″

Т.е. вместо IP клиента — Apache получает адрес самого сервера. После добавления модуля:

194.***.***.214 — — [08/Apr/2013:14:06:24 +0000] «GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.0″ 200 2146 «http://domain.org.ua/» «Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0″

Добавляем NGINX в автозапуск — редактируем файл /etc/rc.conf:

nginx_enable=»YES»

На этом настройку можно считать завершённой.