配圖來自知乎[@TOM 朱](https://www.zhihu.com/people/tom-zhu-36)
微信開發(fā)由于微信服務器要主動發(fā)送消息,所以 Web Server 必須暴露在公網(wǎng)環(huán)境中。
本地開發(fā)經(jīng)常在內(nèi)網(wǎng)测暗,雖然有各種 ngrok 等第三方產(chǎn)品,不過要么付費使用官方服務磨澡、要么自己搭建服務麻煩碗啄、要么使用通過個人搭建的服務不安全,不如直接使用 ssh 實現(xiàn)內(nèi)網(wǎng)穿透來得簡單稳摄。
當然稚字,此方案隱含了一個條件是需要有臺公網(wǎng)服務器,這個不管是租用云主機或者申請運營商的固定IP厦酬,或者使用動態(tài)DNS服務胆描,應該不難做到。
SSH 內(nèi)網(wǎng)穿透
這個主要通過 ssh 的遠端端口轉(zhuǎn)發(fā)功能(-R參數(shù))實現(xiàn)仗阅。
為了在自動重連時避免每次輸入密碼昌讲,還需要配置 ssh 證書實現(xiàn)免密碼登錄。
實現(xiàn)方法如上所述比較簡單减噪,不過考慮網(wǎng)絡不穩(wěn)定短绸,記載一些配置時要注意的地方。
Server
- /etc/ssh/sshd_config
ClientAliveInterval 30 # 主動向 Client 發(fā)消息的間隔 ClientAliveCountMax 3 # 主動發(fā)消息失敗重試次數(shù)旋廷,達到后斷開連接
Client
-
~/.ssh/config
ServerAliveInterval 10 # 主動向 Server 發(fā)消息間隔鸠按,用作維持連接的心跳 ExitOnForwardFailure yes # 轉(zhuǎn)發(fā)失敗后退出礼搁,便于重建連接
-
具體命令(以下任選其一)
- 手動 autossh
while (1) do ssh -NR <local host>:<local port>:<remote host>:<remote port> user@host done
- autossh(感覺此方法實際效果不如手動好)
autossh -M 5678 -NR <local host>:<local port>:<remote host>:<remote port> user@host
NGINX 反向代理
這個比較簡單饶碘,在 Server 側(cè)正常部署 NGINX 站點后,直接將原來站點的配置文件中 location 配置節(jié)中指定為 proxy_pass 即可馒吴。
location / {
proxy_pass http://<remote host>:<remote port>;
}
參考
- 查看占用端口的進程扎运,便于手動釋放(kill)
$ sudo netstat -plant | grep <remote port>
- 確認內(nèi)網(wǎng)穿透是否打通
$ curl http://<remote host>:<remote port>