🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名 →

NGINX + SSH Tunnel 把本地开发环境公布到互联网上

gongjimin 在论坛上介绍了另一个方法:http://talk.ninghao.net/t/nginx-ssh/4716

在调试一些接口的时候,你的网站应用要跟其它的一些外部服务进行交流,你发给它一点数据,它也会返回给你一点数据。但是如果是在本地开发环境上调试,你只能发送给外部服务数据,而外部服务返回来的数据你的本地环境是收不到的。因为你的本地环境并没有一个固定的公网 IP 地址。

我不想直接在服务器上去调试,因为复杂而且不方便,忽然想到了之前用过的 BrowserSync 工具,有一个 Tunnel 选项,可以把在本地创建的服务器公布到互联网上。我又想到了 SSH 有个 Tunnel 功能,原来用它作为本地电脑的代理用,我想大概可以用它,让我的在公网上的一台服务器接待请求,再把请求转到我的本地开发环境上,然后就去搜索关键词 NGINX,SSH,Tunnel ,找到了答案。

用 SSH 在本地电脑与公网服务器之间打开一个通道,配置公网服务器的 NGINX,把收到的请求转到本地电脑与公网服务器的这个通道上。

需求

  1. 一台连接到公网的服务器
  2. 公网服务器上安装了 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 这个地址的时候,用户得到的响应是你的本地开发环境上的服务器提供的。

nginx

评论

laragon客户端中的ngrok功能就可以实现皓哥的需求

嗯 ~ 试试看。

ngrok 这个工具之前用过。版本太多,都不知道哪个才是官方版……

如果链接中断,如何实现自动连接?

或许可以在本地电脑上做些操作。具体怎么做,我没有试过。

太棒了!~ 真的成功了。
每次都有惊喜哦!~

哈哈,恭喜恭喜 :)

有个疑问,这个占流量吗?
我现在用的VPN有个月流量限制。。。
经常这么使用的话怕会流量超了。

VPN 的话,确实会费流量。因为 VPN 是全局的,系统所有流量都会流过 VPN。

我咋就
502 Bad Gateway
nginx/1.13.6

这个错误是,nginx 代理连接到你本地服务的时候遇到的问题,你的本地服务就是上面说的 gateway。你用的具体的方法可以贴到论坛上,把你的详细步骤写出来。

这个问题我重启电脑解决了,谢谢了

这个做为发布给外面的机子测试可以用是吗。

是的,主要是让本地的开发环境可以在互联网被访问到。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:FzVk7gZhIyvKvPFa/wkSoOLZdEX1cE5LRh6N4ZKpeXQ.
Please contact your system administrator.

在 /c/Users/Administrator/.ssh/known_hosts,这个文件里,找到你要登录到的服务器的 ip 地址,把这条记录删除掉,然后重新再试一下就行了。

Offending ECDSA key in /c/Users/Administrator/.ssh/known_hosts:4
RSA host key for 120.78.204.124 has changed and you have requested strict checking.
Host key verification failed.
win10 ,cmder

Offending ECDSA key in /c/Users/Administrator/.ssh/known_hosts:4 RSA host key for 120.78.204.124 has changed and you have requested strict checking. Host key verification failed.
win 10 ,cmder提示上面的错误

@王皓 443端口配置的方法一样吗 把服务器端 改成
server {
listen 443;
server_name dev.ninghao.net;
...
连接时改成 ssh -vnNT -R 7689:localhost:443 root@42.120.40.68

但是不行呀,提示无法与服务器建立安全连接,是要在服务端安装ssl证书吗? 我看你的小程序课程中确实用了 https 的本地网站做测试的,我怎么不行?

已解决 服务端需要添加ssl证书,另外proxy_pass 中的 http 改成https

最后发现微信开发视频里已经有这个补充介绍了, 在 微信小程序-》内容列表 -》修正: 通道配置

好的 :)

本地是vagrant 网站:192.168.33.10:6371 这样可以访问
本地host:绑定域名:local.****.com
线上服务器也加入
upstream tunnel {
server 127.0.0.1:7689;
}

server {
listen 80;
server_name local.*****.com;

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;

因为其它设备无法访问 192.168.33.10 这个地址,这个地址是你的主机与 Vagrant 管理的虚拟机之间创建的一个私有网络的 IP 地址。如果你的网站是在 Vagrant 里运行,你可以设置一个端口转发,或者为虚拟机设置一个公共的 IP 地址。端口转发可能更方便一些,比如你可以让主机上的 6371 转发到在你的虚拟机上的 6371 这个端口。

请问这个通道在连接一段时间后是不是会自动断掉,我这里一开始可以连接成功,后面提示remote port forwarding failed for listen port

这是因为 ssh 配置的问题,你可以参考这个贴子配置一下:https://superuser.com/questions/699676/how-to-prevent-ssh-from-disconnec...

谢谢皓哥,百度到的资料都不靠谱,还是皓哥发的这个好,百度上都说要使用autossh,整的都不是问题的核心

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点