Apache + NGINX

Как это работает

NGINX – разрабатываемый с 2002-го года русскими программистами вэб-сервер. Как правило используется для обработки статического содержимого. В нашем случае мы часто используем спайку “Apache + NGINX”, где последний работает в режиме прокси-сервера. Работа данной связки следуящая:

- NGINX слушает порт 80;
- Apache слушает порт 8081 (формально, можно выбрать любой иной порт);
- все приходящие HTTP-запросы обрабатываются сначала NGINX;
- если в HTTP-запросе требуются загрузить какой-либо статический файл из следующего списка:
(gif|3gp|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|rar|gz|tar|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)
то обработку такого запроса (и, соответственно, отдачу таких файлов) выполняет NGINX, а Apache вообще не задействуется.
- если в HTTP-запросе требуется выполнение PHP или Perl/CGI-скрипта, он перенаправляется NGINX-ом на порт 8081, и тогда уже Apache его обрабатывает.

Таким образом на сервере одновременно работают ДВА вэб-сервера NGINX(80-й порт) и Apache(8081-й порт), которые “делят” между собой работу по обработке HTTP-запросов. NGINX оборабатывает “статику”, а Apache – “динамику”. Главная цель такой схемы – ускорение обработки запросов и снижение нагрузки на сервер. NGINX оптимизирован для обработки статического содержимого и в этом плане намного опережает Apache, однако он лишен такой гибкости, как Apache, в который можно включить/выключить сотни различных модулей.

Инсталяция

Так как у нас обычно Apache работает и настраивается из-под Cpanel, необходимо не просто установить NGINX, но и сделать так, чтобы при добавлении/удалении новых аккаунтов соответственно менялась настройка данного аккаунта NGINX и так далее. К счастью, есть автоматический инсталлятор, который сам все делает. Любопытные могу подробнее почитать про все это тут:

http://forums.cpanel.net/f189/nginx-automated-installer-148109-p14.html

Итак, установка сводится к следующему:

cd /usr/local/src
wget http://nginxcp.com/nginxadmin2.4-stable.tar
tar xf nginxadmin2.4-stable.tar
cd publicnginx
./nginxinstaller install
UPD. уже есть версия 2.8 инсталлятора, если чего

wget http://nginxcp.com/nginxadmin2.8-stable.tar
Если по каким-либо причинам что-то не заработало и вам нужно все вернуть назад к обычному Apache, просто запускаем:

./nginxinstaller uninstall

После инсталляции добавляем в рутовый крон:

0 * * * * /usr/sbin/tmpwatch -am 1 /tmp/nginx_client

и потом

/etc/init.d/crond restart

в общем-то не нужно рестартовать крон, но как хотите )
[править] mod_rpaf

ставим mod_rpaf для преобразование remote_ip environment variable внутри apache,

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

редактируем

vim /usr/local/apache/conf/includes/pre_main_2.conf

внутрь пишем такую шнягу

LoadModule rpaf_module modules/mod_rpaf-2.0.so
#Mod_rpaf settings
RPAFenable On
RPAFproxy_ips 127.0.0.1 <тут дальше лепим через пробел все айпишники сервера>
RPAFsethostname On
RPAFheader X-Real-IP

список айпишничков можем вот-так сгенерить(это без главного)

cat /etc/ips | sed “s/:.*//” |xargs -i{} echo -n “{} ”

потом рестартуем апач

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

По-умолчанию, NGINX ставится в папку:

/etc/nginx

(вообщето только конфигурационные файлы, бинарник лежит тут /usr/local/sbin/)

Файлы хостов (они создаются или удаляются автоматически, когда вы добавляете или удаляете домен из Cpanel) лежат в папке:

/etc/nginx/vhosts

Открываем файл конфигурации NGINX:

/etc/nginx/nginx.conf

Ставим следующую конфигурацию:

user  nobody;
# no need for more workers in the proxy mode
worker_processes  2;
error_log  /var/log/nginx/error.log info;
worker_rlimit_nofile 20480;
events {
worker_connections 5000; # increase for busier servers
use epoll; # you should use epoll here for Linux kernels 2.6.x
}
http {
server_name_in_redirect off;
server_names_hash_max_size 2048;
server_names_hash_bucket_size 512;
include    mime.types;
default_type  application/octet-stream;
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout  60;
gzip on;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
gzip_http_version 1.1;
gzip_min_length  0;
gzip_comp_level  3;
gzip_buffers  16 8k;
proxy_buffering Off; 
# You can remove image/png image/x-icon image/gif image/jpeg if you have slow CPU
gzip_types    text/plain text/xml text/css application/x-javascript application/xml image/png image/x-icon image/gif image/jpeg application/xml+rss text/javascript application/atom+xml;
ignore_invalid_headers on;
client_header_timeout  3m;
client_body_timeout 3m;
send_timeout     3m;
reset_timedout_connection on;
connection_pool_size  256;
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;
client_max_body_size 10M; 
client_body_buffer_size 128k;
request_pool_size  32k;
output_buffers   4 32k;
postpone_output  1460;
proxy_temp_path  /tmp/nginx_proxy/;
client_body_in_file_only on;
log_format bytes_log "$msec $bytes_sent .";
include "/etc/nginx/vhosts/*";
}

