nginx+confd+etcd的配置自动管理

来源:互联网 发布:js调用api截屏 qt mac 编辑:程序博客网 时间:2024/06/16 00:18

一、配置文件

1、etcd配置数据:

[plain] view plain copy
  1. /apps/svr/etcd/bin/etcdctl set /service_sgin/upstream/service1/server1 192.168.1.1   
  2. /apps/svr/etcd/bin/etcdctl set /service_sgin/subdomain/service1  "www.service1.com"  

2、confd安装:

在github上下载:https://github.com/kelseyhightower/confd/releases 

在/etc/confd/下创建confd配置文件mkdir -p /etc/confd/{conf.d,templates},具体配置如下:

[python] view plain copy
  1. [root@centos7-cloud ~]# cat /etc/confd/conf.d/nginx.conf.toml   
  2. [template]  
  3. prefix = "/service_sgin/"   #此配置对应etcd的默认目录  
  4. src = "nginx.conf.tmpl"    #对应templates下的模板文件  
  5. dest = '/apps/conf/nginx/nginx.conf'   #对应nginx的配置文件  
  6. keys = [  
  7.   "/upstream",   #监控的键值目录  
  8.   "/subdomain",  #监控的键值目录  
  9. ]  
  10. #check_cmd = "/apps/svr/nginx/sbin/nginx -t -c {{.src}}"   #检测到变化后的测试  
  11. #reload_cmd = "/apps/svr/nginx/sbin/nginx -s reload"       #配置文件没问题后的reload  

[python] view plain copy
  1. [root@centos7-cloud ~]  
  2. [root@centos7-cloud ~]# cat /etc/confd/  
  3. conf.d/     confd.toml  templates/    
  4. [root@centos7-cloud ~]# cat /etc/confd/confd.toml   
  5. backend = "etcd"  
  6. confdir = "/etc/confd/"  
  7. interval = 5  
  8. #watch = true  
  9. log-level = "info"  
  10. nodes = [  
  11.     "http://centos7-cloud:2379",  
  12. ]  
  13. noop = false  
  14. prefix = "/"  
  15. scheme = "http"  

[python] view plain copy
  1. [root@centos7-cloud ~]# cat /etc/confd/templates/nginx.conf.tmpl   
  2. user  apps apps;  
  3.   
  4. worker_processes 24;  
  5. worker_cpu_affinity 000000000000000000000001;  
  6.   
  7. error_log  /apps/logs/nginx/nginx_error.log  error;  
  8.   
  9.   
  10. #Specifies the value for maximum file descriptors that can be opened by this process.  
  11. worker_rlimit_nofile 65535;  
  12.   
  13. events  
  14. {  
  15.   use epoll;  
  16.   worker_connections 65535;  
  17. }  
  18.   
  19. http  
  20. {  
  21.   include       mime.types;  
  22.   #geoip_city /usr/local/nginx/conf/GeoLiteCity.dat;  
  23.   #include geo.conf;  
  24.   default_type  application/octet-stream;  
  25.   
  26.   #charset  gb2312;  
  27.   
  28.   
  29.   sendfile on;  
  30.   tcp_nopush     on;  
  31.   
  32.   client_body_timeout  5;  
  33.   client_header_timeout 5;  
  34.   keepalive_timeout  5;  
  35.   send_timeout       5;  
  36.   
  37.   open_file_cache max=65535 inactive=20s;  
  38.   open_file_cache_valid 30s;  
  39.   open_file_cache_min_uses 1;  
  40.   
  41.   tcp_nodelay on;  
  42.   
  43.   fastcgi_connect_timeout 300;  
  44.   fastcgi_send_timeout 300;  
  45.   fastcgi_read_timeout 300;  
  46.   fastcgi_buffer_size 64k;  
  47.   fastcgi_buffers 4 64k;  
  48.   fastcgi_busy_buffers_size 128k;  
  49.   fastcgi_temp_file_write_size 128k;  
  50.   
  51.   
  52.    
  53.   gzip on;  
  54.   gzip_min_length  1k;  
  55.   gzip_buffers     4 16k;  
  56.   gzip_http_version 1.0;  
  57.   gzip_comp_level 2;  
  58.   gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/json application/javascript;  
  59.   gzip_vary on;  
  60.   
  61.   #limit_zone  crawler  $binary_remote_addr  10m;  
  62.   proxy_temp_path   /dev/shm/temp;  
  63.   proxy_cache_path  /dev/shm/cache levels=2:2:2   keys_zone=cache_go:200m inactive=5d max_size=7g;  
  64.   
  65.   log_format log_access "$remote_addr" "\t$remote_user" "\t$time_local" "\t$request" "\t$request_time" "\t$upstream_response_time" "\t$status" "\t$body_bytes_sent";  
  66.   
  67.   
  68. ##############################################################################################################################################################   
  69.   
  70. ######################对应upstream的模板部分################  
  71. {{range $sub := ls "/subdomain"}}  
  72.     upstream {{base $sub}} {  
  73. {{$subdir := printf "/upstream/%s/*" $sub}}{{range getvs $subdir}}  
  74.         server {{.}}; {{end}}  
  75.         keepalive_timeout 65s;  
  76.     }  
  77. {{end}}  
  78.   
  79. #####################对应server的模板部分####################  
  80. {{range gets "/subdomain/*"}}  
  81.     server {  
  82.         listen  80;  
  83.         server_name  {{.Value}};  
  84.         location / {  
  85.                 proxy_pass              http://{{base .Key}};  
  86.                 proxy_redirect  off;  
  87.                 proxy_set_header  Host                   $host;  
  88.                 proxy_set_header  X-Real-IP             $remote_addr;  
  89.                 proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
  90.           }  
  91.     }  
  92. {{end}}  
  93. }  

