【內(nèi)網(wǎng)穿透】相信很多同學(xué)沒有遇到,但做微信開發(fā)時钞护,需要接收微信服務(wù)器的消息就必須配置在線域名枢里,最簡單的辦法是用ngrok工具,它可以將本地服務(wù)映射到公網(wǎng)额获,但免費版本有很多不便,自己搭建服務(wù)爽播演!
前提條件
一臺云服務(wù)器,一個域名(二級域名也可以),并且域名正確解析到云服務(wù)器
環(huán)境配置
yum install -y gcc git
## go語言
wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf go1.8.linux-amd64.tar.gz
添加環(huán)境變量,編輯:vi /etc/profile蹬挤,在最后添加:
#go lang
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
使環(huán)境變量生效:
source /etc/profile
檢查是否安裝成功:
go version
在服務(wù)器上搭建Ngrok服務(wù)
下載ngrok源碼
cd /usr/local/src
git clone https://github.com/inconshreveable/ngrok.git ngrok
環(huán)境變量配置
vim /etc/profile
#這里修改為自己的域名
export NGROK_DOMAIN="uboff.com"
配置完成后,可以使用env
命令查看是否生效调鲸。
生成證書
在自生成證書時需要一個解析到服務(wù)器上的主域名(二級域名也可以盛杰,本人已經(jīng)驗證過),現(xiàn)在以”uboff.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 device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
將新生成的證書藐石,替換掉assets/client/tls下的證書
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
編譯生成ngrokd(服務(wù)端)
#這里是交叉編譯即供,linux系統(tǒng)GOOS=linux,64位系統(tǒng)GOARCH=amd64,32位系統(tǒng)GOARCH=386
#當前系統(tǒng)可用go env查看
GOOS=linux GOARCH=amd64 make release-server
編譯過程中可以會報依賴加載失敗贯钩,這是網(wǎng)絡(luò)原因?qū)е履伎瘢啻螄L試下載直到完成編譯。
啟動服務(wù)端(/usr/local/src/ngrok目錄下)
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":8071" -httpsAddr=":8072" -tunnelAddr=":8073"
參數(shù)說明:
#-domain 訪問ngrok是所設(shè)置的服務(wù)地址生成證書時那個
#-httpAddr http協(xié)議端口 默認為80
#-httpsAddr https協(xié)議端口 默認為8072
#-tunnelAddr 通道端口 默認8073
出現(xiàn)下面信息角雷,啟動成功
注意:啟動服務(wù)所需要的端口一定要先開放;銮睢!勺三!
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8081
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:8082
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:8083
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
編譯生成ngrok(客戶端)
我這里生成windows下的客戶端
為go生成交叉編譯環(huán)境雷滚,執(zhí)行如下命令:
#這里是交叉編譯,linux系統(tǒng)GOOS=linux,64位系統(tǒng)GOARCH=amd64吗坚,32位系統(tǒng)GOARCH=386
#當前系統(tǒng)可用go env查看
GOOS=windows GOARCH=amd64 make release-client
#Linux 平臺 32 位系統(tǒng):GOOS=linux GOARCH=386
#Linux 平臺 64 位系統(tǒng):GOOS=linux GOARCH=amd64
#Windows 平臺 32 位系統(tǒng):GOOS=windows GOARCH=386
#Windows 平臺 64 位系統(tǒng):GOOS=windows GOARCH=amd64
#MAC 平臺 32 位系統(tǒng):GOOS=darwin GOARCH=386
#MAC 平臺 64 位系統(tǒng):GOOS=darwin GOARCH=amd64
#ARM 平臺:GOOS=linux GOARCH=arm
成功會在bin目錄下看到windows_amd64文件夾祈远,復(fù)制到windows電腦上即可啟動
內(nèi)網(wǎng)穿透
在windows_amd64目錄下新建一個ngrok.cfg文件,內(nèi)容如下:
注意:server_addr要與服務(wù)端一一對應(yīng)I淘础3捣荨!
server_addr: "xxx.com:8073"
trust_host_root_certs: false
tunnels:
http:
subdomain: "test"
proto:
http: "8090"
http2:
subdomain: "test2"
proto:
http: "8010"
https:
subdomain: "test"
proto:
https: "8091"
ssh:
remote_port: 2222
proto:
tcp: "22"
log: 'out.log'
然后就可以啟動客戶端,我已經(jīng)把windows_amd64文件夾下載到D盤下牡彻,打開CMD輸入:
多種啟動方式扫沼,第一種方式可以啟動多個指定隧道出爹,第二種方式只有默認隧道(http/https)
下面的命令啟動多個隧道,調(diào)試時還可以加上日志
ngrok.exe -log=out.log -config=ngrok.cfg start http https ssh
or
下面會在域名前添加子域前綴
ngrok.exe -config=ngrok.cfg -subdomain=ngrok 8090
會遇到以下錯誤:
control recovering from failure dial tcp: lookup xxx.com: no such host
此時需要配置本機hosts(c:\windows\system32\drivers\etc)缎除,如下:
如果不配置hosts严就,本地的ngrok就無法識別。
42.192.22.11 xxx.com
再次執(zhí)行器罐,看到下面信息則啟動成功:
打開http://www.xxx.com:8081即可看到成功打開梢为,到此Ngrok服務(wù)搭建完成。
后臺運行
使用上面的命令可以運行服務(wù)轰坊,但不能后臺運行铸董,這樣關(guān)閉命令窗口就會終止程序。
nohup ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":8071" -httpsAddr=":8072" -tunnelAddr=":8073" &
公眾號坑
當在公眾號中啟用【服務(wù)端URL】時肴沫,域名后面不能使用端口袒炉,如下:
此時就需要把上面啟動服務(wù)的端口8081-->改為80,但是發(fā)現(xiàn)80端口已經(jīng)被占用了樊零,怎么解決我磁?
二級域名
解決方案是使用二級域名,正常注冊的域名是“xxx.com”驻襟,那么二級域名就是加一個前綴夺艰,如“ngrok.xxx.com”
理論上一個域名可以配置無數(shù)個二級域名。
配置二級域名
首先登錄到你注冊的域名服務(wù)器沉衣,按如下步驟操作
-
登錄管理控制臺郁副,找到“域名”并點擊進入域名中
-
找到“域名解析”
-
添加二級域名
添加完成后,就可以測試二級域名了豌习,ping ngrok.xxx.com
存谎,正常情況是可以ping通的。
注意:二級域名的解析IP要改為另一臺公網(wǎng)服務(wù)器肥隆,因為要用80端口<燃浴!栋艳!
記得把本地hosts也加上二級域名哦
重新配置ngrok服務(wù)恰聘,測試結(jié)果如下:
終于把端口去掉了。
問題又來了吸占,看ngrok生成的域名前面加了www晴叨,這樣的域名是無法訪問的?
配置三級域名
ngrok默認會加個www矾屯,所以咱們要手動指定三級域名兼蕊,如
ngrok.exe -log=out.log -config=ngrok.cfg -subdomain=test 8090
內(nèi)網(wǎng)穿透的結(jié)果如下:
現(xiàn)在把前面的www換成了test,這是一個三級域名件蚕,如何讓這個三級域名能夠正常訪問呢孙技?方法與添加二級域名一樣惧所,只是此時的名字是“test.ngrok”
配置三級域名完成后,就可以正常訪問了绪杏,就可以配置到公眾號的服務(wù)端URL了。
內(nèi)網(wǎng)穿透調(diào)用流程
- 公眾號---->微信服務(wù)器---->服務(wù)端URL---->解析三級域名---->ngrok服務(wù)器--->跳轉(zhuǎn)到本地ngrok服務(wù)8090---->8090是一個ng服務(wù)
- ng服務(wù)----->以/wx/開頭則跳轉(zhuǎn)到wxjava服務(wù)器處理來自微信服務(wù)器的消息纽绍。
- ng服務(wù)----->非/wx/開頭則跳轉(zhuǎn)到web應(yīng)用服務(wù)
小結(jié)
有了這樣的內(nèi)網(wǎng)穿透服務(wù)蕾久,在開發(fā)調(diào)試公眾號就方便多了。
參考:
https://blog.csdn.net/weixin_39496190/article/details/80385263