Nginx代理gRPC反向代理和负载均衡配置

1. 前言

根据nginx官网信息,nginx从1.13.10开始原生支持gRPC,所以必须使用1.13.10以上的版本进行NGINX+gRPC框架的部署。

nginx作为老牌负载均衡软件对gRPC进行了支持,之前已经可以代理gRPC的TCP连接,新版本之后,还可以终止、检查和跟踪 gRPC 的方法调用:

  1. 发布 gRPC 服务,然后使用 nginx应用 HTTP/2 TLS 加密、速率限制、基于 IP 的访问控制列表和日志记录;
  2. 通过单个端点发布多个 gRPC 服务,使用 nginx检查并跟踪每个内部服务的调用;
  3. 使用 Round Robin, Least Connections 或其他方法在集群分配调用,对 gRPC 服务集群进行负载均衡;

2. 编译安装nginx

安装环境: centos 7.3

2.1 安装步骤

注意:
如果不指定nginx安装路径--prefix=/opt/nginx,则默认安装路径为:/usr/local/nginx

nginx源码编译及安装步骤如下:

  1. 从nginx官网上获取版本号不低于1.13.10的源码包(nginx-1.17.9.tar.gz),本文以1.17.9为例。
  2. 解压nginx源码包nginx-1.17.9.tar.gz,得到nginx的源码;
  3. 进入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服务,以下模块是必须安装的:
    1. http_ssl
    2. 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示例:

  1. 进入到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
    
  2. 如果配置文件检查正常,运行nginx程序:

    [root@ljj]# ./sbin/nginx
    
  3. 检查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(默认配置)。

  4. 在远端机器上打开一个web网页,输入nginx服务的IP和端口号,测试nginx是否能够正常提供web服务。正常情况下,远端机器会显示如下的web页面:
    Nginx代理gRPC反向代理和负载均衡配置_第1张图片
    如果出现上图,说明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内置负载均衡策略

  1. 热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

    upstream mysvr { 
    	server 127.0.0.1:7878; 
    	server 192.168.10.121:3333 backup;  #热备     
    }
    
  2. 轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....

    upstream mysvr { 
    	server 127.0.0.1:7878;
    	server 192.168.10.121:3333;       
    }
    
  3. 加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....

    upstream mysvr { 
    	server 127.0.0.1:7878 weight=1;
    	server 192.168.10.121:3333 weight=2;
    }
    
  4. ip_hash:nginx会让相同的客户端ip请求相同的服务器。

    upstream mysvr { 
    	server 127.0.0.1:7878; 
    	server 192.168.10.121:3333;
    	ip_hash;
    }
    
  5. 关于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 流量并将请求转发到端口1508015081上的服务器,默认采用轮询的负载均衡策略,所有8089端口上的请求会以轮询的方式分别发送给1508015081上的服务。

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. 参考:

  1. https://juejin.im/post/5e196d3be51d451cad410f6e
  2. https://www.cnblogs.com/huangweimin/articles/8512253.html
  3. https://blog.csdn.net/liitdar/article/details/79803128
  4. https://www.runoob.com/w3cnote/nginx-proxy-balancing.html

你可能感兴趣的:(Linux,nginx)