把本地服务暴露到公网

把本地服务暴露到公网

场景:本机跑着 OpenResty(或其他服务),例如 http://localhost:8890/,希望外网也能访问------给同事演示、联调、临时分享都可以。

背景

本地服务默认只监听本机回环地址(127.0.0.1),公网用户打不到。要把「本地端口」变成「公网可访问的 URL」,常见有三条路:

方案 适合场景 优点 缺点
隧道(cloudflared / ngrok) 临时演示、联调 几分钟搞定,通常自带 HTTPS 地址可能变;长期不稳定要付费或自建
frp 等内网穿透 有自己的云主机 可控、可固定域名 需要一台公网机器
云主机部署 / 端口映射 正式环境 稳定、可配域名证书 成本高;路由器映射安全性差

日常学习 / 临时演示:优先用 Cloudflare Tunnel(cloudflared)。


方案一:cloudflared(推荐)

原理:本机起一个客户端,主动连到 Cloudflare,对方给你一个临时公网域名,流量再转发回 localhost:8890

1. macOS 安装

Homebrew:

bash 复制代码
brew install cloudflared
cloudflared --version

没有 brew 时,到 官方安装文档 下载 macOS 安装包。

2. 先确认本地服务正常

浏览器打开:

text 复制代码
http://localhost:8890/

能访问再继续。OpenResty / Nginx 若只想临时验证,也可以先返回纯文本:

nginx 复制代码
location / {
    default_type text/plain;
    return 200 'hello';
}

重载配置后再访问本地地址,应看到 hello

3. 一键暴露

bash 复制代码
cloudflared tunnel --url http://localhost:8890

终端会输出类似:

text 复制代码
https://xxxx-xxxx-xxxx.trycloudflare.com

把这个 HTTPS 链接发给别人即可访问你的本地服务。

公网访问服务

4. 使用注意

  • 关掉终端 / Ctrl+C 后,公网地址立刻失效。
  • 每次快速隧道拿到的域名可能不同(未做命名隧道时)。
  • 等于把本机服务挂到公网,不要暴露带敏感数据、未鉴权的管理接口。
  • 公司网络若拦截出站,隧道可能连不上,可换网络或公司代理策略。

5.(可选)固定域名 / 长期使用

快速命令适合临时用。若要固定子域名,需要:

  1. Cloudflare 账号 + 托管的域名
  2. 创建 Named Tunnel,并配置 DNS / ingress

详见官方文档:Create a tunnel


方案二:ngrok(备选)

bash 复制代码
# 安装(示例)
brew install ngrok/ngrok/ngrok

# 暴露本地端口
ngrok http 8890

同样会给出公网 URL。免费版限制、域名是否固定以官网为准。


方案三:自有云主机 + 反代

适合「服务已经部署在有公网 IP 的机器上」,或本机通过 SSH/frp 把流量转到云主机。

云主机上 Nginx / OpenResty 示例:

nginx 复制代码
server {
    listen 80;
    server_name your.domain.com;

    location / {
        proxy_pass http://127.0.0.1:8890;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

生产环境建议再配 HTTPS(Let's Encrypt / Cloudflare 等)。

若服务仍在笔记本上,常见做法是:

  • SSH 反向隧道,或
  • frp :云主机跑 frps,本机跑 frpc 映射 8890

方案四:路由器端口映射(一般不推荐)

家庭宽带若有公网 IP,可在路由器上把外网 80/443 转到电脑的 8890

风险:

  • 动态 IP、运营商 CGNAT 可能导致失败
  • 本机直接暴露,安全面大
  • 仅适合自己折腾,不适合当正式方案

前端静态站(附)

如果暴露的是打包后的前端(history 路由),反代机或本地 Nginx 常见写法:

nginx 复制代码
server {
    listen 80;
    server_name _;

    root /path/to/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:28000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

临时验证连通性仍可用:

nginx 复制代码
location / {
    default_type text/plain;
    return 200 'hello';
}

快速对照

我要... 怎么做
5 分钟让同事打开我的本地 OpenResty cloudflared tunnel --url http://localhost:8890
Mac 安装 cloudflared brew install cloudflared
长期固定域名 Cloudflare Named Tunnel,或云主机 + 反代 + 证书
只有自己的 VPS frp / SSH 隧道 / 直接部署到 VPS

参考

相关推荐
yt004yt2 小时前
### 越华环保集团|绿岛 VOCs 集中治理,管网系统安全设计工程实战分享
大数据·运维
yt004yt2 小时前
越华环保集团|绿岛 VOCs 集中治理,管网系统安全设计工程实战分享
大数据·运维
晚安日记wanna2 小时前
压测 TPS 卡在 800CPU 只跑四成六步定位法
运维·面试·测试
吴声子夜歌4 小时前
Shell编程实例——bash入门
linux·运维·shell
爱和冰阔落4 小时前
【Linux】条件变量为什么必须配合互斥锁:从 pthread_cond_wait 到阻塞队列
linux·运维·c++·缓存·中间件·安卓
ynchyong4 小时前
Linux nohup 后台服务合并标准错误输出到一个文件
java·linux·运维
牛油果子哥q4 小时前
LLM 服务网关设计:流量分发、鉴权、限流、多模型路由、负载均衡、接口版本管理(C++ 网关落地)
运维·负载均衡
傲世仙尊4 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++
蓝速科技5 小时前
信创终端 POC 测试实战与选型避坑指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理