QUIC实战(二) AWS 搭建nginx(http3.0) + upsync + consul(server-client模式) 集群
前面的博客介紹了怎么編譯支持http3的nginx,并添加了upsync模塊。為了在生產環境驗證QUIC,我在aws搭建了一個Nginx + upsync + consul的集群 ,支持動態負載均衡。
consul介紹
consul是HashiCorp公司(曾經開發過vgrant) 推出的一款開源工具, 基于go語言開發, 輕量級, 用于實現分布式系統的服務發現與配置。
consul內置有KV存儲, 服務注冊/發現, 健康檢查, HTTP+DNS API, Web UI等多種功能。
官網: https://www.consul.io/
架構說明:
Consul Client: 只維護自身的狀態, 并將HTTP和DNS接口請求轉發給服務端。
搭建方案 :
consul server 存儲tomcat服務器的信息
consul client 端負責對服務器進行健康檢查并同步到server
nginx間隔時間動態獲取最新的consul server配置信息, 這樣nginx 就可以實現動態負載均衡了。
AWS部署流程
我是使用的AWS來部署的實例,這里也簡單記錄下vpc和實例的構建過程
一.VPC,子網,網關,路由表創建
二.創建實例
創建安全組
1) 堡壘機 開放22端口的SSH訪問
2) nginx-quic的安全組
3) tomcat集群的安全組
4) consul-server的安全組
創建堡壘機實例,并分配彈性IP (quic-subnet1上)
分別創建quic-nginx-upsync-1,quic-nginx-upsync-2,quic-tomcat-1,consul-server1,consul-server2的實例
創建網絡負載均衡器和目標群組(因為使用的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
分別在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里的配置文件就可以了,這樣就可以避免修改原來的配置文件
quic.conf
upstream myserver {server 127.0.0.1:11111;#超時是6m 間隔是500mupsync 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
總結
以上是生活随笔為你收集整理的QUIC实战(二) AWS 搭建nginx(http3.0) + upsync + consul(server-client模式) 集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QUIC实战(一) 通过Quiche部署
- 下一篇: linux常见问题及其解决方案集锦