一、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;
...
}