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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

? ngrok 是一個反向代理的開源軟件,至于為什么要使用ngrok,百度百科這樣說:

? 最近在學微信公眾號開發,開發過程需要與微信的服務端交互,直接拿自己的電腦當然是不行的,因為我們的電腦連接的是局域網,網址非固定,且跟公網連接不上。如百度上的解釋,若是每次測試都得把代碼寫完然后打包放到服務器上去,太折騰了。最簡便的方法莫過于就在本機進行開發和測試。那么要如何打通本地與外網的通道,使微信服務器能找到我的本地主機呢?辦法還是有的,借用內網穿透工具可以實現。在市面上內網穿透工有很多。但無一例外,使用免費內網穿透服務是不穩定的,想要長久穩定使用就得花錢充vip,vip之間還分等級…考慮到后面開發需要很長一段時間,最后我決定把閑置已久的主機和域名用來搭一個ngrok服務器。

更多內網穿透工具(可以嘗試下免費的):可以實現內網穿透的幾款工具,內網穿透的實現和原理解析

1、了解幾個概念:

正向代理 (Forward Proxy)與反向代理(reverse proxy)

正向代理,proxy(代理) 和 client(用戶) 同屬一個 LAN(局域網),對 server 透明;Lhost 為了訪問到 Rhost,向 proxy 發送了一個請求并且指定目標是 Rhost,然后 proxy 向 Rhost 轉交請求并將獲得的內容返回給 Lhost,簡單來說正向代理就是 proxy 代替了我們去訪問 Rhost。 vpn的應用是正向代理的一種。

反向代理,proxy 和 server 同屬一個 LAN,對 client 透明。Lhost 只向 proxy 發送普通的請求,具體讓他轉到哪里,proxy 自己判斷,然后將返回的數據遞交回來,這樣的好處就是在某些防火墻只允許 proxy 數據進出的時候可以有效的進行穿透。

實際上 proxy 在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,后者叫做反向代理。

端口映射:

端口映射:端口映射就是將內網中的主機的一個端口映射到外網主機的一個端口,提供相應的服務。當用戶訪問外網IP的這個端口時,服務器自動將請求映射到對應局域網內部的機器上。比如,我們在內網中有一臺Web服務器,但是外網中的用戶是沒有辦法直接訪問該服務器的。于是我們可以在路由器上設置一個端口映射,只要外網用戶訪問路由器ip的80端口,那么路由器會把自動把流量轉到內網Web服務器的80端口上。并且,在路由器上還存在一個Session,當內網服務器返回數據給路由器時,路由器能準確的將消息發送給外網請求用戶的主機。在這過程中,路由器充當了一個反向代理的作用,他保護了內網中主機的安全

端口轉發:

端口轉發(Port forwarding),有時被叫做隧道,是安全殼(SSH) 為網絡安全通信使用的一種方法。比如,我們現在在內網中,是沒有辦法直接訪問外網的。但是我們可以通過路由器的NAT方式訪問外網。假如我們內網現在有100臺主機,那么我們現在都是通過路由器的這一個公網IP和外網通信的。那么,當互聯網上的消息發送回來時,路由器是怎么知道這個消息是給他的,而另外消息是給你的呢?這就要我們的ip地址和路由器的端口進行綁定了,這時,在路由器中就會有一個內網ip和路由器端口對應的一張表。當路由器的10000端口收到消息時,就知道把消息發送給他,而當20000端口收到消息時,就知道把消息發送給你。這就是端口轉發,其轉發一個端口收到的流量,給另一個主機:

進一步理解隧道:SSH隧道與端口轉發及內網穿透

以上摘錄自:端口轉發和端口映射,內網端口轉發及穿透

小結:我們搭建ngrok服務器后,實現了隧道(端口轉發)技術,使ngrok服務器能夠反向代理我們本地主機。當有外網(如微信后臺)直接發送請求給 服務器的域名+某個端口 , 服務器會把請求原封不動的轉發給 本地主機+指定端口的位置。在整個過程中,ngrok服務器僅僅充當了一個對外接收請求的門面,實際上請求還是會被轉發到本地主機處理,這就是隧道打通之后,代理的大致過程。

