把本地服务暴露到公网
场景:本机跑着 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.(可选)固定域名 / 长期使用
快速命令适合临时用。若要固定子域名,需要:
- Cloudflare 账号 + 托管的域名
- 创建 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 |