Имеем: Сервер на базе 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, такими же как и у апача, или создателя файлов виртуального хоста.
Всем успехов!