Персональный
сайт
Игоря
Сысоева


 
english
 
sysoev.ru
 
nginx
 поехали!    
 документация    
 поддержка    
 изменения    
 скачать    
 ссылки    
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
обо мне
для писем
для денег
 

Директивы модуля ngx_http_upstream

 

15.08.2007

Модуль позволяет описывать группы серверов, которые могут использоваться в директивах proxy_pass и fastcgi_pass.

Содержание

Пример конфигурации
Директивы
ip_hash
server
upstream
Встроенные переменные

Пример конфигурации

upstream  backend  {
    server   backend1.example.com        weight=5;
    server   backend2.example.com:8080;
    server   unix:/tmp/backend3;

    server   backup1.example.com:8080    backup;
    server   backup2.example.com:8080    backup;
}

server {
    location / {
        proxy_pass  http://backend;
    }
}

Директивы


syntax: ip_hash
default: нет
context: upstream

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

Для серверов, использующих метод распределения ip_hash, нельзя задать вес. Если один из серверов нужно убрать на некоторое время, то для сохранения текущего хеширования IP-адресов клиентов этот сервер нужно пометить параметром down.

Пример конфигурации:

upstream  backend  {
    ip_hash;

    server   backend1.example.com;
    server   backend2.example.com;
    server   backend3.example.com  down;
    server   backend4.example.com;
}


syntax: server название [параметры]
default: нет
context: upstream

Директива задаёт имя и параметры сервера. В качестве имени можно использовать доменное имя, адрес, порт или путь unix-сокета. Если доменное имя резолвится в несколько адресов, то используются все.

  • weight=число — задаёт вес сервера, по умолчанию вес равен одному.
  • max_fails=число — задаёт число неудачных попыток работы с сервером в течение времени, заданного параметром fail_timeout, после которых он считается неработающим также в течение времени заданного параметром fail_timeout. По умолчанию число попыток равно одной. Нулевое значение запрещает учёт попыток. Что считается неудачной попыткой, задаётся директивами proxy_next_upstream и fastcgi_next_upstream. Состояние http_404 не считается неудачной попыткой.
  • fail_timeout=время — задаёт
    • время, в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался неработающим;
    • и время, в течение которого сервер будет считаться неработающим.
    По умолчанию время равно 10 секундам.
  • backup — помечает сервер как запасной сервер. На него будут передаваться запросы в случае, если не работают основные сервера.
  • down — помечает сервер как постоянно неработающий, используется совместно с директивой ip_hash.

Пример конфигурации:

upstream  backend  {
    server   backend1.example.com       weight=5;
    server   127.0.0.1:8080             max_fails=3  fail_timeout=30s;
    server   unix:/tmp/backend3;

    server   backup1.example.com:8080   backup;
}


syntax: upstream название { ... }
default: нет
context: http

Директива описывает группу серверов. Сервера могут слушать на разных портах, кроме того, можно одновременно использовать сервера, слушающие на TCP и unix сокетах.

Пример конфигурации:

upstream  backend  {
    server   backend1.example.com    weight=5;
    server   127.0.0.1:8080          max_fails=3  fail_timeout=30s;
    server   unix:/tmp/backend3;
}

Запросы распределяются по серверам в режиме round-robin с учётом весов серверов. В вышеприведённом примере каждые 7 семь запросов будут распределены так: 5 запросов на backend1.example.com и по одному запросу на второй и третий сервера. Если при попытке работы с сервером произошла ошибка, то запрос будет передан следующему серверу и так до тех пор, пока не будут опробованы все работающие сервера. Если не удастся получить успешный ответ от всех серверов, то клиенту будет возвращён результат работы с последним сервером.


Встроенные переменные

Модуль ngx_http_upstream поддерживает следующие встроенные переменные:

  • $upstream_addr — в переменной хранятся ip-адрес и порт сервера или путь к unix-сокету. Если при обработке запроса были сделаны обращения к нескольким серверам, то их адреса разделяются запятой, например, "192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock". Если произошёл внутренний редирект от одной группы серверов на другую с помощью "X-Accel-Redirect" или error_page, то эти группы серверов разделяются двоеточием, например, "192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80".
  • $upstream_response_time — в переменной хранятся времена ответов серверов в секундах с точностью до миллисекунд. Несколько ответов также разделяются запятыми и двоеточиями.
  • $upstream_status — в переменной хранятся коды ответов серверов. Несколько ответов также разделяются запятыми и двоеточиями.
  • $upstream_http_... — в переменных хранятся строки заголовков ответов серверов, например, строка заголовка ответа "Server" доступна в переменной $upstream_http_server. Необходимо иметь ввиду, что запоминаются только строки последнего сервера.

(C) Игорь Сысоев
http://sysoev.ru