Apache в плане потребления ресурсов неумолим. Поэтому уже давно практикуется вариант, когда на нем висит обработка динамической части сайтов, а вся статика ложится на плечи экономного и шустрого Nginx. В нашем случае, алгоритм работы будет состоять из приема HTTP-запроса от пользователя средствами Nginx, распознавание - запрашивается ли php-скрипт. Если да, запрос передается на Apache. В противном случае, работу продолжает Nginx. Настроить такую схему можно за пару минут.

Я предполагаю, что на сервере в текущий момент всеми http-задачами заведует Apache. Для начала переключим его на прослушивание порта, отличного от 80, через который в стандартном случае приходят запросы от посетителей сайтов. Редактируем файл /etc/apache2/ports.conf , заменив в нем метки :80 на :82. То же самое необходимо проделать со всеми файлами виртуальных хостов, которые лежат в /etc/apache2/sites-available/*.vhost

Чтобы видеть реальные IP пользователей, а не 127.0.0.1 , как это обычно по-умолчанию, поставим модуль libapache2-mod-rpaf:

# apt-get install libapache2-mod-rpaf


Отредактируем строчку в файле /etc/apache2/mods-available/rpaf.conf так:

RPAFproxy_ips 127.0.0.1   <тут IP сервера>


Удалим из каталога /etc/apache2/mods-enabled/ файлы deflate.* , поскольку задачу компрессии на себя возьмет Nginx. Кроме того, в /etc/apache2/apache2.conf выставим у параметра KeepAlive значение Off, поскольку и этой обязанностью у нас будет заниматься Nginx.

Ставим Nginx:

# apt-get install nginx


Заменим текст в файле /etc/nginx/nginx.conf на:

user www-data; #замените на того же пользователя, под которым работает apache
worker_processes 2; #подставьте количество ядер/процессоров сервера
worker_rlimit_nofile 8192;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
accept_mutex off;
}
http {
server_names_hash_bucket_size 64;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# reverse proxy options
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# gzip compression options
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_min_length 0;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
include /etc/nginx/sites-enabled/*;
}


Теперь поправим файл /etc/nginx/sites-available/default , заменив его содержимое на:

server {
listen 80; ## listen for ipv4
server_name localhost;
client_max_body_size 180M;
access_log /var/log/nginx/localhost.access.log;
#### www. редирект - все адреса, начинающиеся с www редиректим на адрес без www http://domain. ####
if ($host ~* ^(www\.)(.+)) {
set $rawdomain $2;
rewrite ^/(.*)$ http://$rawdomain/$1 permanent;
}
location / {
root /var/zpanel/hostdata/zadmin/public_html/$host;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php;
}
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
 
# проксируем PHP скрипты на Apache, слушающий 127.0.0.1:82
#
location ~ \.php$ {
proxy_pass http://127.0.0.1:82;
}
 
}


Отличными от вышеприведенных у вас могут быть директивы:

client_max_body_size 180M;  (указывает Nginx принимать файлы не более 180 Мб). Если вообще не прописывать эту директиву, то сервер откажется принимать файлы, размеры которых превышают 2 Мб (по-умолчанию). Этого, конечно же, мало, и возникновение ошибки 413 Too Long Request гарантировано.

root   /var/zpanel/hostdata/zadmin/public_html/$host;  В этой директиве нужно поменять путь до www-файлов сайтов.

В общем-то и все. Перезагружаем Apache и Nginx:

# /etc/init.d/apache2 restart
# /etc/init.d/nginx restart


Теперь Apache у нас будет вступать в работу, только если идет обращение к файлам с расширением .php. Логи доступа лежат здесь /var/log/nginx/localhost.access.log

Обратите внимание, что модуль mod_rewrite также будет функционировать, благодаря директиве try_files $uri $uri/ /index.php.

И еще мы предусмотрели SEO-редирект, когда пользователь/поисковый робот, запросив адрес сайта c www перенаправляется на адрес без www (дубли сайта в поисковом индексе не порождаются).

Наверх