1. 編譯ngrok
網(wǎng)絡(luò)上的教程大多是自己編譯 git 和 go, 而且 go1.4 以上的版本還需要用 go1.4 來編譯, 要先裝gcc來編譯 go1.4, 然后再用 go1.4 編譯更新的版本.這就顯得很坑了.
Debian8 軟件源里的go版本是 1.3.3, git 版本 2.1.4, 這兩個(gè)都不算太高. 我平時(shí)不會(huì)用到 go 語言, git 版本也不需要太高, 能支持 GitHub 就可以了. 所以就不自己編譯, 不想瞎折騰, 能用上 ngrok 就可以了.
1.1 我的 VPS 系統(tǒng)是 Debian8, 首先裝必要的工具:
sudo apt-get install build-essential golang mercurial git
ngrok 是用 go 語言寫的, 所以 golang 是必須要裝的. 安裝 git 是為了從GitHub上下載 ngrok 的源碼自己編譯. mercurial 百度說是版本控制用的. 這是個(gè)坑, 之前沒安裝 mercurial 到了編譯 golang 和 ngrok 時(shí)老是報(bào)錯(cuò). 糾結(jié)了好幾天都沒有搞定, 后來上GitHub看開發(fā)者的readme才知道的.
1.2 獲取 ngrok 源碼:
cd /usr/local
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok
1.3 生成證書
生成并替換源碼里默認(rèn)的證書. 注意域名修改為自己的.(之后編譯出來的服務(wù)端客戶端會(huì)基于這個(gè)證書來加密通訊, 保證安全性)
export NGROK_DOMAIN="ngrok.mydomain.com"
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 server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
在軟件源代碼目錄下面會(huì)生成一些證書文件, 我們需要把這些文件拷貝到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
如果是在國內(nèi)的服務(wù)器需要執(zhí)行此步, 香港或者國外的服務(wù)器不需要
vim /usr/local/ngrok/src/ngrok/log/logger.go
log "github.com/keepeye/log4go"
1.4 開始編譯服務(wù)端:
make release-server
1.5 編譯客戶端:
這里我們需要交叉編譯, 使用不同的編譯選項(xiàng)來選擇編譯以后生成的平臺(tái)
這里我主要是生成了 windows, arm 和 Linux 的版本. 繼續(xù)在原先的目錄下:
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
不同平臺(tái)使用不同的 GOOS 和 GOARCH, 前面的編譯選項(xiàng)GOOS就是指編譯出來的操作系統(tǒng) (windows,linux,darwin) ; GOARCH是指對(duì)應(yīng)的構(gòu)架 (386,amd64,arm)
Linux 平臺(tái) 32 位系統(tǒng): GOOS=linux GOARCH=386
Linux 平臺(tái) 64 位系統(tǒng): GOOS=linux GOARCH=amd64
Windows 平臺(tái) 32 位系統(tǒng): GOOS=windows GOARCH=386
Windows 平臺(tái) 64 位系統(tǒng): GOOS=windows GOARCH=amd64
MAC 平臺(tái) 32 位系統(tǒng): GOOS=darwin GOARCH=386
MAC 平臺(tái) 64 位系統(tǒng): GOOS=darwin GOARCH=amd64
ARM 平臺(tái): GOOS=linux GOARCH=arm
如果一切正常, ngrok/bin 目錄下應(yīng)該有 ngrok, ngrokd 等文件. 其中ngrokd是服務(wù)端, ngrok是客戶端.
通過前面的步驟, 就會(huì)在 bin 目錄里面生成所有的客戶端文件, 客戶端平臺(tái)是文件夾的名字. 客戶端放在對(duì)應(yīng)的目錄下, 當(dāng)前 Linux 平臺(tái)客戶端在bin目錄. 然后我們就可以打個(gè)包, 把所有文件下載到自己的本機(jī)了.
2 運(yùn)行并測(cè)試
2.1 啟動(dòng)服務(wù)器端 ngrokd
這個(gè)很簡(jiǎn)單, 首先執(zhí)行VPS上的服務(wù)器端 ngrokd, 這里的 8080 指的是服務(wù)器啟用 8080 端, 就是說內(nèi)網(wǎng)穿透后的域名為 xxx.ngrok.mydomain.com:8080. 如果在 80 端口未作他用的情況下, 也可將 8080 端口改為 80, 這樣更方便些. 而如果我們 VPS 的 80 端口被占用了, 但是我們還想用 80 端口作為服務(wù)端口, 那么可以使用 nginx 做一個(gè) xxx.ngrok.mydomain.com 的反向代理.
#執(zhí)行 ngrokd
/usr/local/ngrok/bin/ngrokd -domain="ngrok.mydomain.com" -httpAddr=":8080"
2.2 寫客戶端配置文件
在 ngrok.exe 所在目錄下建立文件 ngrok.cfg, 用記事本等文本編輯器寫入以下內(nèi)容并保存.
#配置文件 ngrok.cfg 的內(nèi)容
#
server_addr: "ngrok.mydomain.com:4443"
trust_host_root_certs: false
2.3 映射 HTTP
之后打開 Windows 服務(wù)器,這里以 80 端口為例。打開命令提示符,切到 ngrok.exe 所在目錄,并執(zhí)行以下命令。
# 啟動(dòng) ngrok 客戶端
# 注意:如果不加參數(shù) -subdomain=test,將會(huì)隨機(jī)自動(dòng)分配子域名。
#
ngrok -config=ngrok.cfg -subdomain=test 80
正常情況下,客戶端上會(huì)顯示以下內(nèi)容,表示成功連接到服務(wù)器端。
# 客戶端ngrok正常執(zhí)行顯示的內(nèi)容
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://ngrok.dingdayu.com:8080 -> 127.0.0.1:80
Forwarding https://ngrok.dingdayu.com:8080 -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
打開瀏覽器, 分別在地址欄中輸入 http://localhost 和 http://test.tunnel.mydomain.com:8080, 如果后者正常顯示并且和 http://localhost 顯示的內(nèi)容相同, 則證明我們已經(jīng)成功了.
2.4 映射TCP
# 這里以SSH連接Linux時(shí)的22端口為例
./ngrok -proto=tcp 22
映射成功的話,會(huì)顯示如下內(nèi)容:
# 客戶端ngrok正常執(zhí)行顯示的內(nèi)容
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding tcp://ngrok.dingdayu.com:49805 -> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
現(xiàn)在, 在 putty 等 ssh 工具中即可連接 tunnel.mydomain.com. 切記端口是號(hào) 49805, 是隨機(jī)分配的一個(gè)端口號(hào), 而不是默認(rèn)的 22 端口了.
Windows 的遠(yuǎn)程桌面可以將其映射到 3389 端口來實(shí)現(xiàn). 同理, 如果要做 MySQL 的遠(yuǎn)程連接, 只需映射 3306 端口即可. FTP可映射21端口.
3. 定制個(gè)人信息
通過以上操作, 我們的 ngrok 服務(wù)器就已經(jīng)成功搭建了, 客戶端也成功的跑了起來. 但是, 如果我們想要對(duì) ngrok 進(jìn)行一些定制和優(yōu)化, 可以參考這些后續(xù)定制及優(yōu)化的方法.
3.1 修改客戶端 ngrok 默認(rèn)服務(wù)地址
客戶端每次還需要加載配置文件, 這樣顯得有些麻煩. 能不能像官方服務(wù)那樣直接執(zhí)行命令 ngrok 80 就能使用呢? 我們只需要在編譯客戶端之前, 稍作修改即可. 同樣, 如果需要指定域名可以執(zhí)行命令 ngrok -subdomain=test 80 來運(yùn)行客戶端.
# 修改默認(rèn)服務(wù)地址
vim ./src/ngrok/client/model.go
# 找到第23行,將
defaultServerAddr = "ngrokd.ngrok.com:443"
# 修改為defaultServerAddr = "ngrok.dingdayu.com:4443" 即可
3.2 修改客戶端 ngrok 左上角藍(lán)色文字 logo
運(yùn)行客戶端后, 我們會(huì)發(fā)現(xiàn)在客戶端左上角會(huì)有一個(gè)藍(lán)色字體的 “ngrok” 字樣的文字 logo, 如果覺得不太喜歡, 或者想修改一下的話, 可以在編譯客戶端之前, 作如下修改.
# 修改客戶端藍(lán)色文字logo
Vim ./src/ngrok/client/views/term/view.go
找到第 100 行, 將
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
修改為
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
3.3 修改客戶端幫助信息
ngrok 客戶端默認(rèn)的幫助信息很少, 我們可以在編譯客戶端之前, 自己定制幫助內(nèi)容.
# 修改客戶端默認(rèn)幫助信息
vim ./src/ngrok/client/client/cli.go
找到第 14 行, 修改const usage2 string的值即可.
4. 后續(xù)優(yōu)化
4.1 ngrok 服務(wù)器端開機(jī)啟動(dòng)運(yùn)行
4.1.1 在 ngrok 安裝目錄下創(chuàng)建啟動(dòng)腳本 start.sh
/usr/local/ngrok/bin/ngrokd -domain="ngrok.mydomain.com" -httpAddr=":8080" -httpsAddr=":443"
后臺(tái)運(yùn)行
nohup /usr/local/ngrok/bin/ngrokd -domain="ngrok.mydomain.com" -log="ngrok.log" -httpAddr=":8080" &
更改腳本文件權(quán)限
chmod 755 start.sh
4.1.2 編寫 ngrok 開機(jī)啟動(dòng)腳本
新建腳本文件
vim /etc/init.d/ngrok
編輯腳本內(nèi)容
#!/bin/sh
### BEGIN INIT INFO
# Provides: ngrok
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the ngrok Proxy.
### END INIT INFO
ngrok_path=/usr/local/ngrok
case "$1" in
start)
echo "start ngrok service.."
sh ${ngrok_path}/start.sh
;;
*)
exit 1
;;
esac
更改文件權(quán)限
cd /etc/init.d
chmod 755 ngrok
4.1.3 注冊(cè)開機(jī)啟動(dòng)
cd /etc/init.d
update-rc.d ngrok defaults 90
此處有坑,用putty時(shí)不會(huì)報(bào)錯(cuò). 但是我在linuxmint下用ssh時(shí)會(huì)出現(xiàn)perl報(bào)錯(cuò)的情況. 這是linuxmint上的語言環(huán)境用的是utf-8_zh,但是vps用的是utf-8_en. 我懶得修改系統(tǒng)的語言, 所以建議用putty遠(yuǎn)程.
4.2 nginx代理
我vps的80端口已經(jīng)被nginx用了, 所以ngrok無法再使用80端口, 只能用nginx, 那么直接反向代理走起~~.
安裝nginx: apt-get install nginx
在 /etc/nginx/conf.d 目錄下創(chuàng)建一個(gè)新的配置文件ngrok_proxy.conf, 輸入:
server {
server_name *.ngrok.mydomain.com;
listen 80;
keepalive_timeout 70;
proxy_set_header "Host" $host:8080;
location / {
proxy_pass_header Server;
proxy_redirect off;
proxy_pass http://127.0.0.1:8080;
}
access_log off;
log_not_found off;
}
檢測(cè)語法是否有錯(cuò):
nginx -t -c /etc/nginx/nginx.conf
然后重啟nginx就可以了: nginx -s reload
之前對(duì)語法檢測(cè)的對(duì)象理解有誤. 要檢測(cè)現(xiàn)有的修改過的Nginx配置是否有錯(cuò)誤, 不是單單檢測(cè)那個(gè)修改過的擴(kuò)展的 .conf 文件, 而是不管任何時(shí)候, 始終都是去檢測(cè)主文件 /etc/nginx/nginx.conf, 只有這樣, 才能順利的在對(duì)應(yīng)的模塊加載擴(kuò)展的.conf文件. 具體可以看參考文章.
參考文章: