Path: blob/main/xml/ru/docs/stream/ngx_stream_upstream_module.xml
1 views
<?xml version="1.0"?>12<!--3Copyright (C) Nginx, Inc.4-->56<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">78<module name="Модуль ngx_stream_upstream_module"9link="/ru/docs/stream/ngx_stream_upstream_module.html"10lang="ru"11rev="42">1213<section id="summary">1415<para>16Модуль <literal>ngx_stream_upstream_module</literal> (1.9.0)17позволяет описывать группы серверов,18которые могут использоваться в директиве19<link doc="ngx_stream_proxy_module.xml" id="proxy_pass"/>.20</para>2122</section>232425<section id="example" name="Пример конфигурации">2627<para>28<example>29upstream <emphasis>backend</emphasis> {30hash $remote_addr consistent;3132server backend1.example.com:12345 weight=5;33server backend2.example.com:12345;34server unix:/tmp/backend3;3536server backup1.example.com:12345 backup;37server backup2.example.com:12345 backup;38}3940server {41listen 12346;42proxy_pass <emphasis>backend</emphasis>;43}44</example>45</para>4647<para>48Динамически настраиваемая группа49с периодическими50<link doc="ngx_stream_upstream_hc_module.xml">проверками работоспособности</link>51доступна как часть52<commercial_version>коммерческой подписки</commercial_version>:53<example>54resolver 10.0.0.1;5556upstream <emphasis>dynamic</emphasis> {57zone upstream_dynamic 64k;5859server backend1.example.com:12345 weight=5;60server backend2.example.com:12345 fail_timeout=5s slow_start=30s;61server 192.0.2.1:12345 max_fails=3;62server backend3.example.com:12345 resolve;63server backend4.example.com service=http resolve;6465server backup1.example.com:12345 backup;66server backup2.example.com:12345 backup;67}6869server {70listen 12346;71proxy_pass <emphasis>dynamic</emphasis>;72health_check;73}74</example>75</para>7677</section>787980<section id="directives" name="Директивы">8182<directive name="upstream">83<syntax block="yes"><value>название</value></syntax>84<default/>85<context>stream</context>8687<para>88Описывает группу серверов.89Серверы могут слушать на разных портах.90Кроме того, можно одновременно использовать серверы,91слушающие на TCP- и UNIX-сокетах.92</para>9394<para>95Пример:96<example>97upstream backend {98server backend1.example.com:12345 weight=5;99server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;100server unix:/tmp/backend2;101server backend3.example.com:12345 resolve;102103server backup1.example.com:12345 backup;104}105</example>106</para>107108<para>109По умолчанию соединения распределяются по серверам циклически110(в режиме round-robin) с учётом весов серверов.111В вышеприведённом примере каждые 7 соединений будут распределены так:1125 соединений на <literal>backend1.example.com:12345</literal>113и по одному соединению на второй и третий серверы.114Если при попытке работы с сервером происходит ошибка, то соединение115передаётся следующему серверу, и так далее до тех пор, пока не будут опробованы116все работающие серверы.117Если связь с серверами не удалась, соединение будет закрыто.118</para>119120</directive>121122123<directive name="server">124<syntax><value>адрес</value> [<value>параметры</value>]</syntax>125<default/>126<context>upstream</context>127128<para>129Задаёт <value>адрес</value> и другие <value>параметры</value>130сервера.131Адрес может быть указан в виде доменного имени или IP-адреса,132и обязательного порта, или в виде пути UNIX-сокета, который133указывается после префикса “<literal>unix:</literal>”.134Доменное имя, которому соответствует несколько IP-адресов,135задаёт сразу несколько серверов.136</para>137138<para>139Могут быть заданы следующие параметры:140<list type="tag">141142<tag-name id="weight">143<literal>weight</literal>=<value>число</value>144</tag-name>145<tag-desc>146задаёт вес сервера, по умолчанию 1.147</tag-desc>148149<tag-name id="max_conns">150<literal>max_conns</literal>=<value>число</value>151</tag-name>152<tag-desc>153ограничивает максимальное <value>число</value> одновременных154соединений к проксируемому серверу (1.11.5).155Значение по умолчанию равно 0 и означает, что ограничения нет.156Если группа не находится в <link id="zone">зоне разделяемой памяти</link>,157то ограничение работает отдельно для каждого рабочего процесса.158<note>159До версии 1.11.5 этот параметр был доступен как часть160<commercial_version>коммерческой подписки</commercial_version>.161</note>162</tag-desc>163164<tag-name id="max_fails">165<literal>max_fails</literal>=<value>число</value>166</tag-name>167<tag-desc>168задаёт число неудачных попыток работы с сервером, которые должны произойти169в течение времени, заданного параметром <literal>fail_timeout</literal>,170чтобы сервер считался недоступным на период времени, также заданный171параметром <literal>fail_timeout</literal>.172По умолчанию число попыток устанавливается равным 1.173Нулевое значение отключает учёт попыток.174В данном случае неудачной попыткой считается ошибка или таймаут175при установке соединения с сервером.176</tag-desc>177178<tag-name id="fail_timeout">179<literal>fail_timeout</literal>=<value>время</value>180</tag-name>181<tag-desc>182задаёт183<list type="bullet">184185<listitem>186время, в течение которого должно произойти заданное число неудачных187попыток работы с сервером для того, чтобы сервер считался недоступным;188</listitem>189190<listitem>191и время, в течение которого сервер будет считаться недоступным.192</listitem>193194</list>195По умолчанию параметр равен 10 секундам.196</tag-desc>197198<tag-name id="backup">199<literal>backup</literal>200</tag-name>201<tag-desc>202помечает сервер как запасной сервер.203На него будут передаваться соединения в случае,204если не работают основные серверы.205<note>206Параметр нельзя использовать совместно с207методами балансировки нагрузки <link id="hash"/> и <link id="random"/>.208</note>209</tag-desc>210211<tag-name id="down">212<literal>down</literal>213</tag-name>214<tag-desc>215помечает сервер как постоянно недоступный.216</tag-desc>217218<tag-name id="resolve">219<literal>resolve</literal>220</tag-name>221<tag-desc>222отслеживает изменения IP-адресов, соответствующих доменному имени сервера,223и автоматически изменяет конфигурацию группы224без необходимости перезапуска nginx.225Группа должна находиться в <link id="zone">зоне разделяемой памяти</link>.226<para>227Для работы этого параметра228директива <literal>resolver</literal>229должна быть задана в блоке230<link doc="ngx_stream_core_module.xml" id="resolver">stream</link>231или в соответствующем блоке <link id="resolver">upstream</link>.232</para>233234<para>235<note>236До версии 1.27.3 этот параметр был доступен только как часть237<commercial_version>коммерческой подписки</commercial_version>.238</note>239</para>240</tag-desc>241242<tag-name id="service">243<literal>service</literal>=<value>имя</value>244</tag-name>245<tag-desc>246включает преобразование247<link url="https://datatracker.ietf.org/doc/html/rfc2782">SRV</link>-записей248DNS и задаёт <value>имя</value> сервиса (1.9.13).249Для работы параметра необходимо указать250параметр <link id="resolve"/> для сервера251и не указывать порт сервера.252<para>253Если имя сервиса не содержит точку (“<literal>.</literal>”), то254имя составляется в соответствии с255<link url="https://datatracker.ietf.org/doc/html/rfc2782">RFC</link>256и в префикс службы добавляется протокол TCP.257Например, для получения258SRV-записи <literal>_http._tcp.backend.example.com</literal>259необходимо указать директиву:260<example>261server backend.example.com service=http resolve;262</example>263Если имя сервиса содержит одну и более точек, то имя составляется264при помощи соединения префикса службы и имени сервера.265Например, для получения SRV-записей266<literal>_http._tcp.backend.example.com</literal>267и <literal>server1.backend.example.com</literal>268необходимо указать директивы:269<example>270server backend.example.com service=_http._tcp resolve;271server example.com service=server1.backend resolve;272</example>273</para>274275<para>276SRV-записи с наивысшим приоритетом277(записи с одинаковым наименьшим значением приоритета)278преобразуются в основные серверы,279остальные SRV-записи преобразуются в запасные серверы.280Если в конфигурации сервера указан параметр <link id="backup"/>,281высокоприоритетные SRV-записи преобразуются в запасные серверы,282остальные SRV-записи игнорируются.283</para>284285<para>286<note>287До версии 1.27.3 этот параметр был доступен только как часть288<commercial_version>коммерческой подписки</commercial_version>.289</note>290</para>291</tag-desc>292293</list>294</para>295296<para>297Кроме того,298следующие параметры доступны как часть299<commercial_version>коммерческой подписки</commercial_version>:300<list type="tag">301302<tag-name id="slow_start">303<literal>slow_start</literal>=<value>время</value>304</tag-name>305<tag-desc>306задаёт <value>время</value>, в течение которого вес сервера307восстановится от нуля до своего номинального значения в ситуации, когда308неработоспособный (unhealthy) сервер вновь становится работоспособным309(<link doc="ngx_stream_upstream_hc_module.xml" id="health_check">healthy</link>)310или когда сервер становится доступным по прошествии времени,311в течение которого он считался <link id="fail_timeout">недоступным</link>.312Значение по умолчанию равно нулю и означает, что медленный старт выключен.313<note>314Параметр нельзя использовать совместно с315методами балансировки нагрузки <link id="hash"/> и <link id="random"/>.316</note>317</tag-desc>318319</list>320</para>321322<para>323<note>324Если в группе только один сервер, параметры <literal>max_fails</literal>,325<literal>fail_timeout</literal> и <literal>slow_start</literal>326игнорируются и такой сервер никогда не будет считаться недоступным.327</note>328</para>329330</directive>331332333<directive name="zone">334<syntax><value>имя</value> [<value>размер</value>]</syntax>335<default/>336<context>upstream</context>337338<para>339Задаёт <value>имя</value> и <value>размер</value> зоны разделяемой памяти,340в которой хранятся конфигурация группы и её рабочее состояние,341разделяемые между рабочими процессами.342В одной и той же зоне могут быть сразу несколько групп.343В этом случае достаточно указать <value>размер</value> только один раз.344</para>345346<para>347Дополнительно, как часть348<commercial_version>коммерческой подписки</commercial_version>,349в таких группах для изменения состава группы350или настроек отдельных серверов351нет необходимости перезапускать nginx.352Конфигурация доступна через353модуль <link doc="../http/ngx_http_api_module.xml">API</link> (1.13.3).354<note>355До версии 1.13.3356конфигурация была доступна только через специальный location,357в котором указана директива358<link doc="../http/ngx_http_upstream_conf_module.xml" id="upstream_conf"/>.359</note>360</para>361362</directive>363364365<directive name="state">366<syntax><value>файл</value></syntax>367<default/>368<context>upstream</context>369<appeared-in>1.9.7</appeared-in>370371<para>372Задаёт <value>файл</value>, в котором хранится состояние373динамически настраиваемой группы.374</para>375376<para>377Примеры:378<example>379state /var/lib/nginx/state/servers.conf; # путь для Linux380state /var/db/nginx/state/servers.conf; # путь для FreeBSD381</example>382</para>383384<para>385В данный момент состояние ограничено списком серверов с их параметрами.386Файл читается при парсинге конфигурации и обновляется каждый раз при387<link doc="../http/ngx_http_api_module.xml" id="stream_upstreams_stream_upstream_name_servers_">изменении</link>388конфигурации группы.389Изменение содержимого файла напрямую не рекомендуется.390Директиву нельзя использовать391совместно с директивой <link id="server"/>.392</para>393394<para>395<note>396Изменения, совершённые в момент397<link doc="../control.xml" id="reconfiguration">перезагрузки конфигурации</link>398или <link doc="../control.xml" id="upgrade">обновления бинарного файла</link>,399могут быть потеряны.400</note>401</para>402403<para>404<note>405Эта директива доступна как часть406<commercial_version>коммерческой подписки</commercial_version>.407</note>408</para>409410</directive>411412413<directive name="hash">414<syntax><value>ключ</value> [<literal>consistent</literal>]</syntax>415<default/>416<context>upstream</context>417418<para>419Задаёт метод балансировки нагрузки для группы, при котором420соответствие клиента серверу определяется при помощи421хэшированного значения <value>ключа</value>.422В качестве <value>ключа</value> может использоваться текст, переменные423и их комбинации (1.11.2).424Пример использования:425<example>426hash $remote_addr;427</example>428Следует отметить, что любое добавление или удаление серверов в группе429может привести к перераспределению большинства ключей на другие серверы.430Метод совместим с библиотекой Perl431<link url="https://metacpan.org/pod/Cache::Memcached">Cache::Memcached</link>.432</para>433434<para>435Если задан параметр <literal>consistent</literal>, то вместо436вышеописанного метода будет использоваться метод консистентного хэширования437<link url="https://www.metabrew.com/article/libketama-consistent-hashing-algo-memcached-clients">ketama</link>.438Метод гарантирует, что при добавлении сервера в группу или его удалении439на другие серверы будет перераспределено минимальное число ключей.440Применение метода для кэширующих серверов обеспечивает441больший процент попаданий в кэш.442Метод совместим с библиотекой Perl443<link url="https://metacpan.org/pod/Cache::Memcached::Fast">Cache::Memcached::Fast</link>444при значении параметра <value>ketama_points</value> равным 160.445</para>446447</directive>448449450<directive name="least_conn">451<syntax/>452<default/>453<context>upstream</context>454455<para>456Задаёт для группы метод балансировки нагрузки, при котором соединение457передаётся серверу с наименьшим числом активных соединений,458с учётом весов серверов.459Если подходит сразу несколько серверов, они выбираются циклически460(в режиме round-robin) с учётом их весов.461</para>462463</directive>464465466<directive name="least_time">467<syntax>468<literal>connect</literal> |469<literal>first_byte</literal> |470<literal>last_byte</literal>471[<literal>inflight</literal>]</syntax>472<default/>473<context>upstream</context>474<appeared-in>1.7.11</appeared-in>475476477<para>478Задаёт для группы метод балансировки нагрузки, при котором соединение479передаётся серверу с наименьшими средним временем ответа и480числом активных соединений с учётом весов серверов.481Если подходит сразу несколько серверов, то они выбираются циклически482(в режиме round-robin) с учётом их весов.483</para>484485<para>486Если указан параметр <literal>connect</literal>,487то учитывается время488<link id="var_upstream_connect_time">соединения</link> с сервером группы.489Если указан параметр <literal>first_byte</literal>,490то учитывается время получения491<link id="var_upstream_first_byte_time">первого байта</link> данных.492Если указан параметр <literal>last_byte</literal>,493то учитывается время получения494<link id="var_upstream_session_time">последнего байта</link> данных.495Если указан параметр <literal>inflight</literal> (1.11.6),496то также учитываются незавершённые соединения.497<note>498До версии 1.11.6499незавершённые соединения учитывались по умолчанию.500</note>501</para>502503<para>504<note>505До версии 1.31.0506эта директива была доступна только как часть507<commercial_version>коммерческой подписки</commercial_version>.508</note>509</para>510511</directive>512513514<directive name="random">515<syntax>[<literal>two</literal> [<value>метод</value>]]</syntax>516<default/>517<context>upstream</context>518<appeared-in>1.15.1</appeared-in>519520<para>521Задаёт для группы метод балансировки нагрузки, при котором соединение522передаётся случайно выбранному серверу, с учётом весов523серверов.524</para>525526<para>527Если указан необязательный параметр <literal>two</literal>,528то nginx случайным образом выбирает529<link url="https://homes.cs.washington.edu/~karlin/papers/balls.pdf">два</link>530сервера, из которых выбирает сервер,531используя указанный <literal>метод</literal>.532Методом по умолчанию является <literal>least_conn</literal>,533при котором соединение передаётся на сервер534с наименьшим количеством активных соединений.535</para>536537<para id="random_least_time">538Если указан метод <literal>least_time</literal>, то соединение передаётся539серверу540с наименьшими средним временем ответа и числом активных соединений.541Если указан <literal>least_time=connect</literal>,542то учитывается время543<link id="var_upstream_connect_time">соединения</link> с сервером группы.544Если указан <literal>least_time=first_byte</literal>,545то учитывается время получения546<link id="var_upstream_first_byte_time">первого байта</link> данных.547Если указан <literal>least_time=last_byte</literal>,548то учитывается время получения549<link id="var_upstream_session_time">последнего байта</link> данных.550<note>551Метод <literal>least_time</literal> доступен как часть552<commercial_version>коммерческой подписки</commercial_version>.553</note>554</para>555556</directive>557558559<directive name="resolver">560<syntax>561<value>адрес</value> ...562[<literal>valid</literal>=<value>время</value>]563[<literal>ipv4</literal>=<literal>on</literal>|<literal>off</literal>]564[<literal>ipv6</literal>=<literal>on</literal>|<literal>off</literal>]565[<literal>status_zone</literal>=<value>зона</value>]</syntax>566<default/>567<context>upstream</context>568<appeared-in>1.27.3</appeared-in>569570<para>571Задаёт серверы DNS, используемые для преобразования имён вышестоящих серверов572в адреса, например:573<example>574resolver 127.0.0.1 [::1]:5353;575</example>576Адрес может быть указан в виде доменного имени или IP-адреса,577и необязательного порта.578Если порт не указан, используется порт 53.579Серверы DNS опрашиваются циклически.580</para>581582<para id="resolver_ipv6">583По умолчанию nginx будет искать как IPv4-, так и IPv6-адреса584при преобразовании имён в адреса.585Если поиск IPv4- или IPv6-адресов нежелателен,586можно указать параметр <literal>ipv4=off</literal> (1.23.1) или587<literal>ipv6=off</literal>.588</para>589590<para id="resolver_valid">591По умолчанию nginx кэширует ответы, используя значение TTL из ответа.592Необязательный параметр <literal>valid</literal> позволяет это593переопределить:594<example>595resolver 127.0.0.1 [::1]:5353 valid=30s;596</example>597<note>598Для предотвращения DNS-спуфинга рекомендуется599использовать DNS-серверы в защищённой доверенной локальной сети.600</note>601</para>602603<para id="resolver_status_zone">604Необязательный параметр <literal>status_zone</literal> (1.17.5)605включает606<link doc="../http/ngx_http_api_module.xml" id="resolvers_">сбор информации</link>607о запросах и ответах сервера DNS608в указанной <value>зоне</value>.609Параметр доступен как часть610<commercial_version>коммерческой подписки</commercial_version>.611</para>612613<para>614<note>615Начиная с версии 1.17.5 и до версии 1.27.3616эта директива была доступна только как часть617<commercial_version>коммерческой подписки</commercial_version>.618</note>619</para>620621</directive>622623624<directive name="resolver_timeout">625<syntax><value>время</value></syntax>626<default>30s</default>627<context>upstream</context>628<appeared-in>1.27.3</appeared-in>629630<para>631Задаёт таймаут для преобразования имени в адрес, например:632<example>633resolver_timeout 5s;634</example>635</para>636637<para>638<note>639Начиная с версии 1.17.5 и до версии 1.27.3640эта директива была доступна только как часть641<commercial_version>коммерческой подписки</commercial_version>.642</note>643</para>644645</directive>646647</section>648649650<section id="variables" name="Встроенные переменные">651652<para>653Модуль <literal>ngx_stream_upstream_module</literal>654поддерживает следующие встроенные переменные:655<list type="tag">656657<tag-name id="var_upstream_addr"><var>$upstream_addr</var></tag-name>658<tag-desc>659хранит IP-адрес и порт или путь к UNIX-сокету сервера группы (1.11.4).660Если при проксировании были сделаны обращения к нескольким серверам,661то их адреса разделяются запятой, например662“<literal>192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock</literal>”.663Если сервер не может быть выбран,664то переменная хранит имя группы серверов.665</tag-desc>666667<tag-name id="var_upstream_bytes_received"><var>$upstream_bytes_received</var></tag-name>668<tag-desc>669число байт, полученных от сервера группы (1.11.4).670Значения нескольких соединений671разделяются запятыми подобно адресам в переменной672<link id="var_upstream_addr">$upstream_addr</link>.673</tag-desc>674675<tag-name id="var_upstream_bytes_sent"><var>$upstream_bytes_sent</var></tag-name>676<tag-desc>677число байт, переданных на сервер группы (1.11.4).678Значения нескольких соединений679разделяются запятыми подобно адресам в переменной680<link id="var_upstream_addr">$upstream_addr</link>.681</tag-desc>682683<tag-name id="var_upstream_connect_time"><var>$upstream_connect_time</var></tag-name>684<tag-desc>685время установки соединения с сервером группы (1.11.4);686время хранится в секундах с точностью до миллисекунд.687Времена нескольких соединений688разделяются запятыми подобно адресам в переменной689<link id="var_upstream_addr">$upstream_addr</link>.690</tag-desc>691692<tag-name id="var_upstream_first_byte_time"><var>$upstream_first_byte_time</var></tag-name>693<tag-desc>694время получения первого байта данных (1.11.4);695время хранится в секундах с точностью до миллисекунд.696Времена нескольких соединений697разделяются запятыми подобно адресам в переменной698<link id="var_upstream_addr">$upstream_addr</link>.699</tag-desc>700701<tag-name id="var_upstream_last_addr"><var>$upstream_last_addr</var></tag-name>702<tag-desc>703хранит IP-адрес или путь к UNIX-сокету704последнего выбранного сервера группы (1.29.3).705706<para>707<note>708Эта переменная доступна как часть709<commercial_version>коммерческой подписки</commercial_version>.710</note>711</para>712713</tag-desc>714715<tag-name id="var_upstream_session_time"><var>$upstream_session_time</var></tag-name>716<tag-desc>717длительность сессии в секундах с точностью до миллисекунд (1.11.4).718Времена нескольких соединений719разделяются запятыми подобно адресам в переменной720<link id="var_upstream_addr">$upstream_addr</link>.721</tag-desc>722723</list>724</para>725726</section>727728</module>729730731