Модуль ngx_http_upstream_module
Пример конфигурации Директивы upstream server zone hash ip_hash keepalive keepalive_requests keepalive_time keepalive_timeout least_conn random Встроенные переменные |
Модуль ngx_http_upstream_module
позволяет описывать группы серверов,
которые могут использоваться в директивах
proxy_pass,
fastcgi_pass,
uwsgi_pass,
scgi_pass,
memcached_pass и
grpc_pass.
Пример конфигурации
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; } }
Директивы
Синтаксис: |
upstream |
---|---|
Умолчание: | — |
Контекст: |
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; server backup1.example.com backup; }
По умолчанию запросы распределяются по серверам циклически
(в режиме round-robin) с учётом весов серверов.
В вышеприведённом примере каждые 7 запросов будут распределены так:
5 запросов на backend1.example.com
и по одному запросу на второй и третий серверы.
Если при попытке работы с сервером происходит ошибка, то запрос
передаётся следующему серверу, и так далее до тех пор, пока не будут опробованы
все работающие серверы.
Если не удастся получить успешный ответ
ни от одного из серверов, то клиенту будет возвращён результат работы
с последним сервером.
Синтаксис: |
server |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт адрес
и другие параметры
сервера.
Адрес может быть указан в виде доменного имени или IP-адреса,
и необязательного порта, или в виде пути UNIX-сокета, который
указывается после префикса “unix:
”.
Если порт не указан, используется порт 80.
Доменное имя, которому соответствует несколько IP-адресов,
задаёт сразу несколько серверов.
Могут быть заданы следующие параметры:
-
weight
=число
- задаёт вес сервера, по умолчанию 1.
-
max_conns
=число
-
ограничивает максимальное
число
одновременных активных соединений к проксируемому серверу (1.11.5). Значение по умолчанию равно 0 и означает, что ограничения нет. Если группа не находится в зоне разделяемой памяти, то ограничение работает отдельно для каждого рабочего процесса.При включённых неактивных постоянных соединениях, нескольких рабочих процессах и зоне разделяемой памяти, суммарное число активных и неактивных соединений с проксируемым сервером может превышать значение
max_conns
. -
max_fails
=число
-
задаёт число неудачных попыток работы с сервером, которые должны произойти
в течение времени, заданного параметром
fail_timeout
, чтобы сервер считался недоступным на период времени, также заданный параметромfail_timeout
. По умолчанию число попыток устанавливается равным 1. Нулевое значение отключает учёт попыток. Что считается неудачной попыткой, определяется директивами proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, memcached_next_upstream и grpc_next_upstream. -
fail_timeout
=время
-
задаёт
- время, в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;
- и время, в течение которого сервер будет считаться недоступным.
-
backup
-
помечает сервер как запасной сервер.
На него будут передаваться запросы в случае, если не работают основные серверы.
Параметр нельзя использовать совместно с методами балансировки нагрузки hash, ip_hash и random.
-
down
- помечает сервер как постоянно недоступный.
Если в группе только один сервер, параметрыmax_fails
иfail_timeout
игнорируются и такой сервер никогда не будет считаться недоступным.
Синтаксис: |
zone |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версии 1.9.0.
Задаёт имя
и размер
зоны разделяемой памяти,
в которой хранятся конфигурация группы и её рабочее состояние,
разделяемые между рабочими процессами.
В одной и той же зоне могут быть сразу несколько групп.
В этом случае достаточно указать размер
только один раз.
Синтаксис: |
hash |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версии 1.7.2.
Задаёт метод балансировки нагрузки для группы, при котором
соответствие клиента серверу определяется при помощи
хэшированного значения ключа
.
В качестве ключа
может использоваться
текст, переменные и их комбинации.
Следует отметить, что любое добавление или удаление серверов в группе
может привести к перераспределению большинства ключей на другие серверы.
Метод совместим с библиотекой Perl
Cache::Memcached.
Если задан параметр consistent
, то вместо
вышеописанного метода будет использоваться метод консистентного хэширования
ketama.
Метод гарантирует, что при добавлении сервера в группу или его удалении
на другие серверы будет перераспределено минимальное число ключей.
Применение метода для кэширующих серверов обеспечивает
больший процент попаданий в кэш.
Метод совместим с библиотекой Perl
Cache::Memcached::Fast
при значении параметра ketama_points
равным 160.
Синтаксис: |
ip_hash; |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт для группы метод балансировки нагрузки, при котором запросы распределяются по серверам на основе IP-адресов клиентов. В качестве ключа для хэширования используются первые три октета IPv4-адреса клиента или IPv6-адрес клиента целиком. Метод гарантирует, что запросы одного и того же клиента будут всегда передаваться на один и тот же сервер. Если же этот сервер будет считаться недоступным, то запросы этого клиента будут передаваться на другой сервер. С большой долей вероятности это также будет один и тот же сервер.
IPv6-адреса поддерживаются начиная с версий 1.3.2 и 1.2.2.
Если один из серверов нужно убрать на некоторое время, то для сохранения
текущего хэширования IP-адресов клиентов этот сервер нужно пометить
параметром down
.
Пример:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; }
До версий 1.3.1 и 1.2.2 для серверов, использующих метод балансировки нагрузки
ip_hash
, нельзя было задать вес.
Синтаксис: |
keepalive |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версии 1.1.4.
Задействует кэш соединений для группы серверов.
Параметр соединения
устанавливает максимальное число
неактивных постоянных соединений с серверами группы, которые будут
сохраняться в кэше каждого рабочего процесса.
При превышении этого числа наиболее давно не используемые соединения
закрываются.
Следует особо отметить, что директиваkeepalive
не ограничивает общее число соединений с серверами группы, которые рабочие процессы nginx могут открыть. Параметрсоединения
следует устанавливать достаточно консервативно, чтобы серверы группы по-прежнему могли обрабатывать новые входящие соединения.
При использовании методов балансировки нагрузки, отличных
от стандартного round-robin, следует активировать их до
директивы keepalive
.
Пример конфигурации группы серверов memcached с постоянными соединениями:
upstream memcached_backend { server 127.0.0.1:11211; server 10.0.0.2:11211; keepalive 32; } server { ... location /memcached/ { set $memcached_key $uri; memcached_pass memcached_backend; } }
Для HTTP директиву
proxy_http_version
следует установить в “1.1
”,
а поле заголовка “Connection” — очистить:
upstream http_backend { server 127.0.0.1:8080; keepalive 16; } server { ... location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; ... } }
Хоть это и не рекомендуется, но также возможно использование постоянных соединений с HTTP/1.0, путём передачи поля заголовка “Connection: Keep-Alive” серверу группы.
Для работы постоянных соединений с FastCGI-серверами потребуется включить директиву fastcgi_keep_conn:
upstream fastcgi_backend { server 127.0.0.1:9000; keepalive 8; } server { ... location /fastcgi/ { fastcgi_pass fastcgi_backend; fastcgi_keep_conn on; ... } }
Протоколы SCGI и uwsgi не определяют семантику постоянных соединений.
Синтаксис: |
keepalive_requests |
---|---|
Умолчание: |
keepalive_requests 1000; |
Контекст: |
upstream |
Эта директива появилась в версии 1.15.3.
Задаёт максимальное число запросов, которые можно сделать по одному постоянному соединению. После того как сделано максимальное число запросов, соединение закрывается.
Периодическое закрытие соединений необходимо для освобождения памяти, выделенной под конкретные соединения. Поэтому использование слишком большого максимального числа запросов может приводить к чрезмерному потреблению памяти и не рекомендуется.
До версии 1.19.10 по умолчанию использовалось значение 100.
Синтаксис: |
keepalive_time |
---|---|
Умолчание: |
keepalive_time 1h; |
Контекст: |
upstream |
Эта директива появилась в версии 1.19.10.
Ограничивает максимальное время, в течение которого могут обрабатываться запросы в рамках постоянного соединения. По достижении заданного времени соединение закрывается после обработки очередного запроса.
Синтаксис: |
keepalive_timeout |
---|---|
Умолчание: |
keepalive_timeout 60s; |
Контекст: |
upstream |
Эта директива появилась в версии 1.15.3.
Задаёт таймаут, в течение которого неактивное постоянное соединение с сервером группы не будет закрыто.
Синтаксис: |
least_conn; |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версиях 1.3.1 и 1.2.2.
Задаёт для группы метод балансировки нагрузки, при котором запрос передаётся серверу с наименьшим числом активных соединений, с учётом весов серверов. Если подходит сразу несколько серверов, они выбираются циклически (в режиме round-robin) с учётом их весов.
Синтаксис: |
random [ |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версии 1.15.1.
Задаёт для группы метод балансировки нагрузки, при котором запрос передаётся случайно выбранному серверу, с учётом весов серверов.
Если указан необязательный параметр two
,
то nginx случайным образом выбирает
два
сервера, из которых выбирает сервер,
используя указанный метод
.
Методом по умолчанию является least_conn
,
при котором запрос передаётся на сервер
с наименьшим количеством активных соединений.
Встроенные переменные
Модуль ngx_http_upstream_module
поддерживает следующие встроенные переменные:
$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_bytes_received
- число байт, полученных от сервера группы (1.11.4). Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_bytes_sent
- число байт, переданных на сервер группы (1.15.8). Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_cache_age
- возраст элемента кэша (1.27.3).
$upstream_cache_key
- используемый ключ кэширования (1.27.1).
$upstream_cache_status
-
хранит статус доступа к кэшу ответов (0.8.3).
Статус может быть одним из “
MISS
”, “BYPASS
”, “EXPIRED
”, “STALE
”, “UPDATING
”, “REVALIDATED
” или “HIT
”. $upstream_connect_time
- хранит время, затраченное на установление соединения с сервером группы (1.9.1); время хранится в секундах с точностью до миллисекунд. В случае SSL, включает в себя время, потраченное на handshake. Времена нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
-
кука с указанным
именем
, переданная сервером группы в поле “Set-Cookie” заголовка ответа (1.7.1). Необходимо иметь в виду, что куки запоминаются только из ответа последнего сервера. $upstream_header_time
- хранит время, затраченное на получение заголовка ответа от сервера группы (1.7.10); время хранится в секундах с точностью до миллисекунд. Времена нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_http_
имя
-
хранят поля заголовка ответа сервера.
Например, поле заголовка ответа “Server”
доступно в переменной
$upstream_http_server
. Правила преобразования имён полей заголовка ответа в имена переменных такие же, как для переменных с префиксом “$http_”. Необходимо иметь в виду, что поля заголовка запоминаются только из ответа последнего сервера. $upstream_response_length
- хранит длину ответа, полученного от сервера группы (0.7.27); длина хранится в байтах. Длины нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_response_time
- хранит время, затраченное на получение ответа от сервера группы; время хранится в секундах с точностью до миллисекунд. Времена нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_status
- хранит статус ответа, полученного от сервера группы. Статусы нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. Если сервер не может быть выбран, то переменная хранит статус 502 (Bad Gateway).
$upstream_trailer_
имя
- хранит поля из конца ответа, полученного от сервера группы (1.13.10).