Рестарт NGINX:

/etc/init.d/nginx restart

После рестарта обязательно проверяем, или он поднялся:

ps auxc | grep nginx

Также надо убедится что и NGINX и Apache одновременно подняты и слушают нужные порты:

netstat -anp | grep :80 | grep LISTEN

после такой команды вы должны получить что-то вроде этого

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3856/nginx.conf     
tcp        0      0 0.0.0.0:8081                0.0.0.0:*                   LISTEN      3862/httpd

Возможно, что при рестарте NGINX он не подымется. Тогда смотрим файлик:

/var/log/nginx/error.log

Скорее всего ошибка будет заключаться в неверной конфигурации хоста в “/etc/nginx/vhosts”. Исправляем ее, если можем, а если не можем, то консультируемся со старшими сотрудниками и после исправления делаем рестарт NGINX.

Возможные проблемы

Проблемы, которые могут возникнуть при установленном NGINX
1) Сайт не паблишится через Фронт-Пейдж

Почему: Все верно, Фронт-Пейдж – это модуль Апача, так что напрямую через HGINX он работаеть не будет.

Решение: Заливать нужно с указанием порта Апача (в нашем случае – 8081).

То есть:

http://example.com:8081/
2) Не грузятся сайты, “висят”

Почему: Как правило это значит, что забиты все коннекты NGINX либо из-за ДДОС атаки, либо из-за неверной настройки самого NGINX.

Решение: Смотрим сколько к серверу соединений. Если ДДОС, то отбиваем его (если можем).

Также смотрим конфиг NGINX:

/etc/nginx/nginx.conf

и увеличиваем (если необходимо) значения с

worker_connections 10000;

до, например

worker_connections 20000;

После рестартуем NGINX.
3) Забивается ТМП-раздел

Почему: NGINX интенсивно кэширует запросы, используя “/tmp” раздел. В зависимости от интенсивности запросов к серверу, ТМП-раздел может забиваться быстрее или медленнее.

Решение: Нужно в рутовый крон прописать следующее

0 */4 * * * /usr/sbin/tmpwatch -am 4 /tmp/nginx_client

возможны также и другие варианты, типа

0 * * * * /usr/sbin/tmpwatch -am 1 /tmp/nginx_client

или

*/10 * * * * rm -rf /tmp/nginx_client/*

Последний вариант используем, если ТМП-диск забиватся слишком быстро (к примеру, когда сервер атакуют).

Возможно иногда прийдется ставить чистку раз в 5 минут.
4) 502 Bad Gateway

Решение: Вот что пишут разработчики:

“502 Bad Gateway happens when apache down. Check the Apache non-SSL IP/port under tweak settings. Apache non-SSL IP/port should be 8081 afrer successful install. ”

То есть возможно, что был изменен конфиг Апача или сам Апач лежит.

Проверяем конфиг Апача и сам Апача, если надо, переставляем NGINX.
5) 500 internal server error nginx

Пока что конкретного решения нету, потому что все зависит от того, что записано в лог-фале.

То есть смотрим что генерирует ошибку в файле /var/log/nginx/vhost-error_log и на основе этого выясняем где ошибка.
6) Клиенту поставили выделенный ай-пи, и сайт перестал работать

Почему: Пока что в функционал плагина “NGINXCP”, который мы используем, не заложена автоматическая смена ай-пи адреса в конфиге NGINX.

Решение: Надо вручную отредактировать конфигурацию NGINX для нужного хоста.

Пример: Хост “example.com” был на адресе 11.11.11.11, а перевелся на 22.22.22.22.

Запускаем:

replace ‘11.11.11.11’ ‘22.22.22.22’ — /etc/nginx/vhosts/example.com

или же через SED

sed -i ‘s/11.11.11.11/22.22.22.22/’ /etc/nginx/vhosts/example.com

и потом

/etc/init.d/nginx restart
7) Клиенту сменили мастер-домен, и сайт с новым доменом не работает

Почему: Причина та же, что и в пункет “6”.

Решение: Надо вручную отредактировать конфигурацию NGINX для нужного хоста.

Пример: Мастер-домен сменили с “petya.com” на “vasya.com”

Делаем

mv /etc/nginx/vhosts/petya.com /etc/nginx/vhosts/vasya.com

потом

replace ‘petya.com’ ‘vasya.com’ — /etc/nginx/vhosts/vasya.com

и потом

/etc/init.d/nginx restart
8) Не работает СиПанел и Вебмейл через субдомены cpanel.domain.com, webmail.domain.com

Почему: Нету соответсвующего конфига в NGINX

Решение: Редактируем соответсвующий виртуал-хост

vi /etc/nginx/vhosts/domain.com

меняем строку

server_name domain.com www.domain.com xxx.xxx.xxx.xxx;

на

server_name domain.com www.domain.com webmail.domain.com cpanel.domain.com xxx.xxx.xxx.xxx;

и потом рестартуем NGINX.

 

Similar Posts:

Leave a Reply

Your email address will not be published. Required fields are marked *