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