Балансировка нагрузки с помощью nginx

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


upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}

server {
listen 80;
server_name somedomain.tld;
location ~* \.()$ {
root /home/username/data/www/somedomain.tld; }
location / {
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 30s;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* /.(jpg|jpeg|gif|png|css|mp3|avi|mpg|txt|js|jar|rar|zip|tar|wav|wmv)$ {
root /home/username/data/www/somedomain.tld;}
}

В этом случае все запросы будут равномерно раскидываться между серверами с внутренними айпишниками 192.168.1.1- 192.168.1.3

Проблемы начнутся, если сайт хранит сессии в файлах. Разумеется, при перенаправлении запроса на другой сервер файл сессии на нем не будет найден, и сайт будет работать некорректно, поэтому придется хранить сессии в базе данных.

Балансировка нагрузки с помощью nginx: 4 комментария

  1. Есть и второй вариант – использовать кластерную ФС, В вашем случае настроенную так что бы полностью зеркалировать директорию с сайтами. Но на практике – честно не пробовал.

  2. Зеркалирование файлов с сайтами у нас сделано по крону, через rsync.
    Я не уверен в эффективности такого решения для хранения файлов сессий. А хранение сессий в общей базе оказалось весьма удачным решением, примерно с полгода мы его используем и вряд ли заменим на что-то другое.

  3. А разве не достаточно включить ip_hash для того что бы запросы от клиентов уходили на сервера куда были первое обращение?

  4. Анонимный, кстати да, ip_hash – это тоже одно из возможных решений для проблем с сессиями.

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

Обсуждение закрыто.