![[開發工具小技巧][04]ngrok讓外部能夠連到localhost的網站及服務.jpg](/posts/2018/04/2018-04-30-devtooltips-5-ngrok-allow-public-to-access-localhost-website-and-sql-server/5b274037-6a37-455b-ac46-387d252809e2.jpg)
在開發的過程中,有時候會需要從另外一臺機器測試在local的網站及服務。最常見的情況就是當要測試網站在手機上看起來長什麽樣子的時候,或者有時候要讓別人連到自己local的sql serer的時候。
如果說要測試網站,還可以透過上到一臺測試機器,但是如果是local的sql server的話,除了在同一個局域網外比較容易,其他就需要改到路由什麽,太麻煩了。
今天介紹的工具,ngrok,就是讓這一切變得容易的工具,而且很佛心的是,免費版就夠一般使用。
ngrok運作模式
本質上ngrok就是一個reverse proxy的工具,透過把local的port map到一個public的地址,讓外部能夠透過這個public地址連到,然後工具用reverse proxy和local實際的port取得資料。

由於這個過程,因此有個缺點,那就是速度相對較慢,尤其是ngrok的伺服器在美國因此也會減少一些速度。不過如果是爲了開發測試用,這個就不算缺點。
ngrok免費版本提供了一個動態的地址,需要進階功能或者同時map多個服務就需要付費。
ngrok安裝及設定
大概有幾個步奏:
- 下載ngrok - 這個工具是一個免安裝的工具,因此建議加入到path比較好執行
- 在ngrok 注冊一個免費賬號
- 把賬號token設定一下
- 下載ngrok
ngrok 小檔案
- 官網:https://ngrok.com/
- 下載地址:https://ngrok.com/download
- 費用功能差異:https://ngrok.com/pricing
- 支援的OS:Windows、Linux及Mac
- Windows建議用Chocolatey安裝:choco install ngrok
- 在ngrok注冊一個免費賬號
- 基本上和一般申請賬號方式沒什麽兩樣,鏈接https://dashboard.ngrok.com/user/signup。
- 把賬號token設定一下
注冊完賬號之後,會自動進入dashboard,會看到有個token,把這個設定進去之後當有執行的時候會自動和這個賬號關聯,也可以用web界面看到情況。
取得auth token的畫面 設定完之後會看到在
%userprofile%\.ngrok2\ngrok.yml
裏面有這個設定。設定完auth token
ngrok的使用
到這步爲止,所有設定都好了,接下來就是開始使用了。
這邊會以幾個情景介紹:
- 外部連到local的web服務
- 外部連到local的tcp服務
外部連到local的web服務
假設有個服務在port:1234
,這個時候可以透過以下指令呼叫:
這個時候就會看到一個外部可以用的網址,用哪個就可以連到。
如果不需要的時候就透過輸入
即可
外部連到local的tcp服務
如果今天是要讓外面連到local的sql server,ngrok也支援tcp的映射。
以sql server爲例,衹需要呼叫:
再來使用SSMS做測試連綫即可。

從上面兩個gif,尤其是tcp測試那個,會明顯感覺到速度有點慢,這個取決於自己的網速(我這邊還有點慢),加上本身在美國點的原因。
要測試前,記得sql server有支援tcp連綫。詳細可以參考我另外一篇:[SQL]為什麼連不到MSSQL資料庫 - 故障排除指南
ngrok的進階使用
上面的介紹足夠一般的使用,不過有時候還會有些進階的應用,這邊介紹3個:
- 外鏈的web服務加密
- 重寫hostname的方式
- 管理/監控呼叫情況
外鏈的web服務加密
有時候給別人測試的鏈接不希望任意的人都能夠開啓,ngrok非常貼心的提供了這個服務。
只需要在mapping的時候加上auth
這個參數就可以設定密碼保護。例如:
意思是,賬號要是admin
,而密碼是12345
map到 1234 port。

重寫hostname的方式
有些服務會使用到hostname的值,這個時候重寫hostname的功能就變得很重要。
可以使用host-header
做設定。
這邊的例子用的是在IIS裏面設定只有test.com才會binding到80port,使用的指令就是:

管理/監控呼叫情況
當ngrok執行起來之後,每一個request都會有記錄,可以透過使用command line、連到 localhost:4040

- 當執行起來之後,會看到外部可以連的網址。
- 當有request進來,每一個結果寫在下面,從localhost:4040也可以看到,而且内容比較詳細(右邊的截圖)
結語
這篇介紹了ngrok這個工具,并且如何用ngrok讓local的東西能夠在外部被測試到。
這篇也介紹了如果要保護local的服務,可以用賬號密碼登入的方式避免泄露。如果需要hostname ngrok也有支援。
如果需要一些更深入的功能,例如網址不要變動,那麽可以考慮從free plan升級。
你有在用什麽類似的工具嗎?也歡迎分享交流。