Proxy:簡單小巧又強大好用的代理系統

coffee發表於2020-12-09

之前的文章介紹了許多我們在用的DevOps相關的工具系統,例如:方便建立多套執行環境的Alodi對運維友好的配置中心Kerrigan強大的自定義任務引擎Probius以及專注於資料庫自動化的overmind等等,這篇文章介紹一個非常簡單但卻十分好用的系統,Proxy代理管理系統

代理系統類似於Kubernetes裡Ingress的角色,位於下層服務與上層使用者之間,作用與公有云的負載均衡LB一致,基於Nginx構建,主要使用Upstream模組

系統由來

為什麼會需要這麼個系統?來講講我們的場景和邏輯

每個專案都需要開發測試環境,這些環境都部署在公司內網,而很多專案因為各種原因都需要外網能訪問的到,例如小程式/公眾號/支付相關的專案都需要接收微信支付寶的回撥,這種需求通常有兩種方式來實現

  1. 直接給開發測試環境所在的主機配置個公網IP,域名指向這個公網IP
  2. 搭建一個代理伺服器,所有的請求都先到這個代理伺服器,然後根據域名轉發到不同的專案環境

對於方案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雖然是個非常簡單的小工具,但帶來的便利卻並不簡單~

相關文章