把本地服务暴露到公网

把本地服务暴露到公网

场景:本机跑着 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

参考

相关推荐
Ruiery4 小时前
Linux 6.6内核 CPU 深度解析(七):调度器启动 — 从单核到多核,调度器分阶段点亮
linux·运维·服务器
50万马克的面包4 小时前
CSDN-栈队列数组-知识点整理
linux·运维·服务器
MicrosoftCloud5 小时前
用户权限 04|/etc/sudoers 安全配置:从最小授权到「别把 ALL 随便给人」
运维·安全·ubuntu·sudo·sudoers
꯭自꯭闭꯭6 小时前
达梦事物特性及MVCC
linux·运维·数据库
亚川楼宇自控系统数据中心厂家7 小时前
实验室智能化管理系统|人环物智一体化管控平台
运维
zmsup9 小时前
Agent 上下文调优:结合 OpsArk 运维智能体,设计模型每一步真正需要的信息
运维·agent·上下文压缩·运维智能体·上下文调优
吴声子夜歌11 小时前
Nginx应用与运维——Nginx负载均衡应用实战(二)
运维·nginx·负载均衡
lisanmengmeng11 小时前
NRPE 添加命令(一)
linux·运维·服务器
pt104311 小时前
CML网络仿真入门-2:使用CML模拟网络实验环境
运维·网络协议
沫璃染墨12 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理