調試一些接口的時候,網站應用要跟一些外部服務進行交流,你發給它一點數據,它也會返回給你一點數據。但是如果是在本地開發環境上調試,你只能發送給外部服務數據,而外部服務返回來的數據你的本地環境是收不到的,如何做外網服務器訪問的請求轉發到本地呢?
基本思路是使用SSH反向隧道,把運行在本地的一個服務發布到互聯網上Linux服務器的一個本地端口,然后再用nginx反向代理來把這個本地端口發布到互聯網。
我不想直接在服務器上去調試,因為復雜而且不方便,忽然想到了之前用過的BrowserSync工具,有一個 Tunnel 選項,可以把在本地創建的服務器公布到互聯網上。我又想到了 SSH 有個 Tunnel 功能,原來用它作為本地電腦的代理用,我想大概可以用它,讓我的在公網上的一臺服務器接待請求,再把請求轉到我的本地開發環境上,然后就去搜索關鍵詞 NGINX,SSH,Tunnel ,找到了答案。
用 SSH 在本地電腦與公網服務器之間打開一個通道,配置公網服務器的NGINX,把收到的請求轉到本地電腦與公網服務器的這個通道上。
需求
- 一臺連接到公網的服務器。
- 公網服務器上安裝了 NGINX。
配置
- 先在公網服務器上添加一個 NGINX 配置:
upstream tunnel {
server 127.0.0.1:7689;
}
server {
listen 80;
server_name dev.ninghao.net;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://tunnel;
}
}
上面用 NGINX 創建了一個代理,如果有人訪問 dev.ninghao.net,NGINX 會把請求轉給 tunnel,這個 tunnel 指的就是這臺公網服務器,端口號是 7689,一會兒我們要用到這個端口跟本地電腦進行通信。
通道
我們要在本地電腦與公網服務器之間,使用 SSH 打開一個通道。要執行的命令像這樣:
ssh -vnNT -R 服務器端口:localhost:本地端口 服務器用戶名@服務器 IP 地址
示例:
ssh -vnNT -R 7689:localhost:3000 root@42.120.40.68
在上面這個例子里,7689 指的是公網服務器的端口,localhost 后面的 3000 是本地電腦用的端口。root 是登錄到公網服務器的用戶,42.120.40.68 是公網服務器的 IP 地址。
因為我們配置了公網服務器的 NGINX,訪問 dev.ninghao.net ,把請求轉到服務器上的 7689 端口,這個端口跟我們的本地電腦上的 3000 端口是連接到一塊兒的。所以,你在本地開發環境上搭建的服務器,應該使用 3000 這個端口提供服務。也就是,當有人訪問 dev.ninghao.net 這個地址的時候,用戶得到的響應是你的本地開發環境上的服務器提供的。