ngro_k服务器搭建(本地电脑与微信交互)
? ngrok 是一個反向代理的開源軟件,至于為什么要使用ngrok,百度百科這樣說:
? 最近在學微信公眾號開發(fā),開發(fā)過程需要與微信的服務(wù)端交互,直接拿自己的電腦當然是不行的,因為我們的電腦連接的是局域網(wǎng),網(wǎng)址非固定,且跟公網(wǎng)連接不上。如百度上的解釋,若是每次測試都得把代碼寫完然后打包放到服務(wù)器上去,太折騰了。最簡便的方法莫過于就在本機進行開發(fā)和測試。那么要如何打通本地與外網(wǎng)的通道,使微信服務(wù)器能找到我的本地主機呢?辦法還是有的,借用內(nèi)網(wǎng)穿透工具可以實現(xiàn)。在市面上內(nèi)網(wǎng)穿透工有很多。但無一例外,使用免費內(nèi)網(wǎng)穿透服務(wù)是不穩(wěn)定的,想要長久穩(wěn)定使用就得花錢充vip,vip之間還分等級…考慮到后面開發(fā)需要很長一段時間,最后我決定把閑置已久的主機和域名用來搭一個ngrok服務(wù)器。
更多內(nèi)網(wǎng)穿透工具(可以嘗試下免費的):可以實現(xiàn)內(nèi)網(wǎng)穿透的幾款工具,內(nèi)網(wǎng)穿透的實現(xiàn)和原理解析
1、了解幾個概念:
正向代理 (Forward Proxy)與反向代理(reverse proxy)
正向代理,proxy(代理) 和 client(用戶) 同屬一個 LAN(局域網(wǎng)),對 server 透明;Lhost 為了訪問到 Rhost,向 proxy 發(fā)送了一個請求并且指定目標是 Rhost,然后 proxy 向 Rhost 轉(zhuǎn)交請求并將獲得的內(nèi)容返回給 Lhost,簡單來說正向代理就是 proxy 代替了我們?nèi)ピL問 Rhost。 vpn的應用是正向代理的一種。
反向代理,proxy 和 server 同屬一個 LAN,對 client 透明。Lhost 只向 proxy 發(fā)送普通的請求,具體讓他轉(zhuǎn)到哪里,proxy 自己判斷,然后將返回的數(shù)據(jù)遞交回來,這樣的好處就是在某些防火墻只允許 proxy 數(shù)據(jù)進出的時候可以有效的進行穿透。
實際上 proxy 在兩種代理中做的事都是代為收發(fā)請求和響應,不過從結(jié)構(gòu)上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,后者叫做反向代理。
端口映射:
端口映射:端口映射就是將內(nèi)網(wǎng)中的主機的一個端口映射到外網(wǎng)主機的一個端口,提供相應的服務(wù)。當用戶訪問外網(wǎng)IP的這個端口時,服務(wù)器自動將請求映射到對應局域網(wǎng)內(nèi)部的機器上。比如,我們在內(nèi)網(wǎng)中有一臺Web服務(wù)器,但是外網(wǎng)中的用戶是沒有辦法直接訪問該服務(wù)器的。于是我們可以在路由器上設(shè)置一個端口映射,只要外網(wǎng)用戶訪問路由器ip的80端口,那么路由器會把自動把流量轉(zhuǎn)到內(nèi)網(wǎng)Web服務(wù)器的80端口上。并且,在路由器上還存在一個Session,當內(nèi)網(wǎng)服務(wù)器返回數(shù)據(jù)給路由器時,路由器能準確的將消息發(fā)送給外網(wǎng)請求用戶的主機。在這過程中,路由器充當了一個反向代理的作用,他保護了內(nèi)網(wǎng)中主機的安全
端口轉(zhuǎn)發(fā):
端口轉(zhuǎn)發(fā)(Port forwarding),有時被叫做隧道,是安全殼(SSH) 為網(wǎng)絡(luò)安全通信使用的一種方法。比如,我們現(xiàn)在在內(nèi)網(wǎng)中,是沒有辦法直接訪問外網(wǎng)的。但是我們可以通過路由器的NAT方式訪問外網(wǎng)。假如我們內(nèi)網(wǎng)現(xiàn)在有100臺主機,那么我們現(xiàn)在都是通過路由器的這一個公網(wǎng)IP和外網(wǎng)通信的。那么,當互聯(lián)網(wǎng)上的消息發(fā)送回來時,路由器是怎么知道這個消息是給他的,而另外消息是給你的呢?這就要我們的ip地址和路由器的端口進行綁定了,這時,在路由器中就會有一個內(nèi)網(wǎng)ip和路由器端口對應的一張表。當路由器的10000端口收到消息時,就知道把消息發(fā)送給他,而當20000端口收到消息時,就知道把消息發(fā)送給你。這就是端口轉(zhuǎn)發(fā),其轉(zhuǎn)發(fā)一個端口收到的流量,給另一個主機:
進一步理解隧道:SSH隧道與端口轉(zhuǎn)發(fā)及內(nèi)網(wǎng)穿透
以上摘錄自:端口轉(zhuǎn)發(fā)和端口映射,內(nèi)網(wǎng)端口轉(zhuǎn)發(fā)及穿透
小結(jié):我們搭建ngrok服務(wù)器后,實現(xiàn)了隧道(端口轉(zhuǎn)發(fā))技術(shù),使ngrok服務(wù)器能夠反向代理我們本地主機。當有外網(wǎng)(如微信后臺)直接發(fā)送請求給 服務(wù)器的域名+某個端口 , 服務(wù)器會把請求原封不動的轉(zhuǎn)發(fā)給 本地主機+指定端口的位置。在整個過程中,ngrok服務(wù)器僅僅充當了一個對外接收請求的門面,實際上請求還是會被轉(zhuǎn)發(fā)到本地主機處理,這就是隧道打通之后,代理的大致過程。
1、前期準備:
域名須先備案!!!我這里用的是阿里云服務(wù)器。大陸的服務(wù)器想要通過域名訪問,光是實名認證是沒用的,服務(wù)器域名都得備案。
域名解析(以阿里云產(chǎn)品為例):
在控制臺找自己購買的域名,進入域名服務(wù),在域名列表,找到你所要用到的那個域名點進去解析
因在本地多僅用于測試,舍不得用頂級域名,就用二級域名。如圖第1步,添加一個二級域名如:ngrok.xiongmm.cn到你的服務(wù)器上(A記錄), 再添加一個*.ngrok的泛解析(還是A記錄), 解析的地址都是你的服務(wù)器地址。(泛解析一定要加上,這意味著后面部署好后,形如xxx.ngrok.xiongmm.cn的域名都可訪問,這個xxx為任意的)。頂級域名解析同理,除步驟2的兩個記錄之外還應再加一個泛解析。
2、安裝ngrok需要的環(huán)境:
1、安裝golang,ngrok是go語言寫的,需要go語言的環(huán)境支持,golang是go語言在官網(wǎng)的名字。
選擇源碼安裝最好,因為我用yum安裝后面出錯,可能yum源下的版本會出問題:
下載源碼:(root用戶下的操作)
cd /usr/src wget https://studygolang.com/dl/golang/go1.12.linux-amd64.tar.gz tar -C /usr/local -xzf go1.12.linux-amd64.tar.gz #解壓到/usr/local目錄配置環(huán)境變量:
vi /etc/profile在最后一行加入以下內(nèi)容,并保存退出:
#go export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GOPATH=/root/go export PATH=$PATH:$GOPATH/BIN執(zhí)行命令立即生效:
source /etc/profile查看安裝情況
go version輸出內(nèi)容就證明安裝成功。
2、安裝git,git安裝是為了從github獲取ngrok源代碼,當然也可以自己從github下載然后再傳到服務(wù)器。
選擇源碼安裝,依然不推薦yum安裝,yum源的版本太低,就算勉強能用很快就要換的:
不同版本自選:鏡像
## 查看自帶的版本git version 1.8.3.1 git --version ## 移除原來的版本 yum remove git #安裝所需軟件包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel yum install gcc-c++ perl-ExtUtils-MakeMaker #切換到src目錄下載源碼 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz#解壓 tar xzf git-2.7.3.tar.gz #編譯,安裝 cd git-2.7.3 make prefix=/usr/local/git all make prefix=/usr/local/git install#加入環(huán)境變量 echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile source /etc/profile#查看安裝結(jié)果 git --version3、安裝ngrok并配置服務(wù)器
下載源碼:(非官方源碼,修復部分問題,親測可用)
cd /usr/local git clone https://github.com/tutumcloud/ngrok.git ngrok如果不能鏈接到github,可以把鏈接中的https改成git再執(zhí)行為域名生成自簽名證書(沒有證書,不可使用https協(xié)議):
(記得改成自己的域名)
替換掉原本ngrok.com的證書,會提示overwrite,輸入y回車即可
cp base.pem assets/client/tls/ngrokroot.crt編譯服務(wù)端:
make release-server release-client編譯成功后會在bin目錄下找到ngrokd和ngrok這兩個文件(如果沒有,則重新執(zhí)行上面的命令)。其中ngrokd 就是服務(wù)端程序了。
編譯客戶端:golang交叉編譯,需根據(jù)客戶端的計算機位數(shù),以及操作系統(tǒng)自行選擇。
<!--linux服務(wù)端--> GOOS=linux GOARCH=386 make release-server (32位) GOOS=linux GOARCH=amd64 make release-server(64位)<!--Mac OS客戶端--> GOOS=darwin GOARCH=386 make release-client GOOS=darwin GOARCH=amd64 make release-client<!--windows客戶端--> GOOS=windows GOARCH=386 make release-client GOOS=windows GOARCH=amd64 make release-client本地為win10 系統(tǒng) 64位,故執(zhí)行最后一條:
cd /usr/local/ngrok GOOS=windows GOARCH=amd64 make release-client在生成的windows_amd64目錄下有相對應的可執(zhí)行文件ngrok.exe,然后下載到本地windows系統(tǒng):
啟動服務(wù)端:domain需要改成你自己的域名
在代理服務(wù)器中,http協(xié)議是使用80端口,https使用443端口,可以任意指定,但是微信開發(fā)填服務(wù)器地址不能出現(xiàn)端口,因此使用協(xié)議默認端口號。另外ngrok還會開一個4443端口與服務(wù)端通訊,客戶端配置文件會用到。
配置客戶端:
配置:將ngrok.exe文件下載到本地,然后在本地同級目錄下創(chuàng)建配置文件ngrok.cfg 以及啟動文件startup.bat
編寫ngrok.cfg文件:
server_addr: "ngrok.xiongmm.cn:4443" trust_host_root_certs: false tunnels:http:subdomain: "anyname"proto:http: "8080"https:subdomain: "anyname"proto:https: "8080"? 參數(shù)解析:
- ? server_addr,服務(wù)端與本地通訊地址,服務(wù)端ngrok為此開啟的端口是4443,端口貌似不可以改
- ? trust_host_root_certs:填寫false,反正填true會連不上
- ? tunnels:隧道
- ? subdomain:子域名,域名最前面那部分,因為添加了泛解析,故可以填任意的,不指定的話會隨機生成
- ? proto:代理
- ? http: “8080”:這里的http 8080是指本地的http協(xié)議端口,可以填任意值
編寫startup.bat文件:
@echo on #ngrok start web ngrok.exe -config ngrok.cfg -log=ngrok.log start http https? 參數(shù)解析:
- -config ngrok.cfg 配置文件為ngrok.cfg,運行ngrok.exe時會到配置文件讀取相應信息
- -log=ngrok.log 日志文件,會自動生成
- start http https 運行exe文件后開啟本地http 和 https服務(wù)的映射
啟動客戶服務(wù):
點擊startup.bat運行,出現(xiàn)狀態(tài)為綠色即為本地主機與服務(wù)器的隧道打通了。
測試一下用域名是否可以連外網(wǎng),寫個servlet,在tomcat里面運行測試一下:
內(nèi)網(wǎng)穿透成功!
4、錯誤總結(jié)
如果過程中出錯,看是否為如下問題:
1、在編譯過程中有可能出現(xiàn)如下錯誤:
GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
? -debug=false \
? -o=src/ngrok/client/assets/assets_release.go \
? assets/client/…
make: bin/go-bindata: Command not found
make: *** [client-assets] Error 127
解決方法:前往go安裝目錄的bin目錄下找到go-bindata,將他移動到ngrok/bin下 (沒有bin,可新建一個) ,其實這個問題在我用源碼的方式重裝golang之后就沒出現(xiàn)了。
2、碰到這種連不上的錯誤
出問題的可能性有很多,解決方法只能是逐個排除:
第一,先保證檢查的是自己服務(wù)端是否開啟服務(wù)。
第二,檢查阿里云域名解析是否正確,比如我要用頂級域名abc.com,然后你除了用@方式解析頂級域名abc.com之外,是否有使用泛解析: *.abc.com,解析地址要指向自己的服務(wù)器IP。二級域名解析在前面有說,往上翻。
第三,查看阿里云服務(wù)器安全組是否設(shè)置:找到自己的服務(wù)器實例→管理→本實例安全組→安全組列表→配置規(guī)則→添加安全組規(guī)則(阿里云安全組添加示例),添加http 80和 https 443以及全部ICP+UDP這三個分組。安全組的概念是在阿里云服務(wù)器才有的,設(shè)置這道關(guān)卡對初學者來說簡直雞肋。
第四,設(shè)置防火墻,在安全組開放端口之后,另外還要在防火墻開放端口,不然外面訪問不了你的服務(wù)器,這里就直接把防火墻關(guān)掉吧,省事一些。
systemctl stop firewalld.service第五,端口被占用,當前服務(wù)器有其他web應用占用了80端口,解決方法就是直接把進程殺死:
查詢: netstat -lnp |grep 端口號
kill 進程號
排除上面五個問題,服務(wù)器主機本身應該沒問題了。再重啟bat文件運行本地服務(wù)。如果還是失敗,繼續(xù)排查
第六,檢查本地配置文件是否填寫正確,
如果配置文件所在位置以及配置問價內(nèi)容都沒錯,那么排除本地客戶端錯誤的可能性。
這個時候還有錯,就推翻重來吧,很大可能是你在生成證書或者啟動服務(wù)端的時候域名沒有正確填寫自己的。重來只需把整個ngrok文件刪了,從get clone 拉去ngrok源碼那一步開始。
2、若是遇到如下這種錯(隧道不可用),說明你都成功了,只是用錯了端口,比如http協(xié)議映射的本地端口為8080,而你的本地web服務(wù)器tomcat開啟的卻是80端口,本地http80端口沒有打通隧道當然不可用。
解決辦法:在ngrok.cfg文件把http端口改為80,再重啟.bat文件。亦或者把tomcat的使用端口改回8080。
對于需要更換域名,或者推倒重來,都應先把ngrok文件整個刪掉,然后從git clone下載源碼那一步重復開始。
5、優(yōu)化服務(wù)
后臺自動運行:在ngrok目錄下執(zhí)行以下命令會啟動服務(wù)端:
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=ngrok.xiongmm.cn -httpAddr=:80 -httpsAddr=:443
但是若是關(guān)閉了bash,服務(wù)也會關(guān)閉,要讓他方便的在后臺默默運行,得把它打包成一個服務(wù)。
輸入命令:
vim /etc/systemd/system/ngrok.service添加如下內(nèi)容:(域名domain要換成自己的域名!!)
[Unitt] Description=ngrok After=network.target[Service] #不需要雙引號, ExecStart=/usr/local/ngrok/bin/ngrokd -tlsKey=/usr/local/ngrok/server.key -tlsCrt=/usr/local/ngrok/server.crt -domain=ngrok.xiongmm.cn -httpAddr=:80 -httpsAddr=:443[Install] WantedBy=multi-user.target立即生效:
systemctl daemon-reload再執(zhí)行以下命令
systemctl start ngrok.service現(xiàn)在可以把服務(wù)器bash關(guān)掉,然后在本地自由的使用。
想停止服務(wù)端服務(wù)的話,查找并殺掉此進程即可:
netstat -lnp|grep 80 #找到80端口進程的PID kill PID防火墻開啟端口:
防火墻沒開的端口,外面想要訪問是不可以的,但是之前這樣直接把防火墻關(guān)了是不是不太好?想了想還是開著防火墻穩(wěn)重一些,用以下命令把三個要用到的端口(80,443,4443)開啟::
firewall-cmd --state #查看防火墻狀態(tài) systemctl start firewalld.service #開啟防火墻 firewall-cmd --zone=public --add-port=80/tcp --permanent #永久 開放80端口 firewall-cmd --reload # 配置立即生效 firewall-cmd --zone=public --query-port=80/tcp #查看80端口是否開放,返回yes則開放成功firewall-cmd --zone=public --add-port=443/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --query-port=443/tcp #查看443端口是否開放,返回yes則開放成功firewall-cmd --zone=public --add-port=4443/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --query-port=4443/tcp #查看4443端口是否開放,返回yes則開放成功弄好之后,在本地與外網(wǎng)交互就很方便了。其實步驟也沒幾個,但是需要注意的地方比較多。
最后來展示最后一個大坑!!!!
在微信公眾號的服務(wù)器配置當中,使用這個域名報參數(shù)錯誤。
然而我在瀏覽器上就能訪問這個網(wǎng)址返回相應信息,也就是說地址是可以被外網(wǎng)訪問。
同樣,我嘗試了一下用之前免費的ngrok服務(wù)提供的域名,配置成功?:
啟動服務(wù):
配置成功
我一臉茫然????,是我的域名有毒嗎??為此我試過了好多次,我把本地的映射域名也改成了80端口依舊無效,甚至我懷疑域名太長了,于是我就重新部署了一下?lián)Q成了頂級域名:
可以被外網(wǎng)訪問:
但就是不行,該你參數(shù)錯誤還得錯:
網(wǎng)上有人說,域名被微信屏蔽了,就把鏈接發(fā)我微信上,點開試了下,好像確實是如此:
咋辦,辛苦一場,如果真的是微信屏蔽了,先申請恢復,等幾天再試一下。
還別說,微信處理的效率還挺高,確認我是一個遵紀守法的好公民后,當天下午就把我域名從小黑單里拉出來了。問題果然是出在這里!
之后就可以隨便使用了。
另外,有個缺陷,部署ngrok服務(wù)器占用了我的80端口,使得我本身的web應用沒法用80端口訪問了。
想了個辦法,打算再用個反向代理,比如用nginx來進行端口轉(zhuǎn)發(fā)。等有時間再折騰。
完結(jié)。。。。。
參考文檔:
https://ubock.com/article/31-4
https://www.jianshu.com/p/f5c2a55e77bd
https://blog.csdn.net/yjc_1111/article/details/79353718
https://blog.csdn.net/zhangguo5/article/details/77848658?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-11&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-11
https://blog.csdn.net/weixin_41941052/article/details/98949052
總結(jié)
以上是生活随笔為你收集整理的ngro_k服务器搭建(本地电脑与微信交互)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大量贴图采样限制下的渲染处理方法
- 下一篇: log4j2.xsml配置文件详细