下面是我在阿里云centOS7上面的搭建过程。 
7 t( L& O. K( J# @! X- K 
: `9 T) w8 I/ K* G5 l1.go环境搭建 
2 \2 `* c2 A2 Z7 ?6 r3 @go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。 4 H/ I- v; ~  `3 q# A 
源码安装go的详细过程如下: 
: `- f& I8 K- o# f, V8 h8 a- q& D2 @ 
. B! m! T2 ~( Q& U0 [; w" y1).下载源码,可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-amd64.tar.gz。, I) P  a' D+ x7 V+ H0 Q 
 
5 L8 o) n* |( j: Q# t' Z2).将其解压到/usr/local目录下: 
# ?' ?$ {% @2 N5 Btar -C /usr/local  -xzf   go1.4.2.linux-amd64.tar.gz   
: m/ H( r0 c! t7 ]7 t; N/ q3 U# v" T3 S8 A! U 
注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。4 k+ C2 H' c. H' P4 J, ~8 n3 V 
 
$ x+ S- i  o) i( Y2 ]3). 在root环境下执行如下命令:+ ?+ N% L% D1 M$ C 
mkdir $HOME/go  - b7 u+ p; ~: Z# q 
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc   
9 e  ~- I4 H( h+ r% p; v2 i  ^echo 'export GOPATH=$HOME/go'>> ~/.bashrc   
6 u( a& J- W* f% [4 G4 iecho 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc  + p8 M$ D6 k4 v+ e& \( ] 
source  $HOME/.bashrc    a3 G# z2 r  n* w 
 
  [8 T9 t7 [+ T9 X* e* O$ f# k4). 安装go get工具 
6 y, E) D) G5 x4 l: a& h* dyum install mercurial git bzr subversion  % a" l! B0 }. O% F& U1 Q 
 
) m. ^. _* @9 H4 O" {, _2. 获取源码 
% T- D- O  P, Y8 Hgit版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。  
7 K' N$ S( O) {4 Q获取源码:  `# s1 O8 [8 O- s+ e+ X 
git clone https://github.com/inconshreveable/ngrok.git   
; v8 N' }& _& a0 O& n# p 
! h: X8 q* o7 a4 f6 S# {' q, u3. 编译 
# H+ Z# o/ d0 Z) O/ N" g1 X0 b0 A0 |  P3 z+ `( o 
1). 配置环境变量7 d- F# \( q/ h6 L; _+ f 
 
8 Y( @% V3 W6 ?0 Wexport NGROK_DOMAIN="tunnel.bbear.me"  ' M; A  B) L$ x 
tunnel.bbear.me替换成你自己的域名。  
& T) E9 [. r0 V" C8 S 
' ~1 k' @7 Q6 m& D" ?( w2). 生成自签名ssl证书 
/ h2 w' J1 Y) R/ l2 r" R6 Z( V, r' }* B# L6 n0 I' O 
cd ngrok 
2 v$ D4 F( w+ |6 G+ ^/ Oopenssl genrsa -out rootCA.key 20480 d2 W, |( I$ v* }+ _, V( M 
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem 
7 {# O: W: P# f& \- Q, b6 V0 Qopenssl genrsa -out device.key 2048 
# }9 f% d6 F$ b2 a( U$ wopenssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr 
5 c, E. \. X, O5 q" K1 D1 zopenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 50006 K0 y; T' Z9 {: g 
cp rootCA.pem assets/client/tls/ngrokroot.crt 
" L$ c6 h( k, v; icp device.crt assets/server/tls/snakeoil.crt. ^' q1 y  J$ P* F9 }! n0 { 
cp device.key assets/server/tls/snakeoil.key  : K, y8 e8 h  x% ?4 \ 
 
0 W2 f: Z$ L8 _! W: X设置变量:4 h: B/ ]# [" I' v4 _ 
 
' e) Q2 ?2 ]2 KGOOS=linux GOARCH=amd64  #如果是32位系统,这里 GOARCH=386    g& S7 n3 w, m) K3 O 
生成服务端与客户端8 T! y5 G8 [" V0 S" F. O 
0 C. r9 V) W% J* F6 m 
make release-server release-client  ) K7 P+ F' I2 w3 F. _ 
 
0 b* @6 t" L+ F1 q注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址: 
, g0 ?$ I! x0 A1 m! S$ N  e/ g7 i) E# P9 w8 v; Y 
找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:"github.com/keepeye/log4go" 。 
& x* n! a. a) o; ?1 t0 m" G- N. t' F$ \5 d2 ?5 l/ m 
编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。 
& v! |: r9 H( K) c: m2 H 
+ d) a" |$ I: J- |4. 交叉编译生成windows客户端 
( ?: F  _6 R+ ?( K0 c上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。 交叉编译过程如下:  Q% z2 ]  v9 Z& q3 Q2 z 
 
5 r0 O" I9 U% p% i# z进入go目录,进行环境配置 
( ~8 A. o2 F: Y: j$ @! Ucd  /usr/local/go/src/ 
6 @+ Y( a' Q8 I/ c6 M! s5 ]( G8 { 
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash  9 H2 w( W4 ~8 S 
进入ngrok目录重新编译/ H* P3 ^8 `: O 
cd  /usr/local/src/ngrok/+ j- W/ J! \# U5 U2 g 
# p9 G' n5 _7 N2 ] 
GOOS=windows GOARCH=amd64 make release-server release-client   
" K5 b7 Y  N" k* w- s+ }+ H编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。# D9 N. W0 Y& J0 u6 s 
& X  P' q% P4 H' \1 }/ D 
5. ngrokd服务启动与使用 
# i8 e  j, F  z1、启动ngrokd服务端0 \  A" n" |$ ^* |1 U 
 
* `: S; ~( j' z+ L! Z$ z2 K, Rbin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"   
* o+ [' K; @, J( o( K6 F注意,让程序一直在后台运行可以执行. P# T- S2 }% _0 u$ B. s( h: { 
$ j& m8 e/ r( _1 x. O; }. x0 F0 G 
nohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &   
1 U( r" d% Y0 a想要结束后台进程可以1 h; p8 {8 |1 ^5 | 
3 M7 G) U5 E6 [! r; G 
ps -A   #找到PID  ( o# W5 E) y3 }* ], q7 R 
kill xxxid  6 _. L1 `1 G+ T3 {- G8 V) c 
2、启动ngrok客户端5 h; R/ H1 V% X' | 
8 s3 O+ d  j7 d3 Z 
客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置6 V# n- B7 f2 U% G 
 
! X( R! y% t* U3 q/ X6 f+ y6 b5 hserver_addr: "tunnel.bbear.me:4443"  . }% S; T9 j5 T( t 
trust_host_root_certs: false  " y' u2 ~" J4 ~# ]( d/ R 
 
) ]% n5 S' v# V1 T再在windows控制台执行 
  ?+ q, x1 b: S7 @9 d 
5 L1 f0 J- W3 A4 d2 ?- cngrok -config=ngrok.cfg -subdomain upal 8080  $ L+ `+ [. @5 E0 ~/ L* B 
 
7 g2 u4 j) ^7 b$ W! @" Dupal是你自定义地址。 
% V2 h. G. s! u: \看到这样一个界面就说明成功了  
- @* p2 m4 U- m4 [9 D$ h( q3 z  T/ Y1 q7 f5 D; @6 T8 ~ 
如果是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同  
& Z2 ^" Y1 |" I2 I$ O 
! s# |6 K7 q. ?* ^- S  ~9 n" M/ W4 T/ T( l* E, o 
% D% e/ f, W1 ?& I5 I5 Z  |- ~ 
原文链接:http://bbear.me/shi-yong-a-li-yun-da-jian-zi-ji-de-ngrokfu-wu/?utm_source=tuicool&utm_medium=referral5 [2 P! f6 @. E# ]' Q" x$ V' P 
 |