下面是我在阿里云centOS7上面的搭建过程。
: k! v$ w/ x! T; i. c/ ~
* p- B# O: B) [1.go环境搭建
" N9 T D. u' H, e* o" x6 Jgo环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。
& h5 W. @' z K# \: R源码安装go的详细过程如下:
1 y. y# x4 H. Z0 y, u9 w5 h+ W2 ?
5 y1 J5 y5 {9 Q" D0 C) k- A: Q1).下载源码,可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-amd64.tar.gz。+ [* y" W$ u" t3 b6 {+ d2 S. `8 g
) o: B: b4 ~$ _* |, h; X L0 g$ Q! B
2).将其解压到/usr/local目录下:
8 W/ g% {5 Q- s( |( x8 wtar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz 4 P; t6 p4 J! J7 z U6 v
0 E4 r3 O$ X( c- W注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。
2 C* I1 S9 y& ^+ T' A g4 C' V$ c. G' G5 X# I
3). 在root环境下执行如下命令:
7 _& `6 Y- o' q3 k: q7 D d: umkdir $HOME/go V9 F. Q6 N) E/ W3 C9 @
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc ; q0 d, y% c4 e0 _
echo 'export GOPATH=$HOME/go'>> ~/.bashrc 7 V: K. L$ s7 W" y
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
# E0 u/ Q7 D% C" Z6 t8 t/ gsource $HOME/.bashrc
# |' K* [$ d2 {: O
) R' B0 z, Z1 c) B" ^/ G4). 安装go get工具
$ M, U2 d4 T E0 uyum install mercurial git bzr subversion 5 \$ b4 F1 N- H8 v
9 o6 c2 Z" E, i
2. 获取源码
5 k2 N; K; O7 s4 B/ Q. |git版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。
$ W n# [8 L# e/ b- k" ~获取源码:
0 P$ L! m% u( u4 Hgit clone https://github.com/inconshreveable/ngrok.git 6 A2 W- U' t* P( ~
o2 f2 U9 H$ e+ ?
3. 编译3 E+ d8 y! G! N" W- S9 l* x
+ [4 P4 E3 P- s+ e, L+ j
1). 配置环境变量
4 {9 c2 R9 [: ]7 J
" J5 N: _+ L( y) z9 B% s, ~" P6 u7 Xexport NGROK_DOMAIN="tunnel.bbear.me"
1 }# o2 ~8 Q9 K7 [ I- m6 z1 d" W, Stunnel.bbear.me替换成你自己的域名。 ! U) ~" c# t' Z; T% c
0 v8 V8 O, J; Y" b. B7 Y2). 生成自签名ssl证书
/ \8 O7 @* @* Z; B
: Q# n( e( J, |cd ngrok
. Y5 c% s0 Q0 U8 Eopenssl genrsa -out rootCA.key 2048
# I _& l% s% t3 W" dopenssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
# U8 b8 D3 P7 a& q( dopenssl genrsa -out device.key 20482 o" i% h3 _& }" a% ^
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr& F; |! V7 d, q1 H# r, c& n* k) T; o
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
) F* x8 L# K9 D; F6 Ocp rootCA.pem assets/client/tls/ngrokroot.crt
3 K% V) C5 w; X, e# i: |cp device.crt assets/server/tls/snakeoil.crt
- y: ^, l8 U9 g- fcp device.key assets/server/tls/snakeoil.key / n, \! b" w V0 _7 q* f! A% ^
% h, f9 q- Y: U; H: W2 @5 D
设置变量:
+ j3 j: s8 _4 M* H8 t3 I8 c% D
8 h+ c) w( o# g' CGOOS=linux GOARCH=amd64 #如果是32位系统,这里 GOARCH=386
5 R, \6 g" W# k5 t; [生成服务端与客户端/ G2 V& h V5 b- ]( Z7 c$ v
9 N1 x, V* R9 {) pmake release-server release-client
, a$ }& z1 I& |( O7 Y$ @2 W; e8 V, ]) f. J1 n# p
注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址:# V' b' E4 s$ N% V0 O1 H2 ?
% m- e) N' I& {找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:"github.com/keepeye/log4go" 。
/ O; R9 L2 ]! p) a8 h* q i7 @! k
编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。0 }" V+ `( l! m& C) }8 M/ y
. {5 Z6 Z+ A2 i& `) c4. 交叉编译生成windows客户端
7 J: t }' C5 w4 N; R% I4 z上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。 交叉编译过程如下:3 f9 Z" S# u' f# X
1 _. e' B* b8 i
进入go目录,进行环境配置
2 A1 |! @; s+ \$ Y3 r% n3 n* i- ocd /usr/local/go/src/, ~1 u9 n% |. k: L
t' X& f( M- p' J" T/ d; l2 H+ DGOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash & ?! s2 h8 H0 n0 s* B
进入ngrok目录重新编译8 Z5 M2 k/ g* k1 f* N0 X& i
cd /usr/local/src/ngrok/. @8 |5 T" @1 i$ L' }: u m
: g) w5 T( C5 [$ L$ v
GOOS=windows GOARCH=amd64 make release-server release-client
! a; s/ t, W& r$ j3 g0 d. n# s+ h编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。
! Q8 E; X6 `0 Z) Q1 B; t
! U0 W/ E7 ~7 ]: K" Z5. ngrokd服务启动与使用( C+ ~# [. R( \! c6 D" u M, X' Z
1、启动ngrokd服务端, _3 C3 L* Q/ C- p* R. M
2 X) n0 M& L; P }9 K+ Qbin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
3 H: H8 a$ F; [! e) ?& A注意,让程序一直在后台运行可以执行
( A6 _+ y( a/ P2 A. ?" s2 X! }; Y U' G# ]- o2 K' S2 V, {* P, n9 O
nohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &
0 c7 j( G5 S4 O, v想要结束后台进程可以2 k" E& a# U9 K
) @1 w9 R9 h9 h) ^. K8 ]ps -A #找到PID 2 J+ x, b% C8 r* x% U
kill xxxid - L0 w# Z+ I# w9 j8 H
2、启动ngrok客户端
: A N& E6 F8 |# ?- r# d
/ |. F8 n8 v3 f9 X" L7 L客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置7 F$ t/ V. a* I+ ?
3 D5 ]* k# X0 v7 k* _3 h- ?
server_addr: "tunnel.bbear.me:4443" % ?5 t8 ]/ C$ i, x9 U% Y
trust_host_root_certs: false
8 j" H; o" k2 e4 I! J( m
. N1 L& ]. X0 `再在windows控制台执行4 |, K% L$ n+ a/ ~" R# i
9 R9 ^% i0 S2 ?6 Y2 R2 p& e
ngrok -config=ngrok.cfg -subdomain upal 8080 x% O5 I6 m- d1 l4 O7 E
" X' `& d+ M) n& L( n! Rupal是你自定义地址。- V) ? }* [( ~# V' t4 E; |0 {' O
看到这样一个界面就说明成功了 ! @2 |3 l9 t7 U, I
7 f0 r) H$ F3 ?) O8 T( H
如果是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同 : _8 j1 e' w; V- A l
$ G& K: K/ B% x+ V
2 c$ p/ A& B( J' B4 g8 Y, U! u5 w/ V# S4 U
原文链接:http://bbear.me/shi-yong-a-li-yun-da-jian-zi-ji-de-ngrokfu-wu/?utm_source=tuicool&utm_medium=referral& h2 a# [7 @8 F& }# l- @5 q
|