這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
相信搞過開發、小程式的同學都踩過調試的坑,那種線上折騰通常能讓你憋上一口老痰。當然你也可以找其他的方式進行內網轉寄,比如用QQ瀏覽器、別人已經搭建好的轉寄服務、使用
ssh+nginx
。這這幾種我都使用過,為了省時間你值得擁有。但是最近看了
ngrok
的源碼,基於
golang
,那我就來勁了,因為我最近剛好在折騰
golang
網路這一塊的內容。所以就自己來吧
前提
1.記得看標題啊,我採用的是aws
,所以意思你必須有一個伺服器,必須有公網ip
。
2.再有就是你要有一個網域名稱,如果你使用過別人提供的ngrok
,就知道,別人都採用第三層網域名泛解析的方式。所以希望你有一個自己的網域名稱。不然沒辦法走下去了。
3.環境:redhat7.3
必要工具
yum install -y mercurial git vim wget
這個mercurial
是ngrok
強制要求的。
安裝golang
# 下載`go` cd /usr/localwget https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz# 解壓 tar -zxvf go1.10.linux-amd64.tar.gz -C /usr/local/ # go的命令需要做軟串連到/usr/bin ln -s /usr/local/go/bin/* /usr/bin/
設定go
環境
#安裝go語言的安裝環境yum install mercurial bzr subversion -y#建立go目錄作為項目目錄mkdir -p $HOME/go#用cat的方法在尾部增加golang的環境:GOROOT GOPATH#下面這段,整段複製粘貼過去cat >>$HOME/.bash_profile<<EOFexport GOROOT=/usr/local/go export GOPATH=\$HOME/goexport PATH=\$PATH:\$GOROOT/binEOF#讓配置生效source $HOME/.bash_profile
檢查一下go
的env
環境變數:
go env
看到GOPATH
,GOROOT
就可以了
ngrok 配置
下載:
cd /usr/local/ git clone https://github.com/inconshreveable/ngrok.git
設定環境變數:
export GOPATH=/usr/local/ngrok/ #這裡寫你自己的網域名稱,建議你用次層網域,比如你有個網域名稱為:baidu.com,那麼這裡就可以為:ngrok.baidu.com. export NGROK_DOMAIN="ngrok.xxx.com"
當然你會問,為什麼不直接使用baidu.com
,而是用ngrok.baidu.com
.如果你有限制的網域名稱的話,當然是可以直接使用baidu.com
的。
產生認證:
cd /usr/local/ngrokopenssl genrsa -out rootCA.key 2048 #NGROK_DOMAIN 就是你上一步的步驟設定的網域名稱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
拷貝認證覆蓋ngrok原來的認證:
過程會讓你輸入y 斷行符號cp rootCA.pem assets/client/tls/ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt cp server.key assets/server/tls/snakeoil.key
產生服務端:
cd /usr/local/ngrok/ make release-server#這一步可能會出錯的,我之所以會寫這篇文章,是因為這個地方出現了好幾次錯誤,容易崩潰
如果順利的話,產生的服務端在/usr/local/ngrok/bin
下ngrokd
檔案.希望你可以一步到位
可能有的錯誤:
bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/client/assets/assets_release.go \ assets/client/... bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/server/assets/assets_release.go \ assets/server/... go get -tags 'release' -d -v ngrok/... go install -tags 'release' ngrok/main/ngrokd go install: cannot install cross-compiled binaries when GOBIN is set make: *** [server] Error 1
解決方案:
cd /usr/local/ngrokmkdir bin cp $GOBIN/go-bindata bin/ unset GOBIN
這裡說明一下,預設下go get
把go-bindata
下載到GOBIN
目錄中了,所以你要把go-bindata
複製到ngrok
的bin
目錄中,但是預設是沒有這個bin
目錄的。
產生用戶端:
我用的是mac系統,所以我只產生mac ngrok用戶端,window的產生方法,可以參考底下參考文章
cd /usr/local/ngrok/ GGOOS=darwin GOARCH=amd64 make release-client #然後就是等待下載了,沒有進度條,耐心等待。#產生的在/usr/local/ngrok/bin/darwin_amd64 #都在bin下,服務端是ngrokd 用戶端是ngrok
到這一步基本算是安裝完成了。
啟動服務端
這裡為了方便我直接就用80連接埠了,請確認你的80連接埠沒有被佔用,關閉相應的服務。
後面要想用,建議使用nginx反向 Proxy到ngrok。
cd /usr/local/ngrok/bin./ngrokd -domain="xxx.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"#-domain後面你上面寫的網域名稱,如上面寫的:ngrok.baidu.com -httpAddr http連接埠 -httpsAddr https 連接埠 預設為:443#-tunnerlAddr 用戶端連接埠,串連連接埠,預設為:4443
啟動用戶端
先將伺服器產生的用戶端
ngrok
下載到本地,aws下載的命令如下(不是aws,就用scp就可以了):
scp -i "aa.pem" ec2-user@ec2-34-201-46-244.compute-1.amazonaws.com:/usr/local/ngrok/bin/darwin_amd64 /ngrok
然後同目錄下建立檔案ngrok.cfg 設定檔:
server_addr: "ngrok.xxx.com:4443" #你上面自己寫的網域名稱,如ngrok.baidu.comtrust_host_root_certs: false #目錄下開啟命令列./ngrok -config=./ngrok.cfg -subdomain=blog 80 -log=ngrok.log#這裡subdomain後面是你的第三層網域名首碼,你可以改#注意要在網域名稱解析裡添加第三層網域名解析#最好添加一個log, 不然出錯了,容易一臉懵逼
這樣就可以了,然後在訪問blog.ngrok.xxx.com
就可以訪問了。
網域名稱解析
可能有些小夥伴沒有怎麼解析過第三層網域名。這裡就短暫說一下。
首先把你的次層網域解析到aws
的ip上,如
再添加一個第三層網域名解析:
這樣就可以了,其實還是比價簡單的。
特別提醒
如果你是新的伺服器,比如aws
,預設有些連接埠是沒有開啟的(去安全性群組設定就好了)。所以你上面如果採用了其他的連接埠,先確定是否可用。不信的話你去telnet
4443
連接埠試一下。還有網域名稱解析是否好了,能否ping
通,可能你搭建環境是沒有問題的,但是解析錯了,那就悲劇了。
telnet ngrok.baidu.com 4443ping ngrok.baidu.com
aws 如果是自己免費申請的,不用的時候記得關閉,不然逾時那也要掏錢的。
參考文章
https://github.com/inconshrev...
https://blog.csdn.net/yjc_111...
https://blog.csdn.net/gebitan...
https://blog.csdn.net/qq_3656...
https://segmentfault.com/a/11...