01.28 小程序開發測試效率神器-ngrok

開發之痛

由於公網ip資源的匱乏,我們日常開發中經常需要將系統部署到服務器之後才能測試或演示支付等特定功能,而由此引發的調試問題更是時常讓工程師們頭疼不已。今天給大家介紹一個可以極大改善這一問題的工具-ngrok。這是一個讓你能夠在自己的開發機器上使用公網地址的效率神器。

內網網穿透

在介紹ngrok之前我們需要先理解一個概念,就是內網穿透,內網穿透,又叫NAT穿透,是ipv4協議下由於地址稀缺而延伸出來的技術。一般情況下在非局域網中,您的朋友要訪問您電腦上的資源,需要您的電腦擁有一個獨立的ip地址,用於找到您的電腦在互聯網中的位置。但是現在ip稀缺,電信運營商已經不會隨便分配固定ip給個人。通常實現內網穿透,是通過路由器上端口映射來實現的。但是路由器通常不是每個人都有權限可以訪問和設置,而且可能存在多級路由器較為複雜的網絡結構,單純的端口映射也無法實現公網的資源暴露。這就需要ngrok來實現了。

常用工具介紹

  • ngrok https://ngrok.com 也提供內網穿透服務,不過由於總所周知的原因,我們在國內幾乎沒有辦法正常使用。
  • 花生殼 國內個人用戶可以試著玩一下,不過動態域名和網絡速度限制也讓其實用性大打折扣。
  • 自建ngrok 這個也是我個人比較推薦的一種做法,這種方式能滿足絕大多數臨時系統和測試系統的使用,但是千萬不要在生產環境中使用,畢竟路層級太多會導致太多不可預知的問題。

自建ngrok

原理

ngrok建立一個隧道,將主機A的http請求傳遞給主機B,從而實現內網穿透。ngrok分為client端(ngrok)和服務端(ngrokd)。


小程序開發測試效率神器-ngrok

內網穿透示意圖


實際使用中的部署如下:


小程序開發測試效率神器-ngrok

實際部署情況示意圖


圖中內網主機上安裝客戶端。公網主機安裝服務端。client public則代表訪問你電腦的用戶或者朋友。

安裝過程

  • 這裡推薦使用docker形式進行安裝,原生形式安裝需要管理ngrok進程,無論在公網主機還是內網主機上直接將進程暴露在主機上都不是一個很好的選擇。所以個人推薦使用docker進行安裝。

生成證書

自簽證書

<code>cd /ngrok/
export NGROK_DOMAIN="ngrok.xxxx.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/<code>

這裡的證書也可以使用certbot簽發的證書,在測試微信支付等需要https訪問的方式是十分有用的

<code>docker run -it --rm --name certbot \\
-v "$PWD/etc_letsencrypt:/etc/letsencrypt" \\
-v "$PWD/lib_letsencrypt:/var/lib/letsencrypt" \\
certbot/certbot certonly -d "*.xxxx.com" -d "xxxx.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory/<code>

創建ngrok配置文件

創建ngrok.cfg文件

<code>server_addr: "ngrok.xxxx.com:5553" # 這裡需要提前配置好相應域名解析
trust_host_root_certs: false
tunnels:
app:
subdomain: "dev-api"
proto:
http: "docker.for.mac.host.internal:5000"/<code>

創建dockerfile文件

<code>FROM golang
RUN git clone https://github.com/inconshreveable/ngrok.git /ngrok
WORKDIR /ngrok
COPY lieju.vip/chain.pem assets/client/tls/ngrokroot.crt
COPY lieju.vip/fullchain.pem /cert.pem
COPY lieju.vip/privkey.pem /priv.key
RUN make release-client release-server
COPY ngrok.cfg /ngrok/ngrok.cfg/<code>

創建docker-compose.yaml

<code>version: '3'
services:
# ngrok
client:
build:
context: .
command: ./bin/ngrok -config=/ngrok/ngrok.cfg start-all
restart: always
server:
build:
context: .
command: ./bin/ngrokd -tlsKey=/priv.key -tlsCrt=/cert.pem -domain="lieju.vip" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":5553"
restart: always
ports:
- "443:443"
- "80:80"
- "5553:5553"/<code>

部署

將整個目錄打包分別複製到兩個主機


在公網主機上運行

<code>docker-compose up -d server/<code>

在內網主機上運行

<code>docker-compose up -d client/<code>

至此您訪問公網主機上相應subdomain即可代理至內網主機的相應端口


分享到:


相關文章: