概要

如果你的业务中希望通过WebUI或API的方式,来动态修改服务的配置文件,那么你可以使用confd来实现。其后端支持的数据类型有:

  • etcd
  • consul
  • vault
  • environment variables
  • redis
  • zookeeper
  • dynamodb
  • stackengine
  • rancher

这样我们就可以将配置存储在分布式的Key/Value中,修改配置不在需要SSH到远端。这里我们所采用的是consul 作为后端存储,因为有配套的UI所以对于实践来说比较方便。

Consul

docker run -d \
-p 8500:8500 \
--name consul-master \
consul agent -node=master -datacenter=betterde -bind=0.0.0.0 \
-ui -client=0.0.0.0 -server -bootstrap-expect=1

运行成功后可以访问http://localhost:8500,验证服务是否正常运行。

curl -X PUT -d 'api.betterde.om' http://localhost:8500/v1/kv/nginx/api/domain

效果图

confd

前往下载

创建配置文件目录

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

创建资源模板

touch /etc/confd/conf.d/nginx.toml
[template]
src = "nginx.conf.tmpl"
dest = "/tmp/nginx.conf"
keys = [
    "/nginx/api/domain",
]

check_cmd = "/usr/local/opt/nginx/bin/nginx -t -c {{.src}}"
reload_cmd = "/usr/local/opt/nginx/bin/nginx -s reload"
  • src:服务配置的模板文件
  • dest:confd生成的配置文件目录
  • keys:自定义的键
  • check_cmd:配置检查的命令,需要服务支持(可选项)
  • reload_cmd:重载配置的命令,需要服务支持(可选项)

创建配置模板

touch /etc/confd/templates/nginx.conf.tmpl
user zuber-imac staff;
worker_processes auto;

events {
    worker_connections  1024;
}

http {
    default_type  application/octet-stream;

    sendfile on;
    keepalive_timeout  65;
    client_max_body_size 128M;

    gzip  on;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    ssi on;

    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

    server {
        listen 80;
        server_name  {{getv "/nginx/api/domain"}};
        root /var/www/html;
        location / {
            index index.html;
        }
    }
}

运行 confd

./confd -watch -backend consul -node localhost:8500

此时去修改 /nginx/api/domain 的值,将会自动重新生成nginx配置文件到 /tmp/nginx.conf,并更新nginx的配置。

I hope this is helpful, Happy hacking…