grpc代理
1.功能描述
默认自带 njet_http_grpc_module 允许传递请求 到 gRPC 服务器。
2.依赖模块
无
3.指令说明
格式说明:
- 语法 (Syntax): 描述了该指令在 njet 配置文件中如何书写。
- 默认值 (Default): 如果未明确配置该指令,njet 使用的默认值。 如果为 “—",则表示没有默认值,必须显式配置。
- 上下文 (Context): 该指令可以在哪些配置块中使用,例如 http,server,location。
grpc_bind
语法 (Syntax) | grpc_bind address [transparent] | off |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
使与 gRPC 服务器建立的传出连接从指定的本地 IP 地址(可选项带有端口)发起。参数值可以包含变量。特殊值 off
取消继承自前一个配置级别的 grpc_bind` 指令的效果,允许系统自动分配本地 IP 地址和端口。
transparent
参数允许与 gRPC 服务器建立的传出连接从非本地 IP 地址发起,例如,从客户端的真实 IP 地址:
grpc_bind $remote_addr transparent;
为了使此参数生效,通常需要以超级用户权限运行 njet worker 进程。在 Linux 上,如果指定了 transparent
参数,worker 进程会从 master 进程继承 CAP_NET_RAW
能力,因此不需要。还需要配置内核路由表以拦截来自 gRPC 服务器的网络流量。
grpc_buffer_size
语法 (Syntax) | grpc_buffer_size size; |
---|---|
默认值 (Default) | grpc_buffer_size 4k|8k; |
上下文 (Context) | http,server,location |
描述 (Description):
设置用于读取从 gRPC 服务器接收到的响应的缓冲区大小。 一旦收到响应会同步传递给客户端。
grpc_connect_timeout
语法 (Syntax) | grpc_connect_timeout time; |
---|---|
默认值 (Default) | grpc_connect_timeout 60s; |
上下文 (Context) | http,server,location |
描述 (Description):
定义与 gRPC 服务器建立连接的超时时间。 应该注意的是,此超时时间通常不能超过 75 秒。
grpc_hide_header
语法 (Syntax) | grpc_hide_header field; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
默认情况下,njet 不会将来自 gRPC 服务器响应的 header 字段 “Date”、“Server” 和 “X-Accel-…” 传递给客户端。 grpc_hide_header 指令设置其他将不传递的字段。 相反,如果需要允许传递字段,可以使用 grpc_pass_header
指令。
grpc_ignore_headers
语法 (Syntax) | grpc_ignore_headers field …; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
禁用对来自 gRPC 服务器的某些响应 header 字段的处理。 可以忽略以下字段:“X-Accel-Redirect” 和 “X-Accel-Charset”。
如果未禁用,则处理这些 header 字段具有以下效果:
- “X-Accel-Redirect” 执行到指定 URI 的内部重定向。
- “X-Accel-Charset” 设置响应的所需字符集。
grpc_intercept_errors
语法 (Syntax) | grpc_intercept_errors on | off; |
---|---|
默认值 (Default) | grpc_intercept_errors off; |
上下文 (Context) | http,server,location |
描述 (Description):
确定是否应将代码大于或等于 300 的 gRPC 服务器响应传递给客户端,还是应拦截并重定向到 njet,以便使用 error_page
指令进行处理。
grpc_next_upstream
语法 (Syntax) | grpc_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off …; |
---|---|
默认值 (Default) | grpc_next_upstream error timeout; |
上下文 (Context) | http,server,location |
描述 (Description):
指定在哪些情况下应将请求传递到下一个服务器:
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
: 禁止将请求传递到下一个服务器。
应该记住,只有在尚未向客户端发送任何内容时,才可以将请求传递到下一个服务器。 也就是说,如果在传输响应的过程中发生错误或超时,则无法修复。
该指令还定义了什么被认为是与服务器通信的不成功尝试。
即使未在该指令中指定,错误、超时和无效头的情况也始终被认为是不成功的尝试。
仅当在该指令中指定了http_500、http_502、http_503、http_504和http_429的情况,才被认为是不成功的尝试。
永远不会将http_403和http_404的情况视为不成功的尝试。
grpc_next_upstream_timeout
语法 (Syntax) | grpc_next_upstream_timeout time; |
---|---|
默认值 (Default) | grpc_next_upstream_timeout 0; |
上下文 (Context) | http,server,location |
描述 (Description):
限制可以将请求传递到下一个服务器的时间。 值 0 关闭此限制。
grpc_next_upstream_tries
语法 (Syntax) | grpc_next_upstream_tries number; |
---|---|
默认值 (Default) | grpc_next_upstream_tries 0; |
上下文 (Context) | http,server,location |
描述 (Description):
限制将请求传递到下一个服务器的可能尝试次数。 值 0 关闭此限制。
grpc_pass
语法 (Syntax) | grpc_pass address; |
---|---|
默认值 (Default) | — |
上下文 (Context) | location , if in location |
描述 (Description):
设置 gRPC 服务器地址。 可以将地址指定为域名或 IP 地址以及端口:
grpc_pass localhost:9000;
或作为 UNIX 域套接字路径:
grpc_pass unix:/tmp/grpc.socket;
或者,可以使用 “grpc://” 方案:
grpc_pass grpc://127.0.0.1:9000;
要通过 SSL 使用 gRPC,应使用 “grpcs://” 方案:
grpc_pass grpcs://127.0.0.1:443;
如果域名解析为多个地址,则所有地址将以轮询方式使用。 此外,可以将地址指定为服务器组。
参数值可以包含变量 (1.17.8)。 在这种情况下,如果将地址指定为域名,则会在描述的服务器组中搜索该名称,如果找不到,则使用解析器确定。
grpc_pass_header
语法 (Syntax) | grpc_pass_header field; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
允许将原本禁用的 header 字段从 gRPC 服务器传递到客户端。
grpc_read_timeout
语法 (Syntax) | grpc_read_timeout time; |
---|---|
默认值 (Default) | grpc_read_timeout 60s; |
上下文 (Context) | http,server,location |
描述 (Description):
定义从 gRPC 服务器读取响应的超时时间。 超时时间仅在两个连续的读取操作之间设置,而不适用于整个响应的传输。 如果 gRPC 服务器在此时间内未传输任何内容,则连接将关闭。
grpc_send_timeout
语法 (Syntax) | grpc_send_timeout time; |
---|---|
默认值 (Default) | grpc_send_timeout 60s; |
上下文 (Context) | http,server,location |
描述 (Description):
设置将请求传输到 gRPC 服务器的超时时间。 超时时间仅在两个连续的写入操作之间设置,而不适用于整个请求的传输。 如果 gRPC 服务器在此时间内未收到任何内容,则连接将关闭。
grpc_set_header
语法 (Syntax) | grpc_set_header field value; |
---|---|
默认值 (Default) | grpc_set_header Content-Length $content_length; |
上下文 (Context) | http,server,location |
描述 (Description):
允许重新定义或将字段附加到传递给 gRPC 服务器的请求 header。 该值可以包含文本,变量及其组合。 仅当在当前级别上未定义 grpc_set_header` 指令时,这些指令才从前一个配置级别继承。
如果 header 字段的值为空字符串,则不会将此字段传递到 gRPC 服务器:
grpc_set_header Accept-Encoding "";
grpc_socket_keepalive
语法 (Syntax) | grpc_socket_keepalive on | off; |
---|---|
默认值 (Default) | grpc_socket_keepalive off; |
上下文 (Context) | http,server,location |
描述 (Description):
配置与 gRPC 服务器的传出连接的 “TCP keepalive” 行为。 默认情况下,操作系统的设置对套接字有效。 如果该指令设置为值 “on”,则为该套接字启用 SO_KEEPALIVE
套接字选项。
grpc_ssl_certificate
语法 (Syntax) | grpc_ssl_certificate file; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
指定一个文件,其中包含 PEM 格式的证书,用于向 gRPC SSL 服务器进行身份验证。
grpc_ssl_certificate_cache
语法 (Syntax) | |
---|---|
grpc_ssl_certificate_cache off; | |
grpc_ssl_certificate_cache max=N [inactive=time] [valid=time]; | |
默认值 (Default) | grpc_ssl_certificate_cache off; |
上下文 (Context) | http, server, location |
描述 (Description):
定义一个缓存,用于存储使用变量指定的 SSL 证书和密钥。
该指令具有以下参数:
max
:设置缓存中的最大元素数; 在缓存溢出时,将删除最近最少使用的 (LRU) 元素。inactive
:定义在一段时间后,如果在此时间内未访问过元素,则将从缓存中删除该元素的时间; 默认情况下为 10 秒。valid
:定义缓存中元素被认为是有效且可以重用的时间; 默认情况下为 60 秒。 超过此时间的证书将被重新加载或重新验证。off
:禁用缓存。
示例:
grpc_ssl_certificate $grpc_ssl_server_name.crt;
grpc_ssl_certificate_key $grpc_ssl_server_name.key;
grpc_ssl_certificate_cache max=1000 inactive=20s valid=1m;
grpc_ssl_certificate_key
语法 (Syntax) | grpc_ssl_certificate_key file; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
指定一个文件,其中包含 PEM 格式的密钥,用于向 gRPC SSL 服务器进行身份验证。
可以指定值 engine:name:id
而不是文件,该值从 OpenSSL 引擎 name
加载具有指定 id
的密钥。
可以指定值 store:scheme:id
而不是文件,该值用于加载具有指定 id
和 OpenSSL 提供程序注册 URI 方案(例如 pkcs11)的密钥。
grpc_ssl_ciphers
语法 (Syntax) | grpc_ssl_ciphers ciphers; |
---|---|
默认值 (Default) | grpc_ssl_ciphers DEFAULT; |
上下文 (Context) | http,server,location |
描述 (Description):
指定用于请求 gRPC SSL 服务器的已启用密码。 这些密码以 OpenSSL 库理解的格式指定。
可以使用 “openssl ciphers” 命令查看完整列表。
grpc_ssl_conf_command
语法 (Syntax) | grpc_ssl_conf_command name value; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
在与 gRPC SSL 服务器建立连接时,设置任意 OpenSSL 配置命令。
可以在同一级别上指定多个 grpc_ssl_conf_command 指令。 仅当在当前级别上未定义 grpc_ssl_conf_command 指令时,这些指令才从前一个配置级别继承。
请注意,直接配置 OpenSSL 可能会导致意外行为。
grpc_ssl_crl
语法 (Syntax) | grpc_ssl_crl file; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
指定一个文件,其中包含 PEM 格式的已吊销证书 (CRL),用于验证 gRPC SSL 服务器的证书。
grpc_ssl_name
语法 (Syntax) | grpc_ssl_name name; |
---|---|
默认值 (Default) | grpc_ssl_name host from grpc_pass; |
上下文 (Context) | http,server,location |
描述 (Description):
允许覆盖用于验证 gRPC SSL 服务器证书的服务器名称,以及在与 gRPC SSL 服务器建立连接时通过 SNI 传递的服务器名称。
默认情况下,使用 grpc_pass 中的主机部分。
grpc_ssl_password_file
语法 (Syntax) | grpc_ssl_password_file file; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
指定一个文件,其中包含密钥的密码短语,每个密码短语在单独的一行上指定。 加载密钥时,将依次尝试密码短语。
grpc_ssl_protocols
语法 (Syntax) | grpc_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; |
---|---|
默认值 (Default) | grpc_ssl_protocols TLSv1.2 TLSv1.3; |
上下文 (Context) | http,server,location |
描述 (Description):
为请求 gRPC SSL 服务器启用指定的协议。
grpc_ssl_server_name
语法 (Syntax) | grpc_ssl_server_name on | off; |
---|---|
默认值 (Default) | grpc_ssl_server_name off; |
上下文 (Context) | http,server,location |
描述 (Description):
启用或禁用在与 gRPC SSL 服务器建立连接时通过 TLS 服务器名称指示扩展 (SNI, RFC 6066) 传递服务器名称。
grpc_ssl_session_reuse
语法 (Syntax) | grpc_ssl_session_reuse on | off; |
---|---|
默认值 (Default) | grpc_ssl_session_reuse on; |
上下文 (Context) | http,server,location |
描述 (Description):
确定在使用 gRPC 服务器时是否可以重用 SSL 会话。 如果日志中出现错误 “摘要检查失败”,请尝试禁用会话重用。
grpc_ssl_trusted_certificate
语法 (Syntax) | grpc_ssl_trusted_certificate file; |
---|---|
默认值 (Default) | — |
上下文 (Context) | http,server,location |
描述 (Description):
指定一个文件,其中包含 PEM 格式的可信 CA 证书,用于验证 gRPC SSL 服务器的证书。
grpc_ssl_verify
语法 (Syntax) | grpc_ssl_verify on | off; |
---|---|
默认值 (Default) | grpc_ssl_verify off; |
上下文 (Context) | http,server,location |
描述 (Description):
启用或禁用 gRPC SSL 服务器证书的验证。
grpc_ssl_verify_depth
语法 (Syntax) | grpc_ssl_verify_depth number; |
---|---|
默认值 (Default) | grpc_ssl_verify_depth 1; |
上下文 (Context) | http,server,location |
描述 (Description):
设置 gRPC SSL 服务器证书链中的验证深度。
4.配置样例
njet.conf:
server {
listen 9000;
access_log logs/access_grpc.log;
http2 on;
location / {
grpc_pass 127.0.0.1:50051;
}
}
5.调用样例
grpc_client 发起请求
./grpc_client -addr localhost:9000
2025/09/10 11:21:46 Greeting: Hello world
./grpc_client -addr localhost:9000 -name requestnjet
2025/09/10 11:21:56 Greeting: Hello requestnjet
grpc_server的日志
./grpc_sever
2025/09/10 11:16:34 server listening at [::]:50051
2025/09/10 11:21:46 Received: world
2025/09/10 11:21:56 Received: requestnjet
查看njet accesslog日志
tail -f /usr/local/njet/logs/access_grpc.log
127.0.0.1 - - [10/Sep/2025:11:24:45 +0800] "POST /helloworld.Greeter/SayHello HTTP/2.0" 200 24 "-" "grpc-go/1.75.0"