Настройка nginx в качестве front-end к apache (nginx apache web)

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

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

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

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

Установка Nginx

yum install nginx

Установка Apache

yum install httpd

Установка mod_rpaf

Данный модуль для apache необходим для работы связки nginx — front-end/apache — back-end. Необходимость в данном модуле возникает по следующей причине: запросы к apache приходят с ip адреса на котором работает nginx (в простейшем случае это тот же самый адрес на котором работает apache), соответственно в журнальных файлах apache будет фигурировать только ip nginx сервера, что не очень хорошо. Также без использования данного модуля начнутся проблемы со скриптами в которых используется ip адрес посетителя и перестанет правильно работать механизм ограничения доступа по ip адресам с помощью .htaccess.

yum install gcc gcc-c++ make httpd-devel pcre pcre-devel nano lsof
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/sbin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

После ввода последней команды произойдет сборка модуля, и в самом конце будет написано куда он установлен. У меня это /usr/lib64/httpd/modules/mod_rpaf-2.0.so

Теперь создаем фаил конфигурации для mod_rpaf.

touch /etc/httpd/conf.d/mod_rpaf.conf
vi /etc/httpd/conf.d/mod_rpaf.conf

Заполняем фаил

LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
RPAFheader X-Real-IP

Все модуль готов.

Настройка nginx.

user              nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
worker_connections  1024;
}
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  $remote_addr - $remote_user [$time_local] $request 
                    $status $body_bytes_sent $http_referer 
                    ($http_user_agent) $http_x_forwarded_for;

  client_header_timeout  3m;
  client_body_timeout    3m;
  send_timeout           3m;
  keepalive_timeout      65;
  access_log  /var/log/nginx/access.log  main;

  sendfile        on;
  tcp_nopush     on;
  tcp_nodelay    on;
  server_tokens off;  #убирает версию сервера из сообщений об ошибках.
    server {
    listen       80;
    server_name     _;
    server_name_in_redirect  off;
    access_log  /var/log/nginx/access.log  main;
      location / {
      proxy_pass         http://127.0.0.1:88/;
      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;
    }
  }
  gzip  on;
  gzip_proxied any;   # сжимает все проходящее через прокси
  #include /etc/nginx/conf.d/*.conf; #удаляем т.к. все зпворачивается на apache
}

Сохраняем это все в файле /etc/nginx/nginx.conf

Настройка Apache

В файле конфигурации Apache /etc/httpd/conf/httpd.conf найдите строку Listen 80. Замените или исправьте ее на строку Listen 127.0.0.1:88

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

Оставьте комментарий