之前的文章介紹了許多我們在用的DevOps相關的工具系統,例如:方便創建多套運行環境的Alodi,對運維友好的配置中心Kerrigan,強大的自定義任務引擎Probius以及專注於數據庫自動化的overmind等等,這篇文章介紹一個非常簡單但卻十分好用的系統,Proxy代理管理系統
代理系統類似於Kubernetes里Ingress的角色,位於下層服務與上層用戶之間,作用與公有雲的負載均衡LB一致,基於Nginx構建,主要使用Upstream模塊
系統由來
為什么會需要這么個系統?來講講我們的場景和邏輯
每個項目都需要開發測試環境,這些環境都部署在公司內網,而很多項目因為各種原因都需要外網能訪問的到,例如小程序/公眾號/支付相關的項目都需要接收微信支付寶的回調,這種需求通常有兩種方式來實現
- 直接給開發測試環境所在的主機配置個公網IP,域名指向這個公網IP
- 搭建一個代理服務器,所有的請求都先到這個代理服務器,然后根據域名轉發到不同的項目環境
對於方案1,優點在於實現簡單,但缺點更為明顯,首先公網IP資源有限,其次管理也不方便,只適合一些項目不多的小團隊。方案2則更為常用,只需要一個公網IP,將所有需要外網訪問的項目入口集中在一起,管理起來也更為方便
我們剛開始就是找了台服務器部署Nginx做代理,如果需要代理服務就去修改Nginx配置文件,但隨着項目越來越多,修改Nginx配置文件也成了麻煩事,效率低下、修改沖突、不可追蹤成了急需問題,於是便開發了這個Proxy代理系統,到目前為止穩定運行3年,管理了400+代理
系統介紹
系統的核心功能就是要通過web去提交配置然后自動生成Nginx配置文件,除了用戶管理這種通用模塊外主要分三大塊的內容:實例管理,證書管理和黑白名單,每一個實例都指的是一個代理服務,對應Nginx中的一個Server,實例關聯證書和黑白名單,這里先介紹一下證書和黑白名單模塊
證書模塊可以用來管理所有用到的HTTPS證書,每一個證書都會在服務器上創建對應的crt和key文件,方便在實例中引用,對於證書的更新也只需要更新這一個地方就可以了,更新完成之后會自動reload以保證生效
黑白名單模塊對應與Nginx的ACL設置,通過allow和deny來實現黑名單禁止訪問,白名單允許訪問,原理與證書管理差不多,都是根據輸入內容生成對應的文件保存到服務器上,生成配置文件用到了jinja2,我的博客也是同樣的方法生成的,可以看這篇文章來了解:利用Django徒手寫個靜態頁面生成工具,黑白名單最終在實例里以include的方式引入
無論是證書還是黑白名單最終都是為實例也就是Nginx的Server服務的,對於作為代理的Server配置很簡單,下方是一個模板
upstream 11 {
server 192.168.106.110:80;
}
server {
listen 443;
server_name blog.ops-coffee.cn ;
ssl on;
ssl_certificate ssl/1.crt;
ssl_certificate_key ssl/1.key;
include acl/1.conf;
include acl/3.conf;
deny all;
auth_basic "please input user&passwd";
auth_basic_user_file key/11.key;
location / {
proxy_pass http://11;
}
access_log /home/logs/nginx/11.log main;
}
從這個模板里可以看出,我們大概需要如下一些信息,域名server_name
、開放端口listen
、是否開啟ssl
以及SSL的證書和密鑰、是否有acl
白名單以及白名單的地址、是否需要auth_base
認證以及賬號密碼這幾類信息,於是對於新建實例我們就需要如下這些信息
根據平時的使用經驗,可能有多個域名使用同一個代理,所以提交的數據還有個別名。同時高級配置里還支持用戶輸入自定義的Nginx配置,這些自定義的Nginx配置會自動填充到Server中,這樣就能方便的實現更加復雜的需求,例如修改上傳文件大小限制、開啟websocket支持、甚至是根據URI的代理等
對於實例更多的信息可以在實例詳情頁面查看
注意右上角有個“日志”按鈕,系統還集成了查看日志的功能,通過websocket去監聽日志文件,實時的輸出到頁面上,方便排錯,Websocket實時獲取日志文件之前寫過一篇文章有介紹,可以點這個鏈接查看,不過我在Proxy里使用的有所簡化,沒有用到Celery,更輕便
額外收獲
Proxy原本用來管理需要對外開放訪問的項目,但為了統一的管理,逐漸的把所有的代理都遷移進了Proxy,這樣做不僅管理起來更為方便,而且無形中還提供了一個查詢團隊所有域名的入口,團隊現在維護了超過100+項目,並不是每個人都能准確的記住每個項目各個環境的域名,而通過Proxy就可以方便的查詢
在Proxy應用后,對於域名的管理也簡單了不少,原本DNS上有幾百條xxx.ops-coffee.cn的域名分別指向了不同的IP,現在也簡單多了,只需要創建一條*.ops-coffee.cn的泛域名解析指向到Proxy的地址即可
Proxy雖然是個非常簡單的小工具,但帶來的便利卻並不簡單~