日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ngro_k服务器搭建(本地电脑与微信交互)

發(fā)布時間:2024/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ngro_k服务器搭建(本地电脑与微信交互) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 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、前期準備:

  • 一臺有固定ip的服務(wù)器
  • 一個域名,用來生成訪問域名
  • 一個本地電腦
  • 域名須先備案!!!我這里用的是阿里云服務(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 --version

    3、安裝ngrok并配置服務(wù)器

    下載源碼:(非官方源碼,修復部分問題,親測可用)

    cd /usr/local git clone https://github.com/tutumcloud/ngrok.git ngrok如果不能鏈接到github,可以把鏈接中的https改成git再執(zhí)行

    為域名生成自簽名證書(沒有證書,不可使用https協(xié)議):
    (記得改成自己的域名)

    cd ngrokNGROK_DOMAIN="ngrok.xiongmm.cn" #改成自己要用的二級域名或者頂級域名openssl genrsa -out base.key 2048openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

    替換掉原本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需要改成你自己的域名

    cd /usr/local/ngrok./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=ngrok.xiongmm.cn -httpAddr=:80 -httpsAddr=:443

    在代理服務(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。