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

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

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Распределение нагрузки на Nginx между несколькими серверами.

Имеем несколько серверов на CentOS, например:

1
2
3
192.168.1.101 (master)
192.168.1.102 (slave)
192.168.1.103 (slave)

Установим NGINX на все сервера

1
yum install nginx

Настроим nginx.conf на трех серверах.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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.102) и на сервере 3 (192.168.1.103)

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

Вставим следующие настройки в файл.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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) создайте файл:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream balancer {
server 192.168.1.102:80;
server 192.168.1.103:80;
}

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

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

1
service nginx restart

DNS записи

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

1
2
yoursite.com IN A 192.168.1.101
www IN A 192.168.1.101

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

Master-сервер

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream balancer {
server 192.168.1.102:80 ;
server 192.168.1.103:80 ;
}

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

}

на

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
access_log off;
error_log /var/log/yoursite.com-error.log;
listen 127.0.0.1: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.102:80 ;
server 192.168.1.103:80 ;
server 127.0.0.1:80 ;
}

server {
listen 192.168.1.101: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 компьютере.