Nginx 作为优秀的开源软件, 凭借其高性能高并发等特点, 常常作为 web 和反向代理服务部署在生产环境中. 但是当 Nginx 的规模较大时, Nginx 的运维成本也是不断上升. 本文介绍如何通过 confd+ACM 来管理 Nginx 配置, 通过集中式的配置管理方式解决 Nginx 的大规模运维问题, 运维和开发人员不用登陆到 Nginx 机器上, 只需要配置好 confd, 然后在 ACM 上操作就可以动态修改 Nginx 的配置参数.
准备工作
在操作本文的示例之前需要配置好开通 ACM 和对 confd 的使用有基本概念, ACM 的开通及其基本使用可以参考: 这里
confd 的基本使用可以参考: 这里
Nginx 在日常开发中使用得比较多的功能是负载均衡, 限流, 缓存等, Nginx 的使用和安装可以在网上查阅相关资料. 本文结合负载均衡和限流功能讲解如何使用 confd+ACM 实现 Nginx 的大规模运维操作.
创建 confd 配置文件
创建 confd 所需的 toml 格式配置文件
VIM /etc/confd/conf.d/myapp.toml
check_cmd 用于检验 Nginx 配置的正确性, 当 src 配置错误则不会覆盖 Nginx 配置
reload_cmd 用于 reload Nginx 配置
- [template]
- src = "Nginx .conf.tmpl"
- dest = "/usr/local/ Nginx /conf/ Nginx .conf"
- keys = [
- "/myapp/ Nginx /conf",
- ]
- check_cmd = "/usr/local/ Nginx /sbin/ Nginx -t -c {{.src}}"
- reload_cmd = "/usr/local/ Nginx /sbin/ Nginx -s reload"
创建模版文件
VIM /etc/confd/templates/ Nginx .conf.tmpl
getv 从 ACM 中获取对应 dataId 的配置,/myapp/ Nginx /conf 对应的 dataId 为 myapp. Nginx .conf, 配置格式为 JSON 格式, 模版文件包含了 Nginx 的 upstream, 限流, 黑白名单配置内容, 通过 JSON 指令解析配置文件. upstream 后端 ip 通过从 ACM 的配置的 backends 数组中获取, 同样地, 白名单和黑名单 ip 分别存储在 whiteList 和 blackList 的数组中, 限流的速率和并发数通过 rateLimit 和 connectionLimit 设置
- ...
- {{$data := JSON (getv "/myapp/ Nginx /conf")}}
- geo $whiteiplist {
- default 1;
- {{range $data.whiteList}}
- {{.}} 0;
- {{end}}
- }
- map $whiteiplist $limit {
- 1 $binary_remote_addr;
- 0 "";
- }
- limit_req_zone $limit zone=rateLimit:10m rate={{$data.rateLimit}}r/s;
- limit_conn_zone $limit zone=connectionLimit:10m;
- {{range $data.blackList}}
- deny {{.}};
- {{end}}
- upstream myapp {
- server 11.160.65.95:8080;
- }
- server {
- listen 80;
- server_name localhost;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html;
- index index.HTML index.htm;
- proxy_pass http://myapp;
- limit_conn connectionLimit {{$data.connectionLimit}};
- limit_req zone=rateLimit burst={{$data.burst}} nodelay;
- }
- ...
- }
- ...
在 ACM 上创建所需的配置文件
创建 dataId 为 myapp. Nginx .conf 的配置文件, group 使用默认的 DEFAULT_GROUP 即可, 配置内容设置好上游节点, 黑白名单以及限流阈值
- {
- "backends":["10.0.1.100:80","10.0.1.101:80"],
- "whiteList":["10.0.1.102","10.0.1.103"],
- "blackList":["10.0.1.104","10.0.1.104"],
- "rateLimit":"10",
- "connectionLimit":"10",
- "burst":"10"
- }
启动 confd
启动 confd, 设置好 backend,endpoint, 命名空间 namespace 和阿里云账号 accessKey/secretKey
confd -backend nacos -endpoint {endpoint}:8080 -namespace {namespace} -accessKey {accessKey} -secretKey {secretKey}
生成配置文件
confd 将 ACM 中的参数通过模板文件渲染生成新的 Nginx 配置文件, 查看生成的 / usr/local/ Nginx / Nginx .conf 配置文件是否符合预期, 并检查 Nginx 是否成功 reload 配置.
- ...
- geo $whiteiplist {
- default 1;
- 10.0.1.102 0;
- 10.0.1.103 0;
- }
- map $whiteiplist $limit {
- 1 $binary_remote_addr;
- 0 "";
- }
- limit_req_zone $limit zone=rateLimit:10m rate=10r/s;
- limit_conn_zone $limit zone=connectionLimit:10m;
- deny 30.5.125.74;
- deny 10.0.1.105;
- upstream myapp {
- server 11.160.65.95:8080;
- }
- server {
- listen 80;
- server_name localhost;
- location / {
- root HTML;
- index index.HTML index.htm;
- proxy_pass http://myapp;
- limit_conn connectionLimit 10;
- limit_req zone=rateLimit burst=10 nodelay;
- }
- ...
- }
- ...
动态修改 Nginx 配置
运行时当需要调节 Nginx 的名单或者限流阈值的时候, 可以在 ACM 上修改配置的内容. 当然在生产环境可以使用 ACM 的灰度发布功能 (Beta 发布) 验证没问题再全量发布下去.
本文演示了如何使用 confd+ACM 管理 Nginx 配置, 降低 Nginx 的运维成本.
confd+ACM 的使用还可以参考:
如何在阿里云上安全的存放您的配置 - 续
使用 etcd+confd 管理 Nginx 配置
来源: https://yq.aliyun.com/articles/708529