Nginx配置文件自动更新

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版权协议,转载请附上原文出处链接和本声明。