nginx小技巧-動態域名(微信,小程式80埠)

趙安家發表於2019-03-03

如果公司有微信開發需求的話,得有備案了的域名和80埠

員工開發除錯是個問題,如果每次都找運維修改,維護,會被K的。

交換機設定DMZ到一臺固定伺服器,在上面部署nginx/openresty

可以gitlab(svn)+jenkins/ansible等運維方式實現每次修改配置檔案後,提交到gitlab觸發CI/CD推送到nginx伺服器,執行reload

當然變通的也有,比如,openresty+lua訂閱redis,發現變更後,讀取redis的配置,rewrite到本地配置檔案然後reload,但是總歸是比較笨重的

下面說的是通過server_name設定萬用字元來實現動態域名的方案

server {
    listen 443 http2 ssl;
    listen 80;
    server_name  ~(?<h>.+)_(?<a>d+)_(?<b>d+).domain.com;
    location / {
        //proxy settings ...
        //$h 是abc_1_1中的abc
        //proxy_set_header   Host $h;
        proxy_pass http://192.168.$a.$b;
    }
}
複製程式碼

使用方法

開發者機器上安裝nginx,並且配置相應的vhost

    server {
        listen       80;
        server_name  abc*;

        location / {
            root html;
            index index.html;
        }
    }
複製程式碼
curl http[s]://abc_1_1.domain.com
複製程式碼

等於

curl -H"abc_1_1.domain.com" http[s]://192.168.1.1
複製程式碼

為啥用_分隔,而不是用.分隔成多級域名,是因為Let`s Encrypt的萬用字元是同級萬用字元,比如*.domain.com只支援a.domian.com這種,a.b.domain.com是無效的,如果不需要https訪問(小程式需要https)的話,則可以自行修改成.分隔

注意,此方案會存在一定的安全隱患,比如,ip爆破(可以設定白名單訪問,basic auth,限制動態ip範圍).

好處是維護簡單(新增域名,更改域名->ip對映,修改配置,採集資料,列印日誌等)

本文只是其中反向代理中的一種,類似的反代方案還有frp和ngrok,還可以用dns(bind,dnsmasq).

相關文章