Вступление

Начиналось всё с сервера, который находился дома и его производительность меня не устраивала, наверное потому что изначально эта ОС вообще была десктопом. Для увеличения этой самой производительности я установил nginx как фронтэнд для apache. Сайтов было всего 3-4, прописать конфиги проблем не составляло, поэтому никакой панели управления небыло.
На данный момент куплен VPS, на который установлена панель управления ISPConfig 3. Причём с самого начала было точно определено что в любом случае перед apache будет установлен nginx. Не буду описывать все плюсы, которые мы получаем при его использовании…
Итак, сейчас у вас должна быть установлена ISPConfig 3 на Fedora 14, всё настроено и отлажено.

Конфигурация Apache

В конфигах apache нам нужно изменить 80 порт на тот, на котором должен apache должен слушать входящие соединения от nginx. Обычно я переношу его на порт 8080, но у большинства на этом порту будет висеть панель управления ISPConfig 3, поэтому будет использовать порт 82.

1
sed -ie 's/*:80/*:82/g' /etc/httpd/conf/sites-available/*.vhost

Здесь заметьте что в конфигах изначально может быть прописан порт 8080 для панели управления. Если мы сделаем так, как выше написал я, то получим уже не 8080, а 8280. Это обязательно нужно сразу же исправить. Комманда sed сделает бэкап оригинальных файлов *.vhost с расширением *.vhoste, эти файлы можем переместить.

1
2
mkdir /root/httpd_vhost_backup/
mv /etc/httpd/conf/sites-available/*.vhoste /root/httpd_vhost_backup/

Перезапустите apache и используя netstat посмотрите слушает ли он порт 82 вместо 80:

1
2
service httpd restart
netstat -tunap | grep httpd

должны получить что-то подобное:

1
2
3
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 директорию:

1
2
3
cd /usr/local/ispconfig/server/
cp conf/apache_ispconfig.conf.master conf-custom/
cp conf/vhost.conf.master conf-custom/

Откройте два скопированных файла и измените :80 на :82. Чтоб удостовериться что всё сделали правильно, используйте grep:

1
grep :82 -i /usr/local/ispconfig/server/conf-custom/* 

Должны получить примерно следующее:

1
2
/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 архитектуры

1
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm

Для x86_64 архитектуры

1
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm

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

1
yum install mod_rpaf -y

Отключаем репозитарий CentALT, т.к. позже он будет нам мешать.

1
vim /etc/yum.repos.d/centalt.repo

получаем

1
2
3
4
5
[CentALT]
name=CentALT Packages for Enterprise Linux 5 - $basearch
baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
enabled=1
gpgcheck=0

прописываем

1
enabled=0

Конфигурация mod_rpaf

Создаём файл

1
vim /etc/httpd/conf.d/mod_rpaf.conf

со следующим содержимым:

1
2
3
4
5
6
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

1
yum install nginx

Редактируем основной конфиг

1
vim /etc/nginx/nginx.conf

Делаем так: вписываем пользователя, от которого запущен apache, иначе будут проблемы с отдачей статики.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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

1
vim /etc/nginx/proxy.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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

1
vim /etc/nginx/proxy_fallback.conf

  #proxy options can’t be set inside if directive

1
2
3
4
5
6
7
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;
}

Создаём директорию для наших виртуальных хостов

1
mkdir /etc/nginx/sites-enabled/

Далее опишу пример конфигурации виртуального хоста:

1
vim /etc/nginx/sites-enabled/example.com.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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

1
2
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 немного своего опыта

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