Debian 搭建ngrok

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://localhosthttp://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文件. 具體可以看參考文章.

參考文章:

  1. Ngrok搭建服務(wù)器
  2. 搭建 ngrok 服務(wù)實(shí)現(xiàn)內(nèi)網(wǎng)穿透
  3. 搭建ngrok服務(wù)器及跨平臺(tái)客戶端內(nèi)網(wǎng)穿透的使用
  4. ngrok 服務(wù)器端開機(jī)啟動(dòng)運(yùn)行
  5. ubuntu安裝ngrok并使用nginx代理
  6. Nginx 錯(cuò)誤[emerg] “server” directive is not allowed here的可能情況
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 33,018評(píng)論 24 1,002
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評(píng)論 19 139
  • 需要先安裝go環(huán)境設(shè)置環(huán)境變量12345 # 可以根據(jù)自己需要調(diào)整路徑 echo 'export GORO...
    加菲貓Jack閱讀 2,108評(píng)論 3 1
  • ----葉孤騰 一個(gè)人說走就走的旅行就像在跟自己賭氣 又像是得了一種在寂寞人群里流行的古怪的病 現(xiàn)在不明白這世間是...
    葉孤騰閱讀 498評(píng)論 0 1
  • 少年攜筆志凌云,天風(fēng)海雨吟嘯行 誓寫世間冷暖事,欲言天涯離人心 岱宗萬仞決碧霄,滄海無量起驚潮 歸去猶能慷慨笑,笑...
    踏歌涉川閱讀 396評(píng)論 3 0

友情鏈接更多精彩內(nèi)容