3、nginx安装配置,这里不多说


4、执行confd,生成配置:

[python] view plain copy
  1. [root@centos7-cloud bin]#  ./confd -onetime -backend etcd -node http://127.0.0.1:2379  
  2. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO Backend set to etcd  
  3. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO Starting confd  
  4. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO Backend nodes set to http://127.0.0.1:2379  
  5. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO /apps/conf/nginx/nginx.conf has md5sum 391c4e48a2c484599896dbac3e0633c5 should be 7601c4d759f61e963075c38f532f5b36  
  6. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO Target config /apps/conf/nginx/nginx.conf out of sync  
  7. 2017-06-17T15:40:10Z centos7-cloud ./confd[21466]: INFO Target config /apps/conf/nginx/nginx.conf has been updated  


[python] view plain copy
  1. [root@centos7-cloud bin]# ./confd -interval=60 -backend etcd -node http://127.0.0.1:2379 &  
  2. [121501  
  3. [root@centos7-cloud bin]# 2017-06-17T15:40:27Z centos7-cloud ./confd[21501]: INFO Backend set to etcd  
  4. 2017-06-17T15:40:27Z centos7-cloud ./confd[21501]: INFO Starting confd  
  5. 2017-06-17T15:40:27Z centos7-cloud ./confd[21501]: INFO Backend nodes set to http://127.0.0.1:2379  

使用onetime参数的,配置文件生成一次后,confd程序就退出了,下面的那句,会每隔60秒轮询一次。一旦后端etcd相应的值发生变化就会重新生成相应的配置文件。

二、测试:

1、通过etcdctl命令,往etcd里增加k/v:

[python] view plain copy
  1. [root@centos7-cloud ~]# /apps/svr/etcd/bin/etcdctl set /service_sgin/upstream/service1/server3 192.168.1.3  
  2. 192.168.1.3  
  3. [root@centos7-cloud ~]# /apps/svr/etcd/bin/etcdctl set /service_sgin/subdomain/service3  "www.service3.com"   
  4. www.service3.com  

2、等待60s:

confd打印出来update更新的日志:

[plain] view plain copy
  1.  2017-06-17T15:41:27Z centos7-cloud ./confd[21501]: INFO /apps/conf/nginx/nginx.conf has md5sum 7601c4d759f61e963075c38f532f5b36 should be 5f0e6e8a0bb2fb8163883318094c9fb7  
  2. 2017-06-17T15:41:27Z centos7-cloud ./confd[21501]: INFO Target config /apps/conf/nginx/nginx.conf out of sync  
  3. 2017-06-17T15:41:27Z centos7-cloud ./confd[21501]: INFO Target config /apps/conf/nginx/nginx.conf has been updated  
  4. 2017-06-17T15:42:27Z centos7-cloud ./confd[21501]: INFO /apps/conf/nginx/nginx.conf has md5sum 5f0e6e8a0bb2fb8163883318094c9fb7 should be 7da66fc7dd91dc65817744ea1fca23a8  
  5. 2017-06-17T15:42:27Z centos7-cloud ./confd[21501]: INFO Target config /apps/conf/nginx/nginx.conf out of sync  
  6. 2017-06-17T15:42:27Z centos7-cloud ./confd[21501]: INFO Target config /apps/conf/nginx/nginx.conf has been updated  

3、对比文件:

初始:




自动更新后:




原创粉丝点击