QUIC实战(二) AWS 搭建nginx(http3.0) + upsync + consul(server-client模式) 集群

4 篇文章 0 订阅

前面的博客介绍了怎么编译支持http3的nginx,并添加了upsync模块。为了在生产环境验证QUIC,我在aws搭建了一个Nginx + upsync + consul的集群 ,支持动态负载均衡。

consul介绍

consul是HashiCorp公司(曾经开发过vgrant) 推出的一款开源工具, 基于go语言开发, 轻量级, 用于实现分布式系统的服务发现与配置。
consul内置有KV存储, 服务注册/发现, 健康检查, HTTP+DNS API, Web UI等多种功能。
官网: https://www.consul.io/
在这里插入图片描述
架构说明:

  1. Consul 集群由Consul Agent的节点组成, 在集群中有两种角色: Server和 Client 。
  2. Server和Client只是Consul的两种角色,二者之间并没有什么区别,只是人为的角色划分。
  3. Consul Server : 用于维护Consul 集群的状态信息, 实现数据一致性。 多个server之中会基于Raft协议选举出一个leader。 多个Server节点上的Consul数据信息保持强一致性。 在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯。
    Consul Client: 只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。
  4. Consul 支持多数据中心, 多个数据中心要求每个数据中心都要安装一组Consul集群,多个数据中心间基于gossip protocol协议来通讯

搭建方案 :

consul server 存储tomcat服务器的信息
consul client 端负责对服务器进行健康检查并同步到server
nginx间隔时间动态获取最新的consul server配置信息, 这样nginx 就可以实现动态负载均衡了。

AWS部署流程

我是使用的AWS来部署的实例,这里也简单记录下vpc和实例的构建过程

一.VPC,子网,网关,路由表创建
  1. 创建VPC ,选择IPv4 CIDR
  2. 创建四个子网 两个公有子网和两个私有子网(分别处于不同的可用区域–为了DR): quic-subnet1,quic-subnet2,quic-internal1,quic-internal2
  3. 创建互联网网关并关联到对应的VPC; 在主路由表里添加互联网网关的路由,然后关联主路由表到对应的公有子网
  4. 创建弹性ip后并创建对应的NAT网关(在quic-subnet1上),创建路由表(路由target为nat)并关联到私有子网
二.创建实例
  1. 创建安全组
    1) 堡垒机 开放22端口的SSH访问
    2) nginx-quic的安全组
    3) tomcat集群的安全组
    4) consul-server的安全组 在这里插入图片描述

  2. 创建堡垒机实例,并分配弹性IP (quic-subnet1上)

  3. 分别创建quic-nginx-upsync-1,quic-nginx-upsync-2,quic-tomcat-1,consul-server1,consul-server2的实例

  4. 创建网络负载均衡器和目标群组(因为使用的quic,所以负载均衡器协议是TCP_UDP)

注意:由于AWS申请了5个弹性IP之后,再申请分配就会提示到达上限,需要将之前的弹性IP先取消关联,分配给新的实例

consul 集群部署

consul server : 172.33.36.48, 172.33.63.50 (这里我只部署了两台,实际是3server + 4 client)
consul client (和tomcat在一台机子上) : 172.33.35.141

wget https://releases.hashicorp.com/consul/1.7.5/consul_1.7.5_linux_amd64.zip
## sudo -i 切换到root用户下
unzip consul_0.7.5_linux_amd64.zip

分别在consul server 172.33.36.48, 172.33.63.50 上编写配置文件

{
    "server": true,
    "ui": true,
    "data_dir": "/opt/consul_dir/data",
    "datacenter": "dc1",
    "node_name": "server1",
    "log_level": "info",
    "bind_addr": "172.33.36.48",
    "client_addr": "172.33.36.48",
    "retry_join": ["172.33.36.48","172.33.63.50"]
}
{
    "server": true,
    "ui": true,
    "data_dir": "/opt/consul_dir/data",
    "datacenter": "dc1",
    "node_name": "server2",
    "log_level": "info",
    "bind_addr": "172.33.63.50",
    "client_addr": "172.33.63.50",
    "retry_join": ["172.33.36.48","172.33.63.50"]
}

在consul client 172.33.35.141上编写配置文件 , 搭建其他client的时候只要把配置文件上的bind_addr, client_addr 修改为对应IP即可

{
    "server": false,
    "ui": true,
    "data_dir": "/opt/consul_dir/data",
    "datacenter": "dc1",
    "node_name": "client1",
    "log_level": "info",
    "bind_addr": "172.33.35.141",
    "client_addr": "172.33.35.141",
    "retry_join": ["172.33.36.48","172.33.63.50"],
    "service": {
	"id": "1",
	"name": "quic",
	"address": "172.33.35.141",
	"port": 8080,
        "check": {
          "id": "quic",
          "name": "HTTPAPI on port 8080",
          "http": "http://172.33.35.141:8080/quic/api/checkHealth",
          "interval": "10s",
          "timeout": "1s"
        }
    }
}

为了方便启动,编写了两个shell脚本

## consul server的启动脚本
#!/bin/sh
cd /opt
nohup ./consul agent -bootstrap-expect=1 -config-dir=/opt/consul_dir/server.json                        >> /opt/logs/consul.log 2>&1 &

