下面是我在阿里云centOS7上面的搭建过程。
2 a0 o6 b A. w6 M/ @9 ]: V. G$ h$ `
1.go环境搭建$ I u Q m, b6 Y
go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。 ) Q0 s. Z1 a* Y$ O7 e
源码安装go的详细过程如下:
' e2 b. @3 v* R9 z/ f1 d h, N& C2 m: k) |+ Z2 P! w) ^
1).下载源码,可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-amd64.tar.gz。
( ~& `& g1 o5 k ]
, z2 V3 ^+ g1 u2 g. I3 @# q z$ B2).将其解压到/usr/local目录下:
8 Y* O. i6 H" Ntar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz 5 R% m) I! t/ C( |( {+ @
' M: L$ C4 H: A; B9 O! L' v7 A) ^! F9 K注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。
/ N/ R! q/ o! P9 t! t
, Z/ j8 I" m. i% B o6 ]" I3). 在root环境下执行如下命令:; V# z9 J* T% r6 |3 e
mkdir $HOME/go : c, N, j- y* D) p4 H' k
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
! g: }& \% B. y& o, [echo 'export GOPATH=$HOME/go'>> ~/.bashrc 5 b$ H+ p T* y. _3 C4 O$ c9 f7 r! ~
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc $ S) o- q6 @' k( |8 @ h+ C/ ?& H
source $HOME/.bashrc 0 q& h/ A0 C, J$ J
0 W3 B9 y7 A/ e* M9 j) a" F
4). 安装go get工具
" s3 }* H6 O: j/ a u' \3 qyum install mercurial git bzr subversion 7 J7 m& q5 b9 E$ u8 i. {
6 M! Z; ~) u# s3 G% `
2. 获取源码# C. K" H* \ J& b
git版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。
' T5 a' b) Q. _0 A% |获取源码:$ {- p9 @) y; c2 F9 b- w
git clone https://github.com/inconshreveable/ngrok.git " ]1 @& B- r' w. c3 M% \! h
0 {3 M- {/ G$ x( P* {3. 编译: |; E' b) A* s! C( K- H
1 `1 i$ V* S% L( J+ y9 u1). 配置环境变量
9 F) s+ D9 i. a& E, P3 \, Z ?: w# U6 C, R# |" }$ Y1 d. m) Q; w9 p( }; p
export NGROK_DOMAIN="tunnel.bbear.me"
0 `. H+ i% \* o" ^0 ^tunnel.bbear.me替换成你自己的域名。
. c8 F9 t- U( Z1 w! m; q
/ M2 n) p' Y S! `* X2 C. G3 `( l2). 生成自签名ssl证书
# q. z2 d% }0 P) { Q
3 j" z; ]- F: M3 pcd ngrok( Y5 q8 \+ `1 p' U1 ^9 G. ?
openssl genrsa -out rootCA.key 2048
5 u; h1 B* {! r/ N3 e% Yopenssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
8 z& b1 Q4 p+ l* {0 q& Yopenssl genrsa -out device.key 2048
9 p& b$ {2 L0 Q+ nopenssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
0 U% Y ~; ?6 Y2 J' bopenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000* {" h* _& ?9 T0 d6 @
cp rootCA.pem assets/client/tls/ngrokroot.crt
, o8 E2 S5 ]- M* H4 o( C6 Ecp device.crt assets/server/tls/snakeoil.crt: P% I6 `0 Z, B! u0 i
cp device.key assets/server/tls/snakeoil.key 1 S1 a" v8 c2 j* [" p8 I4 V& u
( v2 e. l& I% r. a+ C设置变量:
, v* `& c& g9 X# Y) j
1 B' S) d# Z7 X1 }& VGOOS=linux GOARCH=amd64 #如果是32位系统,这里 GOARCH=386 . J) Y! u% S. b) Z# t) \1 d
生成服务端与客户端
+ ], C1 Z" B! k" ~7 n8 u9 z1 P! T& t6 z, I
make release-server release-client
5 }. Q' M$ O/ r# q2 D J; @( d5 b: A
注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址:: [2 w; h6 S* d$ Y& t
: h$ Z) k+ V" a8 `5 b, b
找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:"github.com/keepeye/log4go" 。. J, C4 [7 a" y# S+ h# b6 H: |
6 c+ p' n/ g% _* q9 J- U/ x3 c4 y编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。: ^' L6 k) D: H6 ~0 F
; p6 P# F( }/ D
4. 交叉编译生成windows客户端
6 @! y. `; b* h5 \/ w3 d上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。 交叉编译过程如下:
, V+ ~5 k+ q Q9 F4 X4 K" H$ y4 l- L; T: |* }8 l, f
进入go目录,进行环境配置+ P' \$ \6 j& N5 p( Y
cd /usr/local/go/src/3 g/ A5 v& Z' a5 ]- s( `/ e
6 y0 N/ E; i# j& z* ?
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash & ~$ E* d |5 B0 v# ?
进入ngrok目录重新编译
+ @) w: L5 T! gcd /usr/local/src/ngrok/7 i0 ?7 h& i4 R b
4 q9 u% ~+ u8 n3 Z/ T: F( f7 eGOOS=windows GOARCH=amd64 make release-server release-client ) h0 `0 q% k$ e# ^
编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。
$ E, {- e% M) K1 ^, k- P$ H% X& v* y! g4 ~- Y
5. ngrokd服务启动与使用
) i9 @- ~, V; `/ {0 h1、启动ngrokd服务端9 n7 Z; Y0 K* X+ O
1 m' {) i0 F |' k2 jbin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
* r. ~5 j+ K7 `9 q, Y) n5 ~) `注意,让程序一直在后台运行可以执行
) t+ x3 Q: R- q# }" M: V& L0 K4 R& o$ t
nohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &
# B, C7 l' M8 q+ ^, d8 [. L: g3 p4 H想要结束后台进程可以
* R O1 J5 I/ E) O% q: } O
% G$ u/ h6 v' r! a+ P) Ips -A #找到PID
# C6 T* u$ x" [) f' I& z, i) \0 Y" M7 W; Skill xxxid
- r2 L: G/ ]5 T9 G2、启动ngrok客户端
2 P& s7 l6 A4 J9 t3 O8 a
; {( J$ H% Q. T) j! `4 ~( P) ^客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置
& c3 p" o( e& U% t- [2 A6 R1 l( n* m" Z% P2 v
server_addr: "tunnel.bbear.me:4443"
7 @% d6 k6 c, e: \trust_host_root_certs: false ) @3 s0 f# |1 z; f* B
- B, ]8 Z; o3 ^$ n, U$ @再在windows控制台执行9 t- r: T' o2 d
! Z5 o3 l) m- T0 C, ^ngrok -config=ngrok.cfg -subdomain upal 8080 2 R$ U" _8 }$ a' K2 U* {- H
9 t, K7 i( o: W, Rupal是你自定义地址。+ Z' D; M7 k4 b- {. `
看到这样一个界面就说明成功了
) b7 G! k Z- T. w1 Y# ^6 V- N8 m& V& Z9 \' t1 U" N+ l
如果是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同 % p6 n& M9 l8 N7 R2 S6 G
- \9 [. ~% ^5 B. ^9 y: U; D' U; T5 w" z C
' h# C1 f+ g" }0 m, n
原文链接:http://bbear.me/shi-yong-a-li-yun-da-jian-zi-ji-de-ngrokfu-wu/?utm_source=tuicool&utm_medium=referral
6 j5 Q7 O2 [: ~ |