Nginx配置文件自动更新
ETCD
安装
$ cat etcd_install.sh ETCD_VER=v3.4.16 # choose either URL GOOGLE_URL=https://storage.googleapis.com/etcd GITHUB_URL=https://github.com/etcd-io/etcd/releases/download DOWNLOAD_URL=${GOOGLE_URL} rm -f /data/etcd-${ETCD_VER}-linux-amd64.tar.gz rm -rf /data/etcd && mkdir -p /data/etcd/bin curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /data/etcd-${ETCD_VER}-linux-amd64.tar.gz tar xzvf /data/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /data/etcd/bin --strip-components=1 rm -f /data/etcd-${ETCD_VER}-linux-amd64.tar.gz /data/etcd/bin/etcd --version /data/etcd/bin/etcdctl version
配置为系统服务
cat >>/usr/lib/systemd/system/etcd.service <<EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/etcd-io/etcd [Service] Type=notify WorkingDirectory=/data/etcd/data ExecStart=/data/etcd/bin/etcd \ --data-dir=/data/etcd/data \ --wal-dir=/data/etcd/wal \ --name=etcd \ --listen-peer-urls=http://192.168.1.68:2380 \ --initial-advertise-peer-urls=http://192.168.1.68:2380 \ --listen-client-urls=http://192.168.1.68:2379 \ --advertise-client-urls=http://192.168.1.68:2379 \ --election-timeout=2000 \ --log-level info \ --logger zap \ --log-outputs stderr Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.targe EOF
Nginx
配置 repo 源
cat >>/etc/yum.repos.d/nginx.repo <<EOF [nginx] name=nginx repo baseurl=https://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 EOF
安装
yum -y install nginx
confd
安装
$ 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/bin/confd $ mkdir -p /etc/confd/{conf.d,templates} # conf.d 资源模板,下面文件必须以toml后缀 templates配置文件模板,下面文件必须以tmpl后缀
启动配置
$ cat /etc/confd/confd.toml backend = "etcdv3" # etcd 的 API 版本 confdir = "/etc/confd" # 配置文件存放位置 log-level = "debug" # 日志级别 interval = 5 # 轮询后端的时间间隔,默认 600 单位秒 nodes = [ "http://192.168.1.68:2379", # 后端地址 ] scheme = "http" watch = true # 类似监测功能
Nginx相关配置
mkdir -p /data/ngin/{logs,etc} mkdir -p /data/ngin/etc/{proxy_temp,client_body_temp,fastcgi_temp,uwsgi_temp,scgi_temp,conf.d}
confd 配置文件
$ cat /etc/confd/conf.d/nginx_base.toml [template] src = "nginx.conf.tmpl" # 读取的模板文件名阿城 dest = "/etc/nginx/nginx.conf" # 生成的配置文件位置 keys = [ "/nginx", # 读取后端的 key ] reload_cmd ="/usr/sbin/nginx -s reload" # 渲染模板后执行的命令
confd 模板文件
根据后端获取的 Key 进行模板的渲染
$ cat /etc/confd/templates/nginx.conf.tmpl user {{ getv "/nginx/run_user" "nginx" }}; worker_processes {{ getv "/nginx/processes" "auto" }}; error_log {{ getv "/nginx/logs_dir" }}/nginx_error.log error; pid {{ getv "/nginx/logs_dir" }}/nginx.pid; events { use epoll; worker_connections {{ getv "/nginx/connections" "10240" }}; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; tcp_nopush on; # add setup client_max_body_size 0; proxy_temp_path {{ getv "/nginx/tmp_dir" }}/proxy_temp; client_body_temp_path {{ getv "/nginx/tmp_dir" }}/client_body_temp; fastcgi_temp_path {{ getv "/nginx/tmp_dir" }}/fastcgi_temp; uwsgi_temp_path {{ getv "/nginx/tmp_dir" }}/uwsgi_temp; scgi_temp_path {{ getv "/nginx/tmp_dir" }}/scgi_temp; # proxy proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; log_format main '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"server_host":"$host",' '"url":"$uri",' '"url-info":"$request_uri",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; access_log {{ getv "/nginx/logs_dir" }}/access.log main; include {{ getv "/nginx/nginx_extension" }}/*.conf; }
ETCD 写入数据
etcdctl put --endpoints=192.168.1.68:2379 /nginx/run_user "nginx" etcdctl put --endpoints=192.168.1.68:2379 /nginx/processes "auto" etcdctl put --endpoints=192.168.1.68:2379 /nginx/connections 51200 etcdctl put --endpoints=192.168.1.68:2379 /nginx/tmp_dir "/data/nginx/etc" etcdctl put --endpoints=192.168.1.68:2379 /nginx/logs_dir "/data/nginx/logs" etcdctl put --endpoints=192.168.1.68:2379 /nginx/nginx_extension "/data/nginx/etc/conf.d"
Nginx 额外配置
confd配置文件
$ cat /etc/confd/conf.d/server_myapp1.toml [template] src = "myapp1.conf.tmpl" dest = "/data/nginx/etc/conf.d/myapp1.conf" keys = [ "/servers", ] reload_cmd ="/usr/sbin/nginx -s reload"
confd模板配置
$ cat /etc/confd/templates/myapp1.conf.tmpl upstream myapp { {{ range getvs "/servers/myapp1/upstream/*" }} server {{.}}; {{ end }} } server { listen {{ getv "/servers/myapp1/port" }}; server_name {{ getv "/servers/myapp1/name" }}; root {{ getv "/servers/myapp1/root" }}; index client.html; location / { try_files $uri $uri/ /client.html; } location /api/ { proxy_pass "http://myapp/"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_send_timeout 300s; proxy_read_timeout 300s; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
```ETCD写入数据
# 写入 ETC server 段 etcdctl put --endpoints=192.168.1.68:2379 /servers/myapp1/port "8081" etcdctl put --endpoints=192.168.1.68:2379 /servers/myapp1/root "/data/nginx/html" etcdctl put --endpoints=192.168.1.68:2379 /servers/myapp1/name "192.168.1.68" etcdctl put --endpoints=192.168.1.68:2379 /servers/myapp1/upstream/app1 "192.168.1.250:80"
启动 confd
# 前台启动,如果需要可以使用 supervisor 等进程管理工具进行管理 $ confd -config-file /etc/confd/confd.toml
配置文件更新完毕
查看生成的配置文件
版权声明:本文为u011607971原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。