## consul client的启动脚本

#!/bin/sh
cd /opt
nohup ./consul agent -config-dir=/opt/consul_dir/client.json  >> /opt/logs/consul.log 2>&1 &

通过端口映射,可以看到consul的三个节点都正常启动了,也选举出了leader
在这里插入图片描述
在这里插入图片描述
添加nginx upstream服务信息到consul

我们可以使用linux命令方式发送put请求:
curl -X PUT http://172.33.36.48:8500/v1/kv/upstreams/quic/172.33.35.141:8080

请求发送成功后就可以在consul web 界面看到对应的服务器信息了
在这里插入图片描述

部署Nginx

前面一篇博客已经在自己的服务器上成功安装了nginx(添加了quiche和upsync模块)。只要把安装目录/opt/server下的nginx打包部署到aws实例的相应目录下就可以了

最后只需要修改下nginx的配置文件就可以了
在nginx.conf里通过include引入如下配置文件,这样我们只需要修改conf.d里的配置文件就可以了,这样就可以避免修改原来的配置文件

 server {
     listen       80;
     # nginx服务器的ip地址
     server_name  172.33.17.51;
     location / {
         root   html;
         index  index.html index.htm;
     }
 }
 include /opt/server/nginx/conf/conf.d/*.conf; 
 # another virtual host using mix of IP-, name-, and port-based configuration

quic.conf

upstream myserver {
     server 127.0.0.1:11111;
     #超时是6m 间隔是500m
     upsync 172.33.36.48:8500/v1/kv/upstreams/quic upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
     upsync 172.33.63.50:8500/v1/kv/upstreams/quic upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
	 #从consul拉取的上游服务器后持久化的位置
     upsync_dump_path /opt/data/consul/server.conf;
}

server {
    # Enable QUIC and HTTP/3.
    listen 443 quic reuseport;
    # Enable HTTP/2 (optional).
    listen 443 ssl http2;
    ssl_certificate /opt/ssl/fullchain.pem;
    ssl_certificate_key /opt/ssl/privkey.pem;
    # Enable all TLS versions (TLSv1.3 is required for QUIC).
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    # Add Alt-Svc header to negotiate HTTP/3.
    add_header alt-svc 'h3-29=":443"; ma=86400';
    
    location /quic {
		proxy_pass http://myserver;
    }
}

然后通过sbin/nginx -c conf/nginx.conf 命令启动nginx就可以了

绑定域名到对应的负载均衡器

最后只要将域名绑定到对应的负载均衡器上,我们就可以通过域名访问到对应的api了
在这里插入图片描述
在这里插入图片描述

请求url成功
在这里插入图片描述
quic协议的验证在上一篇博客里已经写过了,需要的可以参照该博客
QUIC实战(一) 通过Quiche部署支持HTTP3 的NGINX

部署过程遇到的问题 :

一开始我的bind_addr和client_addr都写的127.0.0.1,结果出现了如下报错信息。需要将bind_addr的ip改成consul server与其他节点交互的内网ip
在这里插入图片描述

参考资料:

consul配置参数大全、详解、总结

Consul集群搭建 2Server+ 3Client

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
nginx-quicnginx的一个版本,它支持QUIC协议。QUIC是一种基于UDP的传输协议,旨在提供更快的连接建立和数据传输速度。要获取nginx-quic版本的nginx可执行文件,需要进行一系列的安装和编译步骤。 首先,你可以使用已经编译好的版本nginx-quic.linux-x86_64.zip,下载链接在\[5\]中提供。如果你想自己编译,可以按照以下步骤进行准备工作: 1. 下载nginx源码包:使用curl命令下载nginx源码包,例如: ``` curl -O https://nginx.org/download/nginx-1.16.1.tar.gz ``` 2. 解压源码包:使用tar命令解压下载的源码包,例如: ``` tar xvzf nginx-1.16.1.tar.gz ``` 3. 克隆quiche库:使用git命令克隆quiche库,例如: ``` git clone --recursive https://github.com/cloudflare/quiche ``` 4. 进入nginx源码目录:使用cd命令进入nginx源码目录,例如: ``` cd nginx-1.16.1 ``` 5. 应用补丁:使用patch命令应用quiche提供的补丁,例如: ``` patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch ``` 6. 配置编译选项:使用./configure命令配置编译选项,例如: ``` ./configure \ --prefix=$PWD \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_v3_module \ --with-openssl=../quiche/deps/boringssl \ --with-quiche=../quiche ``` 7. 编译和安装:使用make命令编译并安装nginx,例如: ``` make && make install ``` 完成以上步骤后,你就可以得到nginx-quic版本的nginx可执行文件。请注意,这些步骤可能会遇到一些问题,你可以参考\[2\]和\[3\]提供的链接获取更详细的信息和指导。 #### 引用[.reference_title] - *1* [如何在 Nginx 中启用 HTTP 3.0/QUIC 支持](https://blog.csdn.net/easylife206/article/details/112975714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Nginx支持quic协议](https://blog.csdn.net/liucy007/article/details/129383417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Nginx官方nginx-quic搭建](https://blog.csdn.net/qq_37177958/article/details/120444034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值