搭建Ngrok内网转发服务实现微信开发测试(类似花生壳)

架构设计 2017-07-24

我们在本地开发时,由于现在大部分网络接入都在内网环境中,没有公网ip,因此想要访问本地开发服务进行测试是比较难的,这一点在微信开发时尤其是个问题。因为微信开发是需要与微信的测试服务器接口进行交互,如果没有公网ip,微信服务器找不到本机测试环境的地址,自然无法返回值,也无法完成对接。

很早之前就测试了花生壳这个内网穿透服务,效果还是可以的,但是问题有两个,免费服务并不稳定,同时只能使用其规定的几个域名,如果打算用自定义域名来测试开发,那就没有办法了(也许收费服务可以解决这个问题)。接着测试了网友提供的Ngrok服务,但是由于太多人滥用,导致服务间歇性中断,非常不稳定,已经不能愉快的玩耍了。于是经过一番了解了,终于还是打算自己搭建一个内网转发服务用于开发用。

Ngrok

Ngrok这个服务2.0以前的版本本身是免费开源的,但是其存在两个问题,配置有些复杂,编译麻烦,更重要的是还存在有内存泄露的小问题,这么一点不稳定的因素让我选择了另一个服务,Python-ngrok

搭建的过程非常的简单,首先看一下需求:

服务端与本地端需求

Python 2.7.9 或 Python 3.4.2 以上

很简单的需求,如果服务端与本地端是Linux,直接安装Python3即可。

我这里的服务端是CentOS 7,运行以下命令安装:

yum install python34

完成Python3.4的安装。

我的本地操作系统是Windows,因此直接去Pyhton官网下载Python3.6.2后安装即可。

服务端配置

首先下载Python-ngrok服务端并解压,执行

wget https://github.com/hauntek/python-ngrokd/archive/master.zip
unzip master.zip

进入目录后,修改服务端的配置:

vi ngrokd.py

修改以下部分对应的配置:

SERVERDOMAIN = 'ktsee.com' # 服务域名
SERVERHOST = ''
SERVERHTTP = 80
SERVERHTTPS = 443
SERVERPORT = 4443

其中SERVERDOMAIN修改为你这台服务器对应的域名,该域名的子域名可以分配用于转发服务。其他部分基本不用修改,如果你对安全性的需求比较高,可以修改SERVERPORT为只有你知道的端口。

配置完成后,安装Screen并运行:

yun install tmux
tmux

进入tmux进程中,开始运行ngrok服务:

python3 ngrokd.py

服务端运行成功。

如果需要再次进入tmux,输入:

tmux attach

进入进程查看ngrok执行状态

域名配置

除了设置服务端,还得将域名的解析指向装有服务端的服务器ip(这里用1.2.3.4举例),例如前面我们的服务端设置的域名为ktsee.com,那么只需要设置两条记录:

A记录          ktsee.com         1.2.3.4
CNAME记录      *.ktsee.com       ktsee.com

设置完成,接下来设置本地客户端。

客户端设置

在你的开发电脑上下载客户端:

下载:https://github.com/hauntek/python-ngrok/archive/master.zip

下载解压后,编辑python-ngrok.py文件,修改其中的渠道队列部分:

body = dict()
body['protocol'] = 'http'
body['hostname'] = 'www.xxx.com'
body['subdomain'] = ''
body['rport'] = 0
body['lhost'] = '127.0.0.1'
body['lport'] = 80
Tunnels.append(body) # 加入渠道队列

这里有三块类似于上面部分的代码,根据需求设置,多余的删除掉,我的配置是:

body = dict()
body['protocol'] = 'http'
body['hostname'] = ''
body['subdomain'] = 'dev'
body['rport'] = 0
body['lhost'] = '127.0.0.1'
body['lport'] = 80
Tunnels.append(body) # 加入渠道队列

这样表示用dev.ktsee.com这个子域名用作内网转发服务,保存后双击执行。

接着在浏览器中访问dev.ktsee.com,其效果与访问localhost一样,可以看到本地的开发环境显示结果。不同的是,这个dev.ktsee.com可以被外网用户访问,当然也包括了微信的回调服务器。

剩下的就是愉快的玩耍吧。


本文由 surenkid 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

4 条评论

  1. kino
    kino

    我用windows服务器跑不起来,应该怎么配置呢?还是说要修改程序?

    1. surenkid
      surenkid

      SERVERDOMAIN参数需要设置为你的服务器上绑定的域名,SERVERDOMAIN对应的端口需要在防火墙里打开,然后再试试呢。另外Python版本需要3.42以上

      1. kino
        kino

        我一直遇到的是这个问题,在connt.py的68行也就是对data解码的时候会抛异常:'utf-8' codec can't decode byte 0xfc in position 8: invalid start byte;而在客户端在运行到95行的时候会抛异常:EOF occurred in violation of protocol (_ssl.c:748)。我对python不是很熟悉所以个中问题不是很明白

        1. surenkid
          surenkid

          其实我对Python也正在学习中,刚刚我看了你的问题后,又下载后在windows环境下测试运行,运行正常,你尝试一下:
          1. 编辑ngrokd.py时,使用notepad++之类的编辑器,不要使用win自带记事本,保持文件编码为utf-8
          2. 命令行中输入python -V查看版本,如果版本过低,最好去官网下载最新版(我在windows下测试的版本是python 3.62)

添加新评论