Настройка nginx в Качестве Front-end к Apache

В связи с большим количеством соединений с веб-сервером Apache встала проблема нехватки системных ресурсов на сервере. Для дальнейшей эффективной работы сервера без дополнительных затрат на модернизацию аппаратной составляющей, встала задача по оптимизации использования существующих системных ресурсов.

Для выполнения поставленной задачи было проведено тестирование модели front-end/back-end системы, при которой в качестве front-end выступает легкий веб-сервер nginx, а в качестве back-end выступал все тот же Apache.

Преимущества подобной схемы можно понять на небольшом примере. Представьте себе, что к вашему веб серверу Apache необходимо обслужить порядка 1000 запросов одновременно, причем многие из этих клиентов подключены к медленным каналам связи. В случае использования Apache мы получим 1000 процессов httpd, на каждый из которых будет выделена оперативная память, и эта память не освободится до тех пор, пока клиент не получит запрошенный контент (в идеальном варианте, конечно).

В случае схемы с применением front-end/back-end сервера получим значительную экономию системных ресурсов за счет того, что после того, как пришел запрос клиента, nginx передает запрос Apache и быстро получает ответ. В итоге, Apache, после того как отдал ответ nginx, освобождает память. Далее с клиентом взаимодействует веб-сервер nginx, который как раз и написан для раздачи статического контента большому количеству клиентов при незначительном потреблении системных ресурсов.

Установка nginx

Red Hat Enterprise Linux 4 / CentOS 4

Для установки nginx в этих операционных системах вам необходимо подключить дополнительный репозиторий пакетов и установить nginx:

yum install nginx

Red Hat Enterprise Linux 5 / CentOS 5

Для установки nginx в этих операционных системах вам необходимо подключить дополнительный репозиторий пакетов EPEL и установить nginx:

yum install nginx

ASPLinux Server 5

nginx присутствует в стандартной поставке дистрибутива, поэтому для установки просто выполните:

yum install nginx

Fedora

nginx присутствует в стандартном репозитории дистрибутива, поэтому для установки просто выполните:

yum install nginx

Установка Apache

Для установки Apache выполните :

yum install httpd

Установка mod_rpaf

Модуль mod_rpaf для Apache необходим для работы связки с nginx. Необходимость в данном модуле возникает по следующей причине: запросы к Apache приходят с IP-адреса, на котором работает nginx (в простейшем случае это тот же самый адрес, на котором работает Apache), соответственно, в журнальных файлах Apache будет фигурировать только IP-адрес nginx-сервера, что не очень хорошо. Также без использования данного модуля начнутся проблемы со скриптами, в которых используется IP-адрес посетителя и перестанет правильно работать механизм ограничения доступа по IP-адресам с помощью .htaccess.

Настройка nginx

Ниже приведен конфигурационный файл nginx для работы в качестве front-end сервера. Подразумевается, что nginx будет работать на всех интерфейсах на 80 порту, а Apache будет работать на интерфейсе 127.0.0.1 и порту 8080. Сохраните данный конфигурационный файл в каталоге /etc/nginx/ с именем nginx.conf.

user  nginx;
worker_processes  10;
error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
    worker_connections  20000;
 }

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] $status '
                        '"$request" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout  30;
    send_timeout       900;
    server_tokens      off;
    server {
        listen       80;
        server_name     _;
        server_name_in_redirect  off;
        access_log  /var/log/nginx/host.access.log  main;
        location / {
         proxy_pass         http://127.0.0.1:8080/;
         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;
         client_max_body_size       10m;
         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 10m;
         }
        }
}

Настройка Apache

В файле конфигурации Apache /etc/httpd/conf/httpd.conf найдите строку

Listen :80

и замените ее строкой

Listen 127.0.0.1:8080

Настройка mod_rpaf

Добавьте модуль mod_rpaf в файл конфигурации Apache. Для этого в файл /etc/httpd/conf/httpd.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

конечно вместо 192.168.0.1 необходимо поставить ваш IP-адрес.

Тестирование производительности

Вышеописанная схема была успешно протестирована на сервере на котором было 150 сайтов. Каждый сайт был описан с помощью директивы VirtualHost. После внедрения схемы с участием nginx нагрузка на сервер существенно сократилась:

CPU Usage:

Memory Usage:

Выводы

Как мы видим веб сервер nginx позволил нам существенно снизить нагрузку на систему без дополнительных затрат на модернизацию сервера, т.е. задачу, поставленную в начале данной статьи, мы выполнили.

Автор: Денис Фролов

Статьи по Теме

Категории
Поиск