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