当我们项目越来越多时手动去服务器修改nginx配置是一件很麻烦而且可能出错的事情。我们可以通过nginx+confd+配置中心实现一套方案避免出错并减少繁琐的流程。
首先直接上nginx+confd的dockerfile
FROM nginx:1.21.6 # 拷贝confd二进制可执行文件 https://github.com/kelseyhightower/confd/releases/tag/v0.16.0 COPY ./confd-0.16.0-linux-amd64 /usr/local/bin/confd # 拷贝wait-for脚本 https://github.com/Eficode/wait-for COPY ./wait-for / # 安装nc支持wait-for脚本 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y net-tools && apt-get clean && rm -rf /var/lib/apt/lists/* RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y netcat && apt-get clean && rm -rf /var/lib/apt/lists/* # 创建配置文件目录 RUN mkdir -p /etc/confd/conf.d # 给可执行权限 && chmod +x /usr/local/bin/confd && chmod 777 /wait-for # 使用脚本启动多进程 && echo “#!/bin/bash” >> start.sh && echo “nohup /usr/local/bin/confd -config-file /etc/confd/conf/confd.toml &” >> start.sh && echo “nginx -g daemon off;” >> start.sh && chmod 664 ./start.sh CMD [“bash”, “start.sh”]如果不想自己生成可以用:
https://hub.docker.com/repository/docker/lablelan/nginx-confd
这里使用docker-compose来演示如何使用nginx+confd+etcd+etcdkeeper通过图形化修改nginx配置
version: 2 networks: app-tier: driver: bridge ipam: driver: default config: – subnet: 172.22.0.0/16 services: Etcd: image: bitnami/etcd:3.5.2 environment: – ALLOW_NONE_AUTHENTICATION=yes – ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 ports: – 2379:2379 – 2380:2380 networks: app-tier: ipv4_address: 172.22.0.2 EtcdKeeper: image: deltaprojects/etcdkeeper:latest – 8000:8080 ipv4_address: 172.22.0.3 Nginx: image: lablelan/nginx-confd command: sh -c /wait-for Etcd:2379 — bash start.sh depends_on: – Etcd volumes: – “./confd.toml:/etc/confd/conf/confd.toml” – “./nginx.tmpl:/etc/confd/templates/nginx.tmpl” – “./myapp-nginx.toml:/etc/confd/conf.d/myapp-nginx.toml” – “./nginx.conf:/etc/nginx/nginx.conf” – “./conf.d:/etc/nginx/conf.d” – 80:80 ipv4_address: 172.22.0.4启动后当通过etcdkeeper创建或更新/myapp/services/web/www/1会动态生成nginx配置(80端口转发8080端口)并自动生效。这里ip配置的是内网ip不使用127.0.0.1,因为服务并不跑在nginx容器上(注意www.lablelan.com我本地hosts设置成了127.0.0.1)
这里端口8080跑的服务是一个简单的demo服务(nodejs),需要的可以从gitee获取
https://gitee.com/lablelan/amis-demo
配置完etcd后我们可以看到访问http://www.lablelan.com/select已经成功返回了
可能这样并不能体现出这个方案的实用性,其实我们可以通过在业务代码通过将当前服务信息注册到etcd实现服务发现功能,这样就可以动态地生成nginx配置从而避免手动修改nginx配置减少出错。
暂无评论内容