當我們項目越來越多時手動去服務器修改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配置減少出錯。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END