1、前期準備:

  • 一臺有固定ip的服務器
  • 一個域名,用來生成訪問域名
  • 一個本地電腦
  • 域名須先備案!!!我這里用的是阿里云服務器。大陸的服務器想要通過域名訪問,光是實名認證是沒用的,服務器域名都得備案。

    域名解析(以阿里云產品為例)

    在控制臺找自己購買的域名,進入域名服務,在域名列表,找到你所要用到的那個域名點進去解析

    因在本地多僅用于測試,舍不得用頂級域名,就用二級域名。如圖第1步,添加一個二級域名如:ngrok.xiongmm.cn到你的服務器上(A記錄), 再添加一個*.ngrok的泛解析(還是A記錄), 解析的地址都是你的服務器地址。(泛解析一定要加上,這意味著后面部署好后,形如xxx.ngrok.xiongmm.cn的域名都可訪問,這個xxx為任意的)。頂級域名解析同理,除步驟2的兩個記錄之外還應再加一個泛解析。

    2、安裝ngrok需要的環境:

    1、安裝golang,ngrok是go語言寫的,需要go語言的環境支持,golang是go語言在官網的名字。

    選擇源碼安裝最好,因為我用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目錄

    配置環境變量:

    vi /etc/profile

    在最后一行加入以下內容,并保存退出:

    #go export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GOPATH=/root/go export PATH=$PATH:$GOPATH/BIN

    執行命令立即生效:

    source /etc/profile

    查看安裝情況

    go version

    輸出內容就證明安裝成功。

    2、安裝git,git安裝是為了從github獲取ngrok源代碼,當然也可以自己從github下載然后再傳到服務器。

    選擇源碼安裝,依然不推薦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#加入環境變量 echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile source /etc/profile#查看安裝結果 git --version

    3、安裝ngrok并配置服務器

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

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

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

    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

    編譯服務端:

    make release-server release-client

    編譯成功后會在bin目錄下找到ngrokd和ngrok這兩個文件(如果沒有,則重新執行上面的命令)。其中ngrokd 就是服務端程序了。

    編譯客戶端:golang交叉編譯,需根據客戶端的計算機位數,以及操作系統自行選擇。

    <!--linux服務端--> 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 系統 64位,故執行最后一條:

    cd /usr/local/ngrok GOOS=windows GOARCH=amd64 make release-client

    在生成的windows_amd64目錄下有相對應的可執行文件ngrok.exe,然后下載到本地windows系統:


    啟動服務端:domain需要改成你自己的域名

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

    在代理服務器中,http協議是使用80端口,https使用443端口,可以任意指定,但是微信開發填服務器地址不能出現端口,因此使用協議默認端口號。另外ngrok還會開一個4443端口與服務端通訊,客戶端配置文件會用到。

    配置客戶端:
    配置:將ngrok.exe文件下載到本地,然后在本地同級目錄下創建配置文件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"

    ? 參數解析:

    • ? server_addr,服務端與本地通訊地址,服務端ngrok為此開啟的端口是4443,端口貌似不可以改
    • ? trust_host_root_certs:填寫false,反正填true會連不上
    • ? tunnels:隧道
    • ? subdomain:子域名,域名最前面那部分,因為添加了泛解析,故可以填任意的,不指定的話會隨機生成
    • ? proto:代理
    • ? http: “8080”:這里的http 8080是指本地的http協議端口,可以填任意值

    編寫startup.bat文件:

    @echo on #ngrok start web ngrok.exe -config ngrok.cfg -log=ngrok.log start http https

    ? 參數解析:

    • -config ngrok.cfg 配置文件為ngrok.cfg,運行ngrok.exe時會到配置文件讀取相應信息
    • -log=ngrok.log 日志文件,會自動生成
    • start http https 運行exe文件后開啟本地http 和 https服務的映射

    啟動客戶服務:
    點擊startup.bat運行,出現狀態為綠色即為本地主機與服務器的隧道打通了。

    測試一下用域名是否可以連外網,寫個servlet,在tomcat里面運行測試一下:

    內網穿透成功!

    4、錯誤總結

    如果過程中出錯,看是否為如下問題:

    1、在編譯過程中有可能出現如下錯誤:

    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之后就沒出現了。

    2、碰到這種連不上的錯誤

    出問題的可能性有很多,解決方法只能是逐個排除:

    第一,先保證檢查的是自己服務端是否開啟服務。

    第二,檢查阿里云域名解析是否正確,比如我要用頂級域名abc.com,然后你除了用@方式解析頂級域名abc.com之外,是否有使用泛解析: *.abc.com,解析地址要指向自己的服務器IP。二級域名解析在前面有說,往上翻。

    第三,查看阿里云服務器安全組是否設置:找到自己的服務器實例→管理→本實例安全組→安全組列表→配置規則→添加安全組規則(阿里云安全組添加示例),添加http 80和 https 443以及全部ICP+UDP這三個分組。安全組的概念是在阿里云服務器才有的,設置這道關卡對初學者來說簡直雞肋。

    第四,設置防火墻,在安全組開放端口之后,另外還要在防火墻開放端口,不然外面訪問不了你的服務器,這里就直接把防火墻關掉吧,省事一些。

    systemctl stop firewalld.service

    第五,端口被占用,當前服務器有其他web應用占用了80端口,解決方法就是直接把進程殺死:
    查詢: netstat -lnp |grep 端口號
    kill 進程號

    排除上面五個問題,服務器主機本身應該沒問題了。再重啟bat文件運行本地服務。如果還是失敗,繼續排查

    第六,檢查本地配置文件是否填寫正確,

    如果配置文件所在位置以及配置問價內容都沒錯,那么排除本地客戶端錯誤的可能性。

    這個時候還有錯,就推翻重來吧,很大可能是你在生成證書或者啟動服務端的時候域名沒有正確填寫自己的。重來只需把整個ngrok文件刪了,從get clone 拉去ngrok源碼那一步開始。

    2、若是遇到如下這種錯(隧道不可用),說明你都成功了,只是用錯了端口,比如http協議映射的本地端口為8080,而你的本地web服務器tomcat開啟的卻是80端口,本地http80端口沒有打通隧道當然不可用。

    解決辦法:在ngrok.cfg文件把http端口改為80,再重啟.bat文件。亦或者把tomcat的使用端口改回8080。

    對于需要更換域名,或者推倒重來,都應先把ngrok文件整個刪掉,然后從git clone下載源碼那一步重復開始。

    5、優化服務

    后臺自動運行:在ngrok目錄下執行以下命令會啟動服務端:

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

    但是若是關閉了bash,服務也會關閉,要讓他方便的在后臺默默運行,得把它打包成一個服務。

    輸入命令:

    vim /etc/systemd/system/ngrok.service

    添加如下內容:(域名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

    再執行以下命令

    systemctl start ngrok.service

    現在可以把服務器bash關掉,然后在本地自由的使用。

    想停止服務端服務的話,查找并殺掉此進程即可:

    netstat -lnp|grep 80 #找到80端口進程的PID kill PID

    防火墻開啟端口

    防火墻沒開的端口,外面想要訪問是不可以的,但是之前這樣直接把防火墻關了是不是不太好?想了想還是開著防火墻穩重一些,用以下命令把三個要用到的端口(80,443,4443)開啟::

    firewall-cmd --state #查看防火墻狀態 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則開放成功

    弄好之后,在本地與外網交互就很方便了。其實步驟也沒幾個,但是需要注意的地方比較多。

    最后來展示最后一個大坑!!!!
    在微信公眾號的服務器配置當中,使用這個域名報參數錯誤。

    然而我在瀏覽器上就能訪問這個網址返回相應信息,也就是說地址是可以被外網訪問。

    同樣,我嘗試了一下用之前免費的ngrok服務提供的域名,配置成功?:
    啟動服務:

    配置成功

    我一臉茫然????,是我的域名有毒嗎??為此我試過了好多次,我把本地的映射域名也改成了80端口依舊無效,甚至我懷疑域名太長了,于是我就重新部署了一下換成了頂級域名:
    可以被外網訪問:

    但就是不行,該你參數錯誤還得錯:

    網上有人說,域名被微信屏蔽了,就把鏈接發我微信上,點開試了下,好像確實是如此:

    咋辦,辛苦一場,如果真的是微信屏蔽了,先申請恢復,等幾天再試一下。


    還別說,微信處理的效率還挺高,確認我是一個遵紀守法的好公民后,當天下午就把我域名從小黑單里拉出來了。問題果然是出在這里!

    之后就可以隨便使用了。

    另外,有個缺陷,部署ngrok服務器占用了我的80端口,使得我本身的web應用沒法用80端口訪問了。
    想了個辦法,打算再用個反向代理,比如用nginx來進行端口轉發。等有時間再折騰。
    完結。。。。。

    參考文檔:

    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

    總結

    以上是生活随笔為你收集整理的ngro_k服务器搭建(本地电脑与微信交互)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。