ngrok內網穿透服務部署記錄

技術小能手發表於2018-11-12

ngrok,一個用於實現內網穿透服務,golang寫的,已經很久遠的一個東西了,可自己部署的版本最後一個版本是1.7.1,很久也沒更新了,但他還是比較穩妥的,基於自己生成openssl證照來編譯生成伺服器端和客戶端,還是具有一定程度的安全性。

一年前,其實已經部署起來了,還專門在碼雲上fork github的原始碼,將部署生成的指令碼做了一個分支:https://gitee.com/janpoem/ngrok-fork。最近因為要大量遷移主機,所以需要重新配置一次,因此這裡就作為一個記錄吧。

特別說明,基於他已經不會再更新了,所以還是不要用於正式釋出的環境,開發環境使用,完全足夠(一年下來,非常穩定,連重啟都沒試過)。

安裝go1.7.6

首先,最後這個版本的ngrok,必須使用go1.7.6(1.7的last版本),下載地址:https://dl.google.com/go/go1.7.6.linux-amd64.tar.gz。然後在你的linux上部署go,嗯,部署go不用我再寫說明了吧,go可能是這世上最容易部署的了。

好吧,還是寫寫,免得自己下次配置的時候忘記了:

tar zvxf go1.7.6.linux-amd64.tar.gz
mv go /usr/local/go1.7.6
mkdir /usr/local/gopath/go1.7.6
unlink /usr/bin/go  # 如果你的機器上裝了一個版本的go
ln -s /usr/local/go1.7.6/bin/go /usr/bin/go  # 先ln上,搞完再恢復就好,沒後遺症
nano ~/.bashrc

修改 ~/.bashrc 檔案,新增,或者暫時先改為如下:

export GOPATH=/root/gopath/go1.7.6
export GOROOT=/usr/local/go1.7.6

然後,更新一下

source ~/.bashrc

構建ngrok

然後,開始使用 ngrok-fork 的指令碼,基於他不再更新了,所以我已經把自己的指令碼分支作為預設分支了。

git clone https://gitee.com/janpoem/ngrok-fork.git
cd ngrok-fork

修改編譯的配置,可以有兩個選擇:

1. 直接修改 script/predef.sh

2. 建立 user 目錄,cp script/predef.sh user/my.sh ,修改my.sh

特別需要填寫 NGROK_DOMAIN ,也即用於作為內網穿透服務的域名。比如你希望以:xxx.my.example.com的方式訪問自己的PC的話,則 :

NGROK_DOMAIN="my.example.com"

其他需要修改的就是埠號:

DEPOLY_HTTP_ADDR=":8081"   # http 的埠號
DEPOLY_HTTPS_ADDR=":8082"  # https 的埠號
DEPOLY_TUNNEL_ADDR=":4443" # 本機到伺服器的(隧道)埠號

ok,配置好,ngrok.sh支援以下引數:

./ngrok.sh server  # 生成2048 bit ssl證照(如果已經執行過,並且存在ssl證照,則不會重新生成),並構建 ngrokd 
./ngrok.sh client  # 生成客戶端,出於某些原因,預設是隻生成windows_amd64版本
./ngrok.sh service # 生成ubuntu的 service 配置
./ngrok.sh on      # 服務啟用自動啟動
./ngrok.sh off     # 服務停用自動啟動

很簡單,很弱智吧。然後進入 bin 目錄,打包一下 windows_amd64 就可以分發出去了。

打包指令:

7z a w64.7z windows_amd64

什麼,你問怎麼啟動?

service ngrok start
service ngrok stop
service ngrok status

配置nginx

最簡配置:

server {
        listen          80;
        server_name     *.my.example.com;

        location / {
                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host:8081;
                proxy_redirect   off;
                proxy_pass       http://127.0.0.1:8081;
        }

}

美中不足的是,本地的PHP的話,HTTP_HOST還是會顯示8081埠,現在上網似乎只找到雙ip下的解決方案,我記得一年前似乎解決了這個問題,但現在已經完全不記得了(以後想起來再更新)。也罷,到此為止吧,留個記錄,以防下次到處找資料。


本文來自雲棲社群合作伙伴“開源中國”

本文作者:曾建凱

原文連結


相關文章