有时学习

学习,让我们永远不被时代抛弃

如何在阿里云搭建自己的ngrok服务


  • What?

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。简单来说就是可以让你的本地服务暴露在外网上面,可以通过外网访问,这是我们经常需要用到的功能。


    Why?

    作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供它人体验评价或协助调试等等,通常我们会这么做:

    • 找到一台运行于外网的Web服务器
    • 服务器上有网站所需要的环境,否则自行搭建
    • 将网站部署到服务器上
    • 调试结束后,再将网站从服务器上删除
    • 只不过是想向朋友展示一下网站而已,要不要这么麻烦,累感不爱

    在国内开发微信公众号、企业号以及做前端开发的朋友想必对ngrok都不陌生吧,就目前来看,ngrok可是最佳的在内网调试微信服务的tunnel工具。之前,ngrok.com提供的服务还一切正常,后来就被墙了 。没有了ngrok tunnel,一切开始变得困难且没有效率起来。内网到外部主机部署和调试是一件慢的让人想骂街的事情。后来就想着自己搭一个ngrok服务。

    How?

    如何搭建ngrok服务呢?

    下面是我在阿里云centOS7上面的搭建过程。

    1.go环境搭建

    go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。
    源码安装go的详细过程如下:

    • 1).下载源码,可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-amd64.tar.gz。
    • 2).将其解压到/usr/local目录下:
    tar -C /usr/local  -xzf   go1.4.2.linux-amd64.tar.gz  
    

    注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。

    • 3). 在root环境下执行如下命令:
    mkdir $HOME/go  
    echo 'export GOROOT=/usr/local/go'>> ~/.bashrc  
    echo 'export GOPATH=$HOME/go'>> ~/.bashrc  
    echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc  
    source  $HOME/.bashrc  
    
    • 4). 安装go get工具
    yum install mercurial git bzr subversion  
    
    2. 获取源码

    git版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。
    获取源码:

    git clone https://github.com/inconshreveable/ngrok.git  
    
    3. 编译

    1). 配置环境变量

    export NGROK_DOMAIN="tunnel.bbear.me"  
    

    tunnel.bbear.me替换成你自己的域名。
    2). 生成自签名ssl证书

    cd ngrok
    
    openssl genrsa -out rootCA.key 2048
    
    openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
    
    openssl genrsa -out device.key 2048
    
    openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
    
    openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
    
    cp rootCA.pem assets/client/tls/ngrokroot.crt
    
    cp device.crt assets/server/tls/snakeoil.crt
    
    cp device.key assets/server/tls/snakeoil.key  
    

    设置变量:

    GOOS=linux GOARCH=amd64  #如果是32位系统,这里 GOARCH=386  
    

    生成服务端与客户端

    make release-server release-client  
    

    注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址:

    找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:”github.com/keepeye/log4go” 。

    编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。

    4. 交叉编译生成windows客户端

    上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。 交叉编译过程如下:

    1. 进入go目录,进行环境配置
    cd  /usr/local/go/src/
    
    GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash  
    
    1. 进入ngrok目录重新编译
    cd  /usr/local/src/ngrok/
    
    GOOS=windows GOARCH=amd64 make release-server release-client  
    

    编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。

    编译Mac客户端

    cd /usr/local/go/src  
    GOOS=darwin GOARCH=amd64 ./make.bash  
    

    然后回去ngrok目录,接着编译:

    cd /usr/local/src/ngrok  
    GOOS=darwin GOARCH=amd64 make release-client  
    

    完成后会在 /usr/local/src/ngrok/bin/darwin_amd64/ 下发现 ngrok 文件,将其拷贝到Mac上面,像上面windows 的设置即可使用。

    5. ngrokd服务启动与使用

    1、启动ngrokd服务端

    bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"  
    

    注意,让程序一直在后台运行可以执行

    nohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &  
    

    想要结束后台进程可以

    ps -A   #找到PID  
    kill xxxid  
    

    2、启动ngrok客户端

    客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置

    server_addr: "tunnel.bbear.me:4443"  
    trust_host_root_certs: false  
    

    再在windows控制台执行

    ngrok -config=ngrok.cfg -subdomain upal 8080  
    

    upal是你自定义地址。

    看到这样一个界面就说明成功了 《如何在阿里云搭建自己的ngrok服务》

    如果是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同 《如何在阿里云搭建自己的ngrok服务》

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注