Недавно я написал статью на тему как настроить распределение нагрузки на 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: