Вступление
Начиналось всё с сервера, который находился дома и его производительность меня не устраивала, наверное потому что изначально эта ОС вообще была десктопом. Для увеличения этой самой производительности я установил 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, включая статику.

Использованные материалы:

 

  1. Nginx Catch-All Host As Front End To Apache For ISPConfig 3 On Debian Lenny
  2. question regarding the Nginx Catch-All Host As Front End To Apache For ISPConfig3 tut
  3. немного своего опыта

Если вы нашли неточность, или вам есть чем дополнить статью, прошу отписываться в комментариях, спасибо.

Комментарии  
dimetrius
0 # dimetrius 15.05.2011 20:43
Если интересно, вот графики загрузки apache до использования nginx и с использование, когда nginx удачно отдаёт статику.



Ответить | Ответить с цитатой | Цитировать
dimetrius
0 # dimetrius 14.05.2011 23:14
Разобрался, у пользователя nginx небыло прав для чтения файлов статики. В конфиге установил пользователя, от которого запущен apache и всё пошло :roll:
Ответить | Ответить с цитатой | Цитировать
Валерий
0 # Валерий 14.05.2011 12:43
"На глазок" что-то в стороне проксирования.
Попробуйте проксирование убрать.
Буду баловаться с Nginx только в районе понедельника-вт орника.
Ответить | Ответить с цитатой | Цитировать
dimetrius
0 # dimetrius 14.05.2011 12:39
Валерий, попробуйте пожалуйста поэкспериментир овать, действительно ли nginx сам отдаёт статику при этом, или же всё же от apache тянет...

ну и да, сорри что не ответил сразу, X указываются вручную.
Ответить | Ответить с цитатой | Цитировать
Валерий
0 # Валерий 14.05.2011 12:38
root /var/www/clients/clientX/webX/web/;
Догнал ;) это для каждого хоста вручную писать.
Попробую автоматизироват ь на уровне ISPConfig
Ответить | Ответить с цитатой | Цитировать
dimetrius
0 # dimetrius 14.05.2011 12:31
НА данный момент заметил что в конфигах видимо допущена какая-то ошибка, потому как вижу в логах апача отдачу этой же статики.
Ночью проверил, действительно, nginx статику не отдаёт.
Поздно было, пока не разобрался.

По поводу Include, для меня это тоже довольно интересный ход, его я нашёл по тем ссылкам, что ниже указаны.

Автоматизировать не пробовал, учитывая что у меня на сервере всего-то до десятка сайтов пока, это не особо интересовало.
Думаю что это не должно быть сложно.
Ответить | Ответить с цитатой | Цитировать
Валерий
0 # Валерий 11.05.2011 22:24
root /var/www/clients/clientX/webX/web/;
Интересует вот эта строчка. Как сервер определяет что именно за X?

#graceful fallback in case if static content doesn't exist
14.
include /etc/nginx/proxy_fallback.conf;
интересно-интересно ;)

Не пробовали автоматизироват ь создание хостов?
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий