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

深碍√TFBOYSˉ_ 2023-07-17 05:55 102阅读 0赞

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源码目录中,执行如下命令:

    1. # 首先需要先安装nginx 编译所需的基本依赖:
    2. yum -y install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
    3. # 编译和安装nginx
    4. ./configure --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_v2_module
    5. make
    6. make install

    使用nginx反向代理和负载均衡grpc服务,以下模块是必须安装的:

    1. http_ssl
    2. http_v2

2.2 检验是否安装成功

执行以下命令,验证nginx是否安装成功。如下所示:显示nginx安装成功,安装的nginx版本号为1.17.9。

  1. [root@ljj]# /usr/local/nginx/sbin/nginx -v
  2. nginx version: nginx/1.17.9

2.3 启动nginx

在nginx安装正常的情况下,执行以下操作构建nginx示例:

  1. 进入到nginx的安装目录下,检查nginx配置文件是否正确:

    1. [root@ljj]# ./sbin/nginx -t
    2. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    3. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  2. 如果配置文件检查正常,运行nginx程序:

    1. [root@ljj]# ./sbin/nginx
  3. 检查nginx运行状态及端口占用情况:

    1. [root@ljj]# ps -ef|grep nginx
    2. root 27242 1 0 16:33 ? 00:00:00 nginx: master process ./sbin/nginx
    3. nobody 27243 27242 0 16:33 ? 00:00:00 nginx: worker process
    4. root 27251 20758 0 16:34 pts/6 00:00:00 grep --color=auto nginx
    5. [root@ljj]#
    6. [root@ljj]# netstat -anpo|grep 80
    7. 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的示例构建成功。

3. 配置反向代理和负载均衡

3.1 Nginx 负载均衡详解

首先给大家说下upstream这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。

  1. upstream mysvr {
  2. server 192.168.10.121:3333;
  3. server 192.168.10.122:3333;
  4. }
  5. server {
  6. ....
  7. location ~*^.+$ {
  8. proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
  9. }
  10. }

3.2 Nginx内置负载均衡策略

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

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

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

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

    1. upstream mysvr {
    2. server 127.0.0.1:7878;
    3. server 192.168.10.121:3333;
    4. ip_hash;
    5. }
  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一起使用。

    1. upstream mysvr {
    2. server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    3. server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
    4. }

3.2 grpc反向代理和负载均衡配置实例

Nginx 使用 HTTP 服务器监听 gRPC 流量,并使用 grpc_pass 指令代理流量。 为 Nginx 创建以下代理配置,在端口 8089 上侦听未加密的 gRPC 流量并将请求转发到端口1508015081上的服务器,默认采用轮询的负载均衡策略,所有8089端口上的请求会以轮询的方式分别发送给1508015081上的服务。

nginx.conf配置文件修改如下:

  1. upstream grpcservers {
  2. server 10.12.12.13:15080; # 后端 11800 地址
  3. server 10.12.12.14:15081; # 后端 11801 地址
  4. }
  5. server {
  6. listen 8089 http2;
  7. location / {
  8. grpc_pass grpc://grpcservers;
  9. error_page 502 = /error502grpc;
  10. }
  11. location = /error502grpc {
  12. internal;
  13. default_type application/grpc;
  14. add_header grpc-status 14;
  15. add_header grpc-message "unavailable";
  16. return 204;
  17. }
  18. }

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

发表评论

表情:
评论列表 (有 0 条评论,102人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nginx 反向代理负载均衡

    ❤之前粗略的学习了一下nginx,也能够简单的进行使用,但时间长了难免就会出现遗忘,遇到命令啥的有时候还得去网上搜,索性就自己整理了一份,以后看起来也比较方便。有什么不对的地方

    相关 nginx负载均衡反向代理

    负载均衡 负载均衡是有多台服务器以对称的方式组成一个服务器集合,每台服务器都能具有等价的地位,都可以单独对外提供服务而无需其他服务器辅助。通过某种负载分担技术,将外部发送来

    相关 nginx反向代理负载均衡

    1、正向代理 正向代理就是我们平时说的代理上网,局域网中的用户通过网关做代理访问外部的网络。 ![70][] 2、反向代理 在计算机网络中,反向代理是一种代理服

    相关 Nginx配置反向代理负载均衡

    今天给大家介绍一下如何利用Nginx进行反向代理,之所以介绍这个的原因是,因为开发的时候遇到一个很尴尬的场景。因为是springboot项目,所以每一个控制类的端口都不一样,但