微信开发由于微信服务器要主动发送消息,所以 Web Server 必须暴露在公网环境中。
本地开发经常在内网,虽然有各种 ngrok 等第三方产品,不过要么付费使用官方服务、要么自己搭建服务麻烦、要么使用通过个人搭建的服务不安全,不如直接使用 ssh 实现内网穿透来得简单。
当然,此方案隐含了一个条件是需要有台公网服务器,这个不管是租用云主机或者申请运营商的固定IP,或者使用动态DNS服务,应该不难做到。
SSH 内网穿透
这个主要通过 ssh 的远端端口转发功能(-R参数)实现。
为了在自动重连时避免每次输入密码,还需要配置 ssh 证书实现免密码登录。
实现方法如上所述比较简单,不过考虑网络不稳定,记载一些配置时要注意的地方。
Server
- /etc/ssh/sshd_config
ClientAliveInterval 30 # 主动向 Client 发消息的间隔 ClientAliveCountMax 3 # 主动发消息失败重试次数,达到后断开连接
Client
-
~/.ssh/config
ServerAliveInterval 10 # 主动向 Server 发消息间隔,用作维持连接的心跳 ExitOnForwardFailure yes # 转发失败后退出,便于重建连接
-
具体命令(以下任选其一)
- 手动 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 侧正常部署 NGINX 站点后,直接将原来站点的配置文件中 location 配置节中指定为 proxy_pass 即可。
location / {
proxy_pass http://<remote host>:<remote port>;
}
参考
- 查看占用端口的进程,便于手动释放(kill)
$ sudo netstat -plant | grep <remote port>
- 确认内网穿透是否打通
$ curl http://<remote host>:<remote port>