把本地服务暴露到公网

0 阅读3分钟

把本地服务暴露到公网

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

背景

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

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

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


方案一:cloudflared(推荐)

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

1. macOS 安装

Homebrew:

brew install cloudflared
cloudflared --version

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

2. 先确认本地服务正常

浏览器打开:

http://localhost:8890/

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

location / {
    default_type text/plain;
    return 200 'hello';
}

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

3. 一键暴露

cloudflared tunnel --url http://localhost:8890

终端会输出类似:

https://xxxx-xxxx-xxxx.trycloudflare.com

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

0077ca98a108702bd4f6bcc778558a7c.png

公网访问服务 56ebee29804c0b2767adb8351a631dfe.png

4. 使用注意

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

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

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

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

详见官方文档:Create a tunnel


方案二:ngrok(备选)

# 安装(示例)
brew install ngrok/ngrok/ngrok

# 暴露本地端口
ngrok http 8890

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


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

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

云主机上 Nginx / OpenResty 示例:

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 常见写法:

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;
    }
}

临时验证连通性仍可用:

location / {
    default_type text/plain;
    return 200 'hello';
}

快速对照

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

参考