前言
nginx从1.13.10版本开始提供对gRPC代理的支持。由于grpc基于http2,因此编译nginx时需要添加参数--with-http_v2_module
来启用对http2协议的支持。
常用配置
应该是nginx 1.25版本开始,声明http2的语法应该单独写,而不是写在listen中。
listen 80; http2 on;
- 基本配置
http {
server {
listen 80 http2;
location / {
grpc_pass grpc://192.168.0.14:84;
}
}
# 示例2, 通过server_name复用端口
server {
listen 80 http2;
server_name demo2.test.com;
location / {
grpc_pass grpc://192.168.0.14:85;
}
}
}
- 反向代理后端SSL gRPC
server {
listen 80 http2;
grpc_ssl_verify off; # 关闭对grpc服务器的ssl证书验证
grpc_ssl_session_reuser on; # 启用与grpc服务器https连接的ssl会话重用功能
location / {
grpc_pass grpcs://192.168.0.14:84; # grpc后端地址
}
}
- nginx同时启用https。客户端 -> nginx(https) -> 服务端(SSL)
server {
listen 443 ssl http2;
ssl_certificate ssl/test.pem;
ssl_certificate_key ssl/test.key;
grpc_ssl_verify off;
grpc_ssl_session_reuser on;
location / {
grpc_pass grpcs://192.168.0.14:84;
}
}
- 负载均衡配置
upstream grpc_backend {
server 192.168.0.11:8001;
server 192.168.0.12:8001;
}
server {
listen 80 http2;
location / {
grpc_pass grpc://grpc_backend;
}
}
配置指令
名称 | 语法 | 默认值 | 说明 |
---|---|---|---|
grpc_bind | address [transparent] 或off | nil | 设置从指定的本地IP地址及端口进行反向代理。设置transparent时,将客户端真实IP透传给后端。 |
grpc_buffer_size | size | 4k或8k | 设用于从grpc服务器读取响应数据缓冲区大小。 |
grpc_pass | address | nil | 后端grpc的地址 |
grpc_hide_header | field | nil | 指定grpc后端响应数据中,不向客户端传递的http头 |
grpc_pass_header | field | nil | 允许部分后端请求头返回给客户端 |
grpc_ignore_headers | fields | nil | 设置禁止nginx处理从后端获取响应的header |
grpc_set_header | field value | 在转发给grpc后端前,修改或添加请求头 | |
grpc_connect_timeout | time | 60s | nginx与后端建立连接的超时时间 |
grpc_read_timeout | time | 60s | 从后端连续接收两个读操作之间的超时时间 |
grpc_send_timeout | time | 60s | 从后端连续接收两个写操作之间的超时时间 |
grpc_socket_keepalive | on 或 off | off | 启用nginx与后端的tcp keepalive机制 |
grpc_intercept_errors | on 或 off | off | 启用拦截后端响应码大于或等于300的结果 |
grpc_next_upstream | 当出现指令之中指定的条件时,将未返回响应的请求传递给upstream中的另一个后端 | ||
grpc_next_upstream_timeout | time | 0 | next_upstream过程中的超时时间 |
grpc_next_upstream_tries | number | 0 | next_upstream中下一个后端的尝试次数 |
grpc_ssl_protocols | 指定nginx与后端建立ssl连接的ssl协议的版本 | ||
grpc_ssl_session_reuse | on 或 off | on | 启用与后端https连接的ssl会话复用功能 |
grpc_ssl_ciphers | 设置建立https连接时用于协商使用的加密算法组合 | ||
grpc_ssl_server_name | on或off | off | 在与grpc服务器建立ssl连接时,设置是否启用通过SNI或RFC6066传递主机名 |
grpc_ssl_certificate | file | nil | 指定后端对nginx的ssl证书文件 |
grpc_ssl_certificate_key | file | nil | 指定后端对nginx的ssl私钥文件 |
grpc_ssl_password_file | file | nil | 指定后端对nginx的ssl密码文件 |
grpc_ssl_verify | on 或 off | off | 设置是否启用对grpc后端的ssl证书验证机制 |
grpc_ssl_name | name | proxy_pass指令指定的主机名 | 指定对后端ssl证书验证的主机名 |
grpc_ssl_crl | file | nil | 证书吊销列表文件 |
grpc_ssl_trusted_certificate | file | nil | 指定一个pem格式的ca证书文件 |
grpc_ssl_verify_depth | number | 1 | 设置证书链的验证深度 |
参考
- 王小东 - 《Nginx应用与运维实战》
- Nginx官方文档 - ngx_http_grpc_module