Балансировка нагрузки для NGINX

Недавно я написал статью на тему как настроить распределение нагрузки на Nginx, включил в неё немного примеров кода, но, как мне показалось, не всем пользователям она показалась исчерпывающей (включая меня). Поэтому сегодня я приведу пример настройки из реального опыта.

Описание сети: 3 сервера / машины, работающие на базе Linux (Fedora, Rhel, Centos) .

192.168.1.100 (master node)
192.168.1.109 (slave)
192.168.1.106 (slave)

Устанавливаем nginx на три сервера:

yum install nginx

Настраиваем nginx.conf на трех серверах. Чаще всего файл настройки на в этих системах располагаются в /etc/nginx/nginx.conf.

user  nginx;
worker_processes  1;
error_log  /var/log/nginx_error.log crit;
worker_rlimit_nofile  8192;
events {
  worker_connections  1024; # you might need to increase this setting for busy servers
  use epoll; #  Linux kernels 2.6.x change to epoll
}
http {
  server_names_hash_max_size 2048;
  server_names_hash_bucket_size 512;
  server_tokens off;
  include    mime.types;
  default_type  application/octet-stream;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout  10;
  # Gzip on
  gzip on;
  gzip_min_length  1100;
  gzip_buffers  4 32k;
  gzip_types    text/plain application/x-javascript text/xml text/css;
  ignore_invalid_headers on;
  client_max_body_size    8m;
  client_header_timeout  3m;
  client_body_timeout 3m;
  send_timeout     3m;
  connection_pool_size  256;
  client_header_buffer_size 4k;
  large_client_header_buffers 4 64k;
  request_pool_size  4k;
  output_buffers   4 32k;
  postpone_output  1460;
  # Cache most accessed static files
  open_file_cache          max=10000 inactive=10m;
  open_file_cache_valid    2m;
  open_file_cache_min_uses 1;
  open_file_cache_errors   on;
  # Include each virtual host
  include "/etc/nginx/conf.d/*.conf";
}

Настройка виртуальных хостов

На сервере 2 (192.168.1.109) и на сервере 3 (192.168.1.106)

nano -w /etc/nginx/conf.d/mysite.com.conf

Вставьте следующие настройки в файл. Не забудьте поправить параметры корневого каталога и прочих пунктов, касающихся вашей системы:

server {
    access_log off;
    error_log /var/log/yoursite.com-error.log;
    listen 80;
    server_name  yoursite.com www.yoursite.com;
    location ~* .(gif|jpg|jpeg|png|ico|wmv|3gp|avi|mpg|mpeg|mp4|flv|mp3|mid|js|css|wml|swf)$ {
        root   /var/www/yoursite.com;
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    location / {
        root   /var/www/yoursite.com;
        index  index.php index.html index.htm;
    }
}

Не забудьте исправить /var/www/yoursite.com на настоящий путь к вашему сайту. Для главного сервера (192.168.1.100) создайте файл:

nano -w /etc/nginx/conf.d/balancer.com.conf

Вставьте в него следующее содержимое:

upstream balancer {
    server 192.168.1.100:80;
    server 192.168.1.106:80;
}
server {
    listen 192.168.1.100:80;
    server_name yoursite.com;
    error_log /var/log/yoursite.com-error.log;
    location / {
        proxy_pass http://balancer;
    }
}

Так же не забудьте исправить yoursite.com на имя вашего сайта. Перезапустите nginx на всех трех машинах:

service nginx restart

DNS записи

В этом примере я предполагаю, что ваши DNS записи указывают на IP 192.168.1.100, то есть на главный сервер, который также отвечает за распределение нагрузки. Ваши DNS записи должны выглядеть следующим образом:

yoursite.com IN A 192.168.1.100
www IN A 192.168.1.100

Для тестирования допускается использование /etc/hosts для согласования имен сайтов и IP адресов в пределах локальной сети, вместо использования настоящего DNS сервера.

Главный — master сервер

Сервер, отвечающий за балансировку нагрузки, я называю главным, но он так же может выступать в роли обработчика запросов, как и два остальных. В этом примере допускается использовать главный сервер для обработки запросов.

Другой сценарий: используем балансировщик нагрузки для обработки запросов. Мы применим небольшой трюк. Заменим следующие настройки на сервере:

upstream balancer {
  server 192.168.1.100:80 ;
  server 192.168.1.106:80 ;
}
server {
  listen 192.168.1.100:80;
  server_name yoursite.com;
  error_log /var/log/yoursite.com-error.log;
  location / {
      proxy_pass http://balancer;
  }
}

на

server {
    access_log off;
    error_log /var/log/yoursite.com-error.log;
    listen 127.0.01:80;
    server_name  yoursite.com www.yoursite.com;
    location ~* .(gif|jpg|jpeg|png|ico|wmv|3gp|avi|mpg|mpeg|mp4|flv|mp3|mid|js|css|wml|swf)$ {
      root   /var/www/yoursite.com;
      expires max;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    location / {
      root   /var/www/yoursite.com;
      index  index.php index.html index.htm;
    }
}
upstream balancer {
  server 192.168.1.100:80 ;
  server 192.168.1.106:80 ;
  server 127.0.0.1:80 ;
}
server {
  listen 192.168.1.100:80;
  server_name yoursite.com;
  error_log /var/log/yoursite.com-error.log;
  location / {
      proxy_pass http://balancer;
  }
}

Как вы видите, мы внесли два изменения: добавили виртуальный хост по адресу 127.0.0.1 и настроили его на обработку запросов на 80 порт. Затем добавили тот же сервер к вышестоящим серверам, то есть он будет использован для обработки запросов от Nginx запущенного на вашем localhost компьютере.

На данном этапе балансировщик нагрузки Nginx должен работать без проблем. Конечно существует множество методов и вариантов его настройки, которые стоит изучить.

Не забывайте про официальную документацию на сайте nginx.org: