下面是我在阿里云centOS7上面的搭建过程。
0 Y% \3 e5 c) j& X: N+ G( P U- f" e
# l v: z: V s/ K) f R& x+ N2 k1.go环境搭建) H* B. l+ @' q4 k) ~+ J/ [( z
go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。
: y8 `, G* H3 P- B源码安装go的详细过程如下:4 Y8 l, f4 v5 b `
+ s& u6 {) p, F$ @6 V: d+ d1).下载源码,可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-amd64.tar.gz。
% ~) G) V5 P( P$ K$ b1 H0 q3 B! x3 b1 h9 q3 [8 S
2).将其解压到/usr/local目录下:
+ a {! |- [9 \tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz 3 u; P) U9 O" y& j6 I8 M9 h5 ?
[7 c8 E4 d& B- @
注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。
! ^* m B0 G5 u- s- [' p+ a0 `( B) N: M H) y5 b8 I
3). 在root环境下执行如下命令:3 p2 P1 t. |# n* h1 L0 x! t
mkdir $HOME/go $ w% S* V. N6 ?# j; T
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
P- _% c0 Z8 n8 h. Fecho 'export GOPATH=$HOME/go'>> ~/.bashrc 5 U2 r7 W, ~6 A N# v1 D/ O
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
- @" u) Y s' q. M) [4 u$ `' lsource $HOME/.bashrc m# H9 R; Y( e3 u( r* z% i) ^
9 y7 s- n7 B# e) X# y- c3 E3 c; L4). 安装go get工具' Z. y+ j8 h* y
yum install mercurial git bzr subversion
% F+ x5 u: V# {1 E/ ?& G: s1 Y4 h
* B2 p9 [9 y; L* @* y* @2. 获取源码
6 t" ^! v4 S" Z* f- K' H- Qgit版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。
$ G0 K% d; C: k8 V' Z: A$ [获取源码:
( _+ X4 C3 P) i" |$ Sgit clone https://github.com/inconshreveable/ngrok.git
/ \0 |3 { |( V$ [* q& L& _. L7 e. B& W! ?% g% {& r7 B1 `
3. 编译; I* ]9 C. f2 i4 \6 Z
8 E$ _, y0 c! ], p; e6 j1 i: W
1). 配置环境变量
, ^) P+ B3 ?/ Q4 L. {5 o5 k; I
. M: E) y; {' j3 r. h3 f1 r, uexport NGROK_DOMAIN="tunnel.bbear.me" ! H ^) ^; Y; r5 A% _; n
tunnel.bbear.me替换成你自己的域名。 b- U0 t$ Z: u) x
% \( e0 i3 s7 u' e3 j# h/ V
2). 生成自签名ssl证书
3 K6 A- M9 }; |/ E7 t
0 Z: I7 p. G _+ B/ W/ v g" }6 I; Bcd ngrok+ e/ A! U6 C( Q9 s8 o" I! [
openssl genrsa -out rootCA.key 2048/ y: T3 ~4 P' q" c7 F9 v0 A
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
) @8 O8 J N* x0 `5 ?8 f$ e- \) @" Fopenssl genrsa -out device.key 2048
' ^( \, I7 _& ropenssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
: h; X7 J9 U5 l# lopenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
`& I' S% }# |6 r" _. fcp rootCA.pem assets/client/tls/ngrokroot.crt
; V1 U8 S0 n& j! fcp device.crt assets/server/tls/snakeoil.crt
, E% P$ G) @* ncp device.key assets/server/tls/snakeoil.key
/ P: C( u. J. u7 w9 v# A4 d, {* [# O" s8 f
设置变量:
- Z/ c' W3 {6 G
, X& {2 n% t, K9 bGOOS=linux GOARCH=amd64 #如果是32位系统,这里 GOARCH=386
% O! g) i0 W2 R生成服务端与客户端/ d: \0 w% ?4 P, z8 C0 a
! ]! n, q1 v& a$ m4 q- P4 N! y5 Vmake release-server release-client 2 K- y2 H1 i3 N0 L; @1 Y' y
$ @8 p3 Y7 w5 h* B: C; |+ F
注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址:
0 M' n, o4 N8 e9 q& u3 {/ H# r! d3 H8 Y* L& q- B2 E" Z6 _8 ?2 V
找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:"github.com/keepeye/log4go" 。. z2 N4 Q* a6 Z, ~; N9 r5 Z
_. {/ ] L6 `/ ^
编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。! b }5 ^" L3 N- ]( g8 d
% G* M- W4 c$ \! Z+ e4. 交叉编译生成windows客户端
# |( W4 H8 M4 v$ i* \上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。 交叉编译过程如下:
/ A. H* i7 _4 @
7 H4 q" e6 x! q( S, i$ X5 Q2 g进入go目录,进行环境配置
$ F8 {$ e! j0 }( Zcd /usr/local/go/src/4 T% M5 _' _0 w4 |
: T9 Z5 ~6 U* ?0 Z0 x
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash 4 J, j% f( {: t0 y
进入ngrok目录重新编译7 e+ s& N9 ^) w: T6 u- }( D
cd /usr/local/src/ngrok/9 e% [3 H: W, J6 Z' c+ x* ?8 f' ~
( |7 w [( G4 q/ u
GOOS=windows GOARCH=amd64 make release-server release-client
& U0 j) O6 {( h! }编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。
4 q- ^0 C W( {0 Q: ^5 @2 l- c% _; j3 ^8 c i: ^0 A
5. ngrokd服务启动与使用
5 r2 m" F n. O( [. r1、启动ngrokd服务端
) E( A% e+ p" e- c, {- Q$ w+ ?# n6 N, R( Y
bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
# c5 b- X6 O5 j, l4 e) G# v注意,让程序一直在后台运行可以执行
3 _8 o5 h3 ?# a! m$ m5 g. F# V! ?
5 a0 Y R3 h' ]6 P$ v$ x- ?7 q+ @" Z- gnohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &
- }+ q( y2 O8 Z1 W9 v- P R想要结束后台进程可以7 ? e$ `$ h$ B& s
- G. R% N3 J% I( C/ U
ps -A #找到PID - i/ j- A5 h' z
kill xxxid
( X& g3 E& x: j, `: Q! W% j2、启动ngrok客户端
/ m( _ u. m7 Q0 ^: Q! [" R- ?! t5 N/ k! ^# n1 I
客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置
N: V: M% O* d2 v! X
9 O3 w5 J0 V5 \7 l7 p3 Zserver_addr: "tunnel.bbear.me:4443" 3 f* V. L( C( V
trust_host_root_certs: false 3 ?- B. E5 H) r3 Z5 t
8 V" D5 S6 J9 ^4 O7 x& D再在windows控制台执行% N& A4 [. X# \; J) l
) l; N5 t0 X; M6 Yngrok -config=ngrok.cfg -subdomain upal 8080
/ x' ]+ S: `0 _& V5 n+ A- V/ h$ G: @0 o" C- m, {
upal是你自定义地址。
+ a4 K( M- Q' _- j4 l! H. D6 S看到这样一个界面就说明成功了
4 F7 ]+ \: m, F1 c4 J" n- S% r2 L/ a6 Z! N
如果是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同
7 P6 _5 x4 e8 Q3 f# f& k+ s' S; [% W4 w3 y2 J$ }6 J9 H
s5 W8 i0 b+ n2 N! b
! n* m" t$ H7 b* Z _1 @原文链接:http://bbear.me/shi-yong-a-li-yun-da-jian-zi-ji-de-ngrokfu-wu/?utm_source=tuicool&utm_medium=referral8 r; n9 p3 K R/ I
|