1. consul 安装
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install consul
使用以上命令可直接安装consul。
网上找好了好多方法都安装不了,该方法在consul官网上找到
1.1. 测试consul
nohup consul agent -server -bootstrap-expect 1 -data-dir /data/consul -node=ali_1 -ui -client=0.0.0.0 -bind=0.0.0.0 &
执行代码运行consul,参数说明如下,
nohup consul agent -dev -ui -node=consul-dev -client=xxx.xxx.xxx.xx &用来启动Consul代理,命令各部分的含义如下:
nohup: 当用户退出终端时,使用nohup启动的程序仍会继续在后台运行。
consul agent: 启动Consul的代理进程,它是Consul服务的核心组件,负责服务发现、健康检查以及集群内部的通信和管理。
-dev: 标志表明 Consul 代理将以开发者模式启动。在该模式下,Consul将会在单节点内创建一个完整的Consul集群,数据存储在内存中,重启后数据将丢失,适用于快速测试和开发环境。
-ui: 开启内置的Web用户界面,这样可以通过浏览器访问Consul提供的管理界面,默认监听在本地8500端口的 /ui 路径下。
-node=consul-dev: 设置当前Consul代理节点的名称为consul-dev,用于标识集群中的唯一节点。
-client=xxx.xxx.xxx.xxx: 指定Consul代理监听客户端请求的IP地址为xxx.xxx.xxx.xxx,这意味着其他服务或者工具需要通过这个IP地址与Consul代理进行交互,比如注册服务、查询服务等。
&: 在命令末尾加上&符号表示让命令在后台运行,即以守护进程的方式启动Consul代理,不会阻塞
注意,需要重新开个终端验证
检测防火墙开放8500端口(本人这里使用阿里云,只需要云后台配置即可,网友可以自已百度)
使用以下命令测试服务是否有返回
curl http://ip:8500/v1/catalog/nodes
正常情况下有如下退回
2. 编释及安装nginx
nginx-upsync 是一个开源的 Nginx 扩展模块,用于实现动态的负载均衡和自动发现后端服务器。该模块的源码和相关文件可以在以下 GitHub 地址找到:https://github.com/weibocom/nginx-upsync。
2.1 下载nginx-upsync
wget https://github.com/weibocom/nginx-upsync-module/archive/v2.1.0.tar.gz
tar -zxvf v2.1.0.tar.gz
下载upsync并解压到当前目录
2.2 下载nginx源码
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.20.1.tar.gz
从nginx官网下载nginx源码并解压
2.3 安装编释所属的依赖
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
2.4 配置nginx编释环境并将upsync模块增加到配置中
# 配置编译选项,添加nginx-upsync-module
./configure --add-module=/path/to/nginx-upsync-module
2.5 编译并安装 Nginx
make
sudo make install
安装完成后,nginx默认安装位置是 /usr/local/nginx
3. 测试站点
3.1 配置2个测试站点
分别创建两个目录(/var/www/web1,/var/www/web2)并在目录里放入index.html文件
文件内容可以自已定义,只要能区分是那个站即可,以下是本人的文件内容
<html>
<body>
hello word 111111
<body>
</html>
另一个文件内容是222222 请自行修改
3.2 修改nginx配置
#user nobody;
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream demo {ip_hash;server 192.168.100.3:80; #upsync 需要获取的consul地址upsync 127.0.0.1:8500/v1/kv/upstreams/skuprice upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;#获取后生成的文件名upsync_dump_path /var/www/server/servers_skuprice.conf;#引用生成的配置文件include /var/www/server/servers_skuprice.conf;}server {listen 8081;location / {proxy_pass http://demo ; }}server {listen 8000;root /var/www/web1;index index.php;location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {include fastcgi.conf;fastcgi_pass unix:/run/php/php8.2-fpm.sock;fastcgi_buffers 16 16k;fastcgi_buffer_size 32k;}}server {listen 8001;root /var/www/web2;index index.php;location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {include fastcgi.conf;fastcgi_pass unix:/run/php/php8.2-fpm.sock;fastcgi_buffers 16 16k;fastcgi_buffer_size 32k;}}}
配置文件中增加了2个测试站点,和一个代理站点,其中测试站点端口为:8000,8001。代理站点端口:8010。
nginx启动里会提示找不到文件 /var/www/server/servers_skuprice.conf
所以需要事先创建一个空的文件到指定的目录下
3.3 配置consul数据
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/skuprice/127.0.0.1:8000
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/skuprice/127.0.0.1:8001
使用 curl命令,初始化两个KV信息。将设置服务器权重为1
3.3 启动nginx
sudo /usr/local/nginx/sbin/nginx
3.4 测试效果
访问ip:8010站点可以看到
3.5 迁换站点:
#迁换8001
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/skuprice/127.0.0.1:8000
curl -X PUT -d '{"weight":100, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/skuprice/127.0.0.1:8001
通过更新站点的重权调整访问站点。
4. 总结:
将方案适合对有稳定要求,不方便断线更新站点非常合适,配合DevOps工具,可以做到无感更新,最对于比较旧的应用,像使用session技术的应用,可能会出现丢失登陆状态等情况。