Модуль ngx_http_grpc_module
Модуль ngx_http_grpc_module
позволяет передавать запросы
gRPC-серверу (1.13.10).
Для работы этого модуля необходим
модуль ngx_http_v2_module.
Пример конфигурации
server { listen 9000; http2 on; location / { grpc_pass 127.0.0.1:9000; } }
Директивы
Синтаксис: |
grpc_bind
|
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт локальный IP-адрес с необязательным портом,
который будет использоваться в исходящих соединениях с gRPC-сервером.
В значении параметра допустимо использование переменных.
Специальное значение off
отменяет действие
унаследованной с предыдущего уровня конфигурации
директивы grpc_bind
, позволяя системе
самостоятельно выбирать локальный IP-адрес и порт.
Параметр transparent
позволяет
задать нелокальный IP-aдрес, который будет использоваться в
исходящих соединениях с gRPC-сервером,
например, реальный IP-адрес клиента:
grpc_bind $remote_addr transparent;
Для работы параметра
обычно требуется
запустить рабочие процессы nginx с привилегиями
суперпользователя.
В Linux этого не требуется, так как если
указан параметр transparent
, то рабочие процессы
наследуют capability CAP_NET_RAW
из главного процесса.
Также необходимо настроить таблицу маршрутизации ядра
для перехвата сетевого трафика с gRPC-сервера.
Синтаксис: |
grpc_buffer_size |
---|---|
Умолчание: |
grpc_buffer_size 4k|8k; |
Контекст: |
http , server , location |
Задаёт размер
буфера, в который будет читаться ответ,
получаемый от gRPC-сервера.
Ответ синхронно передаётся клиенту сразу же по мере его поступления.
Синтаксис: |
grpc_connect_timeout |
---|---|
Умолчание: |
grpc_connect_timeout 60s; |
Контекст: |
http , server , location |
Задаёт таймаут для установления соединения с gRPC-сервером. Необходимо иметь в виду, что этот таймаут обычно не может превышать 75 секунд.
Синтаксис: |
grpc_hide_header |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
По умолчанию
nginx не передаёт клиенту поля заголовка “Date”,
“Server” и
“X-Accel-...” из ответа gRPC-сервера.
Директива grpc_hide_header
задаёт дополнительные поля,
которые не будут передаваться.
Если же передачу полей нужно разрешить, можно воспользоваться
директивой grpc_pass_header.
Синтаксис: |
grpc_ignore_headers |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Запрещает обработку некоторых полей заголовка из ответа gRPC-сервера. В директиве можно указать поля “X-Accel-Redirect” и “X-Accel-Charset”.
Если не запрещено, обработка этих полей заголовка заключается в следующем:
- “X-Accel-Redirect” производит внутреннее перенаправление на указанный URI;
- “X-Accel-Charset” задаёт желаемую кодировку ответа.
Синтаксис: |
grpc_intercept_errors |
---|---|
Умолчание: |
grpc_intercept_errors off; |
Контекст: |
http , server , location |
Определяет, передавать ли клиенту ответы gRPC-сервера с кодом больше либо равным 300, или же перехватывать их и перенаправлять на обработку nginx’у с помощью директивы error_page.
Синтаксис: |
grpc_next_upstream
|
---|---|
Умолчание: |
grpc_next_upstream error timeout; |
Контекст: |
http , server , location |
Определяет, в каких случаях запрос будет передан следующему серверу:
error
- произошла ошибка соединения с сервером, передачи ему запроса или чтения заголовка ответа сервера;
timeout
- произошёл таймаут во время соединения с сервером, передачи ему запроса или чтения заголовка ответа сервера;
invalid_header
- сервер вернул пустой или неверный ответ;
http_500
- сервер вернул ответ с кодом 500;
http_502
- сервер вернул ответ с кодом 502;
http_503
- сервер вернул ответ с кодом 503;
http_504
- сервер вернул ответ с кодом 504;
http_403
- сервер вернул ответ с кодом 403;
http_404
- сервер вернул ответ с кодом 404;
http_429
- сервер вернул ответ с кодом 429;
non_idempotent
- обычно запросы с
неидемпотентным
методом
(
POST
,LOCK
,PATCH
) не передаются на другой сервер, если запрос серверу группы уже был отправлен; включение параметра явно разрешает повторять подобные запросы; off
- запрещает передачу запроса следующему серверу.
Необходимо понимать, что передача запроса следующему серверу возможна только при условии, что клиенту ещё ничего не передавалось. То есть, если ошибка или таймаут возникли в середине передачи ответа, то исправить это уже невозможно.
Директива также определяет, что считается
неудачной
попыткой работы с сервером.
Случаи error
, timeout
и
invalid_header
всегда считаются неудачными попытками, даже если они не указаны в директиве.
Случаи http_500
, http_502
,
http_503
, http_504
и http_429
считаются неудачными попытками, только если они указаны в директиве.
Случаи http_403
и http_404
никогда не считаются неудачными попытками.
Передача запроса следующему серверу может быть ограничена по количеству попыток и по времени.
Синтаксис: |
grpc_next_upstream_timeout |
---|---|
Умолчание: |
grpc_next_upstream_timeout 0; |
Контекст: |
http , server , location |
Ограничивает время, в течение которого возможна передача запроса
следующему серверу.
Значение 0
отключает это ограничение.
Синтаксис: |
grpc_next_upstream_tries |
---|---|
Умолчание: |
grpc_next_upstream_tries 0; |
Контекст: |
http , server , location |
Ограничивает число допустимых попыток для передачи запроса
следующему серверу.
Значение 0
отключает это ограничение.
Синтаксис: |
grpc_pass |
---|---|
Умолчание: | — |
Контекст: |
location , if в location |
Задаёт адрес gRPC-сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и порта:
grpc_pass localhost:9000;
или в виде пути UNIX-сокета:
grpc_pass unix:/tmp/grpc.socket;
Также может использоваться схема “grpc://
”:
grpc_pass grpc://127.0.0.1:9000;
Для использования gRPC по SSL необходимо использовать схему
“grpcs://
”:
grpc_pass grpcs://127.0.0.1:443;
Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). И, кроме того, адрес может быть группой серверов.
В значении параметра можно использовать переменные (1.17.8). В этом случае, если адрес указан в виде доменного имени, имя ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver’а.
Синтаксис: |
grpc_pass_header |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Разрешает передавать от gRPC-сервера клиенту запрещённые для передачи поля заголовка.
Синтаксис: |
grpc_read_timeout |
---|---|
Умолчание: |
grpc_read_timeout 60s; |
Контекст: |
http , server , location |
Задаёт таймаут при чтении ответа gRPC-сервера. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями чтения. Если по истечении этого времени gRPC-сервер ничего не передаст, соединение закрывается.
Синтаксис: |
grpc_send_timeout |
---|---|
Умолчание: |
grpc_send_timeout 60s; |
Контекст: |
http , server , location |
Задаёт таймаут при передаче запроса gRPC-серверу. Таймаут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если по истечении этого времени gRPC-сервер не примет новых данных, соединение закрывается.
Синтаксис: |
grpc_set_header |
---|---|
Умолчание: |
grpc_set_header Content-Length $content_length; |
Контекст: |
http , server , location |
Позволяет переопределять или добавлять поля заголовка запроса,
передаваемые gRPC-серверу.
В качестве значения можно использовать текст, переменные и их комбинации.
Директивы наследуются с предыдущего уровня конфигурации при условии, что
на данном уровне не описаны свои директивы grpc_set_header
.
Если значение поля заголовка — пустая строка, то поле вообще не будет передаваться gRPC-серверу:
grpc_set_header Accept-Encoding "";
Синтаксис: |
grpc_socket_keepalive |
---|---|
Умолчание: |
grpc_socket_keepalive off; |
Контекст: |
http , server , location |
Эта директива появилась в версии 1.15.6.
Конфигурирует поведение “TCP keepalive”
для исходящих соединений к gRPC-серверу.
По умолчанию для сокета действуют настройки операционной системы.
Если указано значение “on
”, то
для сокета включается параметр SO_KEEPALIVE
.
Синтаксис: |
grpc_ssl_certificate |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт файл
с сертификатом в формате PEM
для аутентификации на gRPC SSL-сервере.
Начиная с версии 1.21.0 в имени файла можно использовать переменные.
Синтаксис: |
grpc_ssl_certificate_key |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт файл
с секретным ключом в формате PEM
для аутентификации на gRPC SSL-сервере.
Вместо файла
можно указать значение
engine
:имя
:id
,
которое загружает ключ с указанным id
из OpenSSL engine с заданным именем
.
Начиная с версии 1.21.0 в имени файла можно использовать переменные.
Синтаксис: |
grpc_ssl_ciphers |
---|---|
Умолчание: |
grpc_ssl_ciphers DEFAULT; |
Контекст: |
http , server , location |
Описывает разрешённые шифры для запросов к gRPC SSL-серверу. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
Полный список можно посмотреть с помощью команды
“openssl ciphers
”.
Синтаксис: |
grpc_ssl_conf_command |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Эта директива появилась в версии 1.19.4.
Задаёт произвольные конфигурационные команды OpenSSL при установлении соединения с gRPC SSL-сервером.
Директива поддерживается при использовании OpenSSL 1.0.2 и выше.
На одном уровне может быть указано
несколько директив grpc_ssl_conf_command
.
Директивы наследуются с предыдущего уровня конфигурации при условии, что
на данном уровне не описаны
свои директивы grpc_ssl_conf_command
.
Следует учитывать, что изменение настроек OpenSSL напрямую может привести к неожиданному поведению.
Синтаксис: |
grpc_ssl_crl |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Указывает файл
с отозванными сертификатами (CRL)
в формате PEM, используемыми при проверке
сертификата gRPC SSL-сервера.
Синтаксис: |
grpc_ssl_name |
---|---|
Умолчание: |
grpc_ssl_name имя хоста из grpc_pass; |
Контекст: |
http , server , location |
Позволяет переопределить имя сервера, используемое при проверке сертификата gRPC SSL-сервера, а также для передачи его через SNI при установлении соединения с gRPC SSL-сервером.
По умолчанию используется имя хоста из grpc_pass.
Синтаксис: |
grpc_ssl_password_file |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт файл
с паролями от
секретных ключей,
где каждый пароль указан на отдельной строке.
Пароли применяются по очереди в момент загрузки ключа.
Синтаксис: |
grpc_ssl_protocols
[ |
---|---|
Умолчание: |
grpc_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; |
Контекст: |
http , server , location |
Разрешает указанные протоколы для запросов к gRPC SSL-серверу.
Параметр TLSv1.3
используется по умолчанию
начиная с 1.23.4.
Синтаксис: |
grpc_ssl_server_name |
---|---|
Умолчание: |
grpc_ssl_server_name off; |
Контекст: |
http , server , location |
Разрешает или запрещает передачу имени сервера через расширение Server Name Indication протокола TLS (SNI, RFC 6066) при установлении соединения с gRPC SSL-сервером.
Синтаксис: |
grpc_ssl_session_reuse |
---|---|
Умолчание: |
grpc_ssl_session_reuse on; |
Контекст: |
http , server , location |
Определяет, использовать ли повторно SSL-сессии при
работе с gRPC-сервером.
Если в логах появляются ошибки
“SSL3_GET_FINISHED:digest check failed
”,
то можно попробовать выключить
повторное использование сессий.
Синтаксис: |
grpc_ssl_trusted_certificate |
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт файл
с доверенными сертификатами CA в формате PEM,
используемыми при проверке
сертификата gRPC SSL-сервера.
Синтаксис: |
grpc_ssl_verify |
---|---|
Умолчание: |
grpc_ssl_verify off; |
Контекст: |
http , server , location |
Разрешает или запрещает проверку сертификата gRPC SSL-сервера.
Синтаксис: |
grpc_ssl_verify_depth |
---|---|
Умолчание: |
grpc_ssl_verify_depth 1; |
Контекст: |
http , server , location |
Устанавливает глубину проверки в цепочке сертификатов gRPC SSL-сервера.