[nginx]反向代理grpc
前言
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
[nginx]反向代理grpc的更多相关文章
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
- Nginx反向代理部署指南
一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理和负载均衡
一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...
- nginx 反向代理
nginx 反向代理 vim nginx.conf http { ..... upstream "tomcatweb" { server 172.30.13.199:8080; s ...
- 关于nginx反向代理后获取不到客户端的真实ip地址问题
前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...
- Nginx反向代理配置可跨域
由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...
- Nginx反向代理搭建配置
1.反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个 ...
- nginx反向代理docker registry报”blob upload unknown"解决办法
问题症状:keepalived+nginx反向代理后端docker registry群集时,使用docker客户机向registry push镜像时出现 "blob upload unkno ...
随机推荐
- 2023-2-22 增加产值冲减和EPC模块
应集团要求,现在已在综合信息管理系统中已增加以下信息,请大家注意,并及时转告业务人员: 1.[施工合同登记]模块增加必填字段"EPC建安费(万元)""EPC暂列费(万元) ...
- C# 实现窗体启动时隐藏
在某些时候需要实现一个界面的后台程序,程序自动运行,但起初不显示窗体,在满足触发条件时显示,此时需要在运行程序时先自动隐藏窗体. 修改窗体对应的Program.cs: using System; us ...
- 在chatGPT的帮助下成功从Rancher中删除无效的集群
只要你坚持,不放弃,问题总有解决的一天! 与chatgpt进行了几次沟通,成功解决历史遗留问题,成功从rancher中删除了无效的集群 chatGPT回答1 如果您在 Rancher UI 中无法删除 ...
- 2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost
2021-09-04:加油站.在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升.你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost ...
- 《Generative Adversarial Nets》论文精读
论文精读<Generative Adversarial Nets> 导言:生成模型是目前爆火的一个研究方向,据Microsoft对于ChatGPT-4的研究称"ChatGPT-4 ...
- 曲线艺术编程 coding curves 第二章 三角函数曲线(TRIG CURVES)
第二章 三角函数曲线(TRIG CURVES) 原作:Keith Peters 原文:https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中 ...
- 为什么说 Go 语言字符串是不可变的?
原文链接: 为什么说 Go 语言字符串是不可变的? 最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于 ...
- 2023-06-05:Redis官方为什么不提供 Windows版本?
2023-06-05:Redis官方为什么不提供 Windows版本? 答案2023-06-05: Redis官方没有提供Windows版本有几个原因. 1.Redis的开发团队规模较小,由三四名核心 ...
- 【python基础】循环语句-break关键字
1.break关键字 break关键字,其作用是在循环中的代码块遇到此关键字,立刻跳出整个循环,执行循环外的下一条语句. 其在while和for循环中的作用示意图如下: 1.1break在while循 ...
- 洛谷 P8026 [ONTAK2015] Bajtocja
简要题意 有 \(d\) 张初始为空的无向图,每张中都有 \(n\) 个点,标号从 \(1\) 到 \(n\),\(m\) 次操作,每次往一张图加一条边,并询问有多少有序数对 \((a, b)\) 使 ...