當我們專案越來越多時手動去伺服器修改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配置減少出錯。
以上是docker中如何透過nginx+confd動態產生配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!