Вступление
Начиналось всё с сервера, который находился дома и его производительность меня не устраивала, наверное потому что изначально эта ОС вообще была десктопом. Для увеличения этой самой производительности я установил nginx как фронтэнд для apache. Сайтов было всего 3-4, прописать конфиги проблем не составляло, поэтому никакой панели управления небыло.
На данный момент куплен VPS, на который установлена панель управления ISPConfig 3. Причём с самого начала было точно определено что в любом случае перед apache будет установлен nginx. Не буду описывать все плюсы, которые мы получаем при его использовании...
Итак, сейчас у вас должна быть установлена ISPConfig 3 на Fedora 14, всё настроено и отлажено.
Конфигурация Apache
В конфигах apache нам нужно изменить 80 порт на тот, на котором должен apache должен слушать входящие соединения от nginx. Обычно я переношу его на порт 8080, но у большинства на этом порту будет висеть панель управления ISPConfig 3, поэтому будет использовать порт 82.
# sed -ie 's/*:80/*:82/g' /etc/httpd/conf/sites-available/*.vhost
Здесь заметьте что в конфигах изначально может быть прописан порт 8080 для панели управления. Если мы сделаем так, как выше написал я, то получим уже не 8080, а 8280. Это обязательно нужно сразу же исправить.
Комманда sed сделает бэкап оригинальных файлов *.vhost с расширением *.vhoste, эти файлы можем переместить.
# mkdir /root/httpd_vhost_backup/
# mv /etc/httpd/conf/sites-available/*.vhoste /root/httpd_vhost_backup/
Перезапустите apache и используя netstat посмотрите слушает ли он порт 82 вместо 80:
# service httpd restart
# netstat -tunap | grep httpd
должны получить что-то подобное:
tcp 0 0 :::8080 :::* LISTEN 1213/httpd
tcp 0 0 :::82 :::* LISTEN 1213/httpd
tcp 0 0 :::8081 :::* LISTEN 1213/httpd
Теперь вы должны изменить шаблоны ISPConfig для Apache. Скопируйте их в conf-custom директорию:
# cd /usr/local/ispconfig/server/
# cp conf/apache_ispconfig.conf.master conf-custom/
# cp conf/vhost.conf.master conf-custom/
Откройте два скопированных файла и измените :80 на :82. Чтоб удостовериться что всё сделали правильно, используйте grep:
# grep :82 -i /usr/local/ispconfig/server/conf-custom/*
Должны получить примерно следующее:
/usr/local/ispconfig/server/conf-custom/apache_ispconfig.conf.master:NameVirtualHost {tmpl_var name="ip_address"}:82
/usr/local/ispconfig/server/conf-custom/vhost.conf.master: :82>
Установка mod_rpaf
Если не устанавливать mod_rpaf, то все скрипты будут видеть только 127.0.0.1, или внешний IP вашего сервера. Соответственно mod_rpaf нужен для того, чтоб передать apache настоящий IP посетителя вашего сайта.
Устанавливаем репозиторий пакетов CentALT
Для i386 архитектуры
# rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
Для x86_64 архитектуры
# rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
Устанавливаем mod_rpaf
# yum install mod_rpaf -y
Отключаем репозитарий CentALT, т.к. позже он будет нам мешать.
# vim /etc/yum.repos.d/centalt.repo
получаем
[CentALT]
name=CentALT Packages for Enterprise Linux 5 - $basearch
baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
enabled=1
gpgcheck=0
прописываем
enabled=0
Конфигурация mod_rpaf
Создаём файл
# vim /etc/httpd/conf.d/mod_rpaf.conf
со следующим содержимым:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1 192.168.0.1
RPAFheader X-Real-IP
В строке RPAFproxy_ips указываем IP всех интерфейсов, которые присутствуют на сервере.
Установка и конфигурация nginx
# yum install nginx
Редактируем основной конфиг
# vim /etc/nginx/nginx.conf
Делаем так:
# вписываем пользователя, от которого запущен apache, иначе будут проблемы с отдачей статики.
user apache;
worker_processes 3;
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
worker_rlimit_nofile 4096;
events {
worker_connections 2048;
use epoll;
}
http {
index index.php index.html index.htm;
root /var/www/;
error_page 502 503 504 /50x.html;
server_names_hash_max_size 512;
server_names_hash_bucket_size 128;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 512;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
client_body_temp_path /var/lib/nginx/body 1 2;
gzip on;
gzip_http_version 1.0;
gzip_min_length 1100;
gzip_types text/plain text/css image/x-icon application/x-javascript application/javascript text/javascript application/atom+xml application/xml;
gzip_buffers 16 8k;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_proxied any;
gzip_comp_level 2;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
#tcp_nopush on;
keepalive_timeout 75 20;
tcp_nodelay off;
ignore_invalid_headers on;
server_tokens off;
access_log off;
error_log /var/log/nginx/error_log;
#виртуальный хост nginx по умолчанию
#эта конфигурация будет использоваться, если не будет соответствующих виртуальных хостов
server {
listen 80 default;
#вы можете просматривать статистику nginx используя lynx, или другой консольный браузер
#по адресу http://your.external.interface.ip/nginx_status address
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
#параметры по умолчанию для каждого виртуального хоста
include /etc/nginx/proxy.conf;
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Создаём proxy.conf
# vim /etc/nginx/proxy.conf
location / {
proxy_pass http://127.0.0.1:82/;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 64m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
Создаём proxy_fallback.conf
# vim /etc/nginx/proxy_fallback.conf
#proxy options can't be set inside if directive
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1:82;
}
Создаём директорию для наших виртуальных хостов
# mkdir /etc/nginx/sites-enabled/
Далее опишу пример конфигурации виртуального хоста:
# vim /etc/nginx/sites-enabled/example.com.conf
server {
# listen 80;
server_name www.example.com example.com;
#подключаем параметры прокси сервера, общие для всех виртуальных хостов
access_log off;
include /etc/nginx/proxy.conf;
location ~* ^.+\.(jpeg|gif|jpg|JPG|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|avi|mp3)$ {
#принудительно заставляем браузер кэшировать локально статику в течении 1 дня
expires 1d;
root /var/www/clients/clientX/webX/web/;
#access_log /var/log/ispconfig/httpd/domain.com/access.log;
access_log off;
#graceful fallback in case if static content doesn't exist
include /etc/nginx/proxy_fallback.conf;
}
}
Не забываем перезапустить apache и nginx
# service httpd restart
# service nginx restart
Вот и все. Nginx будет обслуживать все ваши статические файлы, такие как изображения, архивы и т.д. При этом PHP будет направлен на обработку Apache. Заметьте, вам не обязательно создавать описание виртуального хоста для nginx, делайте это только для тех сайтов, с которых хотите отдавать статику через nginx. Если сайт не будет описан в виртуальных хостах nginx, то всё будет забираться у apache, включая статику.
Использованные материалы:
- Nginx Catch-All Host As Front End To Apache For ISPConfig 3 On Debian Lenny
- question regarding the Nginx Catch-All Host As Front End To Apache For ISPConfig3 tut
- немного своего опыта
Если вы нашли неточность, или вам есть чем дополнить статью, прошу отписываться в комментариях, спасибо.
Комментарии
Попробуйте проксирование убрать.
Буду баловаться с Nginx только в районе понедельника-вт орника.
ну и да, сорри что не ответил сразу, X указываются вручную.
Догнал ;) это для каждого хоста вручную писать.
Попробую автоматизироват ь на уровне ISPConfig
Ночью проверил, действительно, nginx статику не отдаёт.
Поздно было, пока не разобрался.
По поводу Include, для меня это тоже довольно интересный ход, его я нашёл по тем ссылкам, что ниже указаны.
Автоматизировать не пробовал, учитывая что у меня на сервере всего-то до десятка сайтов пока, это не особо интересовало.
Думаю что это не должно быть сложно.
Интересует вот эта строчка. Как сервер определяет что именно за X?
#graceful fallback in case if static content doesn't exist
14.
include /etc/nginx/proxy_fallback.conf;
интересно-интересно ;)
Не пробовали автоматизироват ь создание хостов?