Настройка выполняется на:
# 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»
На этом настройку можно считать завершённой.