etcd+confd+nginx实现服务自动注册与发现 nginx nosql


一、etcd

https://abc.htmltoo.com/thread-46141.htm


二、nginx的安装与启动

https://abc.htmltoo.com/thread-43508.htm


三、confd

https://github.com/kelseyhightower/confd/releases/


四、coredns+etcd搭建DNS服务器

https://abc.htmltoo.com/thread-46143.htm


---

cd /opt/app

wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64

mv confd-0.16.0-linux-amd64 /usr/local/bin/confd

chmod +x /usr/local/bin/confd

confd --help


---

mkdir -p /etc/confd/{conf.d,templates}

conf.d:confd的配置文件

templates:配置模板Template


---

Template Resources

模板源TOML格式的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d

chmod -R 777  /etc/confd/

mkdir  /opt/project/  && chmod -R 777  /opt/project/ 

vim /etc/confd/conf.d/app.toml

[template]
src = "nginx.tmpl"
dest = "/opt/project/app.conf"
keys = [
  "/app/web/nginx/upstream",
  "/app/web/nginx/subdomain"
]
check_cmd = "/usr/local/nginx/sbin/nginx -t -c {{.src}}"
reload_cmd = "/usr/local/nginx/sbin/nginx reload"

注意配置文件中的check_cmd 命令,该命令会进行配置文件检测,检测不通过时,配置文件不会修改,且不会执行后面的reload_cmd命令。这里想不报错也很简单,将配置文件中nginx的配置指向正确的位置,而且让nginx可以正常检测,且检测结果没有错误。再次执行命令,并修改配置文件,

---

Template

Template定义了单一应用配置的模板,默认存储在 /etc/confd/templates目录下。模板语法详见:https://github.com/kelseyhightower/confd/blob/master/docs/templates.md

vim  /etc/confd/templates/nginx.tmpl

upstream {{getv "/app/web/nginx/subdomain"}} {
least_conn;
{{range getvs "/app/web/nginx/upstream/*"}}
server {{.}} max_fails=10 fail_timeout=5s;
{{end}}
}
server {
server_name {{getv "/app/web/nginx/subdomain"}}.example.com;
location / {
proxy_pass http://{{getv "/app/web/nginx/subdomain"}};
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

least_conn; 最少链接

max_fails=2; 失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次

fail_timeout=30s;  30s进行2次尝试失败认为server不可达

weight=5; 权重5,  默认1, weight代表权重,数值越大分配的请求就越多.

max_conns=4;  限制连接数

backup; 指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机。


四、进行测试

---向etcd集群添加key和value

cd  /opt/app/etcd

export ETCDCTL_API=3

./etcdctl put /app/web/nginx/subdomain app

./etcdctl put /app/web/nginx/upstream/app1 "192.168.159.131:80"

./etcdctl put /app/web/nginx/upstream/app2 "192.168.159.132:80"

./etcdctl put /app/web/nginx/upstream/app3 "192.168.159.133:80"

./etcdctl put /app/web/nginx/upstream/app4 "192.168.159.134:80 weight=5"

./etcdctl put /app/web/nginx/upstream/app5 "192.168.159.135:80 backup"

---执行confd

confd -watch -backend etcdv3 -node  http://127.0.0.1:2379  &

-confd支持以daemon或者onetime两种模式运行

-onetime模式:只会生成一次配置,之后key无论变化不会再生成

confd -onetime -backend etcdv3 -node http://127.0.0.1:2379

-daemon模式:confd会监听后端存储的配置变化,根据配置模板动态生成目标配置文件。

confd -watch -backend etcdv3 -node  http://127.0.0.1:2379


./etcdctl del /app/web/nginx/upstream/app2


---查看结果

-查看生成的配置文件

cat  /opt/project/app.conf

upstream app {
server 192.168.159.132:80;
server 192.168.159.133:80;
}
server {
server_name app.example.com;
location / {
proxy_pass http://app;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

---整合nginx.conf

/opt/project/app.conf是生成的配置,

需要将其整合到nginx启动项的配置中/usr/local/nginx/conf/nginx.conf,

在http模块下使用include命令即可

http {
    include       mime.types;
    include       /opt/project/app.conf   #进行整合
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
...
}


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回