Nginx代理gRPC反向代理和负载均衡配置
1. 前言
根据nginx官网信息,nginx从1.13.10
开始原生支持gRPC,所以必须使用1.13.10
以上的版本进行NGINX+gRPC
框架的部署。
nginx作为老牌负载均衡软件对gRPC进行了支持,之前已经可以代理gRPC的TCP连接,新版本之后,还可以终止、检查和跟踪 gRPC 的方法调用:
- 发布 gRPC 服务,然后使用 nginx应用
HTTP/2 TLS
加密、速率限制、基于 IP 的访问控制列表和日志记录; - 通过单个端点发布多个 gRPC 服务,使用 nginx检查并跟踪每个内部服务的调用;
- 使用
Round Robin
,Least Connections
或其他方法在集群分配调用,对 gRPC 服务集群进行负载均衡;
2. 编译安装nginx
安装环境:
centos 7.3
2.1 安装步骤
注意:
如果不指定nginx安装路径--prefix=/opt/nginx
,则默认安装路径为:/usr/local/nginx
nginx源码编译及安装步骤如下:
- 从nginx官网上获取版本号不低于
1.13.10
的源码包(nginx-1.17.9.tar.gz
),本文以1.17.9
为例。 - 解压nginx源码包
nginx-1.17.9.tar.gz
,得到nginx的源码; 进入nginx源码目录中,执行如下命令:
# 首先需要先安装nginx 编译所需的基本依赖:
yum -y install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
# 编译和安装nginx
./configure --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_v2_module
make
make install
使用nginx反向代理和负载均衡grpc服务,以下模块是必须安装的:
http_ssl
http_v2
2.2 检验是否安装成功
执行以下命令,验证nginx是否安装成功。如下所示:显示nginx安装成功,安装的nginx版本号为1.17.9。
[root@ljj]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.17.9
2.3 启动nginx
在nginx安装正常的情况下,执行以下操作构建nginx示例:
进入到nginx的安装目录下,检查nginx配置文件是否正确:
[root@ljj]# ./sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
如果配置文件检查正常,运行nginx程序:
[root@ljj]# ./sbin/nginx
检查nginx运行状态及端口占用情况:
[root@ljj]# ps -ef|grep nginx
root 27242 1 0 16:33 ? 00:00:00 nginx: master process ./sbin/nginx
nobody 27243 27242 0 16:33 ? 00:00:00 nginx: worker process
root 27251 20758 0 16:34 pts/6 00:00:00 grep --color=auto nginx
[root@ljj]#
[root@ljj]# netstat -anpo|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27242/nginx: master off (0.00/0/0)
从上述结果能够看出,nginx运行状态正常,并且其监听的端口号为80(默认配置)。
- 在远端机器上打开一个web网页,输入nginx服务的
IP和端口号
,测试nginx是否能够正常提供web服务。正常情况下,远端机器会显示如下的web页面:
如果出现上图,说明NGINX的示例构建成功。
3. 配置反向代理和负载均衡
3.1 Nginx 负载均衡详解
首先给大家说下upstream
这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。
upstream mysvr {
server 192.168.10.121:3333;
server 192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
3.2 Nginx内置负载均衡策略
热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:
AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
轮询:nginx默认就是轮询其权重都默认为
1
,服务器处理请求的顺序:ABABABABAB....
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为
1
。下面服务器的请求顺序为:ABBABBABBABBABB....
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
关于nginx负载均衡配置的几个状态参数讲解。
1-down
:表示当前的server暂时不参与负载均衡。
2-backup
:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
3-max_fails
:允许请求失败的次数,默认为1
。当超过最大次数时,返回proxy_next_upstream
模块定义的错误。
4-fail_timeout
:在经历了max_fails
次失败后,暂停服务的时间。max_fails
可以和fail_timeout
一起使用。upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
3.2 grpc反向代理和负载均衡配置实例
Nginx 使用 HTTP 服务器监听 gRPC 流量,并使用 grpc_pass
指令代理流量。 为 Nginx 创建以下代理配置,在端口 8089
上侦听未加密的 gRPC 流量并将请求转发到端口15080
和15081
上的服务器,默认采用轮询
的负载均衡策略,所有8089
端口上的请求会以轮询的方式分别发送给15080
和15081
上的服务。
nginx.conf
配置文件修改如下:
upstream grpcservers {
server 10.12.12.13:15080; # 后端 11800 地址
server 10.12.12.14:15081; # 后端 11801 地址
}
server {
listen 8089 http2;
location / {
grpc_pass grpc://grpcservers;
error_page 502 = /error502grpc;
}
location = /error502grpc {
internal;
default_type application/grpc;
add_header grpc-status 14;
add_header grpc-message "unavailable";
return 204;
}
}
4. 参考:
- https://juejin.im/post/5e196d3be51d451cad410f6e
- https://www.cnblogs.com/huangweimin/articles/8512253.html
- https://blog.csdn.net/liitdar/article/details/79803128
- https://www.runoob.com/w3cnote/nginx-proxy-balancing.html
还没有评论,来说两句吧...