debian nginx upsync consul 实现动态负载

1. consul 安装

bash 复制代码
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

bash 复制代码
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端口(本人这里使用阿里云,只需要云后台配置即可,网友可以自已百度)

使用以下命令测试服务是否有返回

bash 复制代码
curl http://ip:8500/v1/catalog/nodes

正常情况下有如下退回

2. 编释及安装nginx

nginx-upsync 是一个开源的 Nginx 扩展模块,用于实现动态的负载均衡和自动发现后端服务器。该模块的源码和相关文件可以在以下 GitHub 地址找到:https://github.com/weibocom/nginx-upsync。

2.1 下载nginx-upsync

bash 复制代码
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源码

bash 复制代码
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.20.1.tar.gz

从nginx官网下载nginx源码并解压

2.3 安装编释所属的依赖

bash 复制代码
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
 

2.4 配置nginx编释环境并将upsync模块增加到配置中

bash 复制代码
# 配置编译选项,添加nginx-upsync-module
./configure --add-module=/path/to/nginx-upsync-module

2.5 编译并安装 Nginx

bash 复制代码
make
sudo make install

安装完成后,nginx默认安装位置是 /usr/local/nginx

3. 测试站点

3.1 配置2个测试站点

分别创建两个目录(/var/www/web1,/var/www/web2)并在目录里放入index.html文件

文件内容可以自已定义,只要能区分是那个站即可,以下是本人的文件内容

html 复制代码
<html>
<body>
hello word 111111
<body>
</html>

另一个文件内容是222222 请自行修改

3.2 修改nginx配置

bash 复制代码
#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数据

bash 复制代码
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

bash 复制代码
sudo /usr/local/nginx/sbin/nginx

3.4 测试效果

访问ip:8010站点可以看到

3.5 迁换站点:

bash 复制代码
#迁换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技术的应用,可能会出现丢失登陆状态等情况。

相关推荐
朱容君1 小时前
Linux系统编程多线程之读写锁讲解
linux·开发语言
大风吹PP凉1 小时前
38配置管理工具(如Ansible、Puppet、Chef)
linux·运维·服务器·ansible·puppet
康熙38bdc1 小时前
Linux 进程间通信——共享内存
linux·运维·服务器
jwybobo20071 小时前
redis7.x源码分析:(3) dict字典
linux·redis
scoone1 小时前
ssh登陆服务器后支持Tab键命令补全
linux·shell
微刻时光2 小时前
Docker部署Nginx
运维·nginx·docker·容器·经验
运维佬3 小时前
CentOS 9 配置网卡
linux·centos
轩轩曲觞阁3 小时前
Linux网络——网络初识
linux·网络
2401_840192273 小时前
python基础大杂烩
linux·开发语言·python
weixin_438197383 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes