内网穿透方案

在使用 Gradio 搭建的应用时,默认情况下它会提供一个临时的公网 URL(依托 Gradio 自带的托管服务)。但是在某些情况下,可能希望更灵活地在内网环境中将服务暴露给公网(比如通过内网穿透工具)。以下是几种实现方式:

方法 1:使用 Gradio 提供的 Cloud Hosting(默认内网穿透)

Gradio 默认会在运行时直接生成一个临时的公网访问地址。例如:

1
2
3
4
5
6
7
import gradio as gr

def greet(name):
return f"Hello, {name}!"

iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()

运行后,Gradio 会生成一个 http://127.0.0.1:<PORT> 的本地地址,同时还创建一个公网可访问的临时 URL,例如 https://<unique_id>.gradio.app。这个 URL 实际上是通过 Gradio 内置的隧道服务实现的,不需要额外的配置。

缺点:Gradio 默认提供的公共 URL 会有频率限制(免费的计划支持有限的连接数),适用于小型实验,但长期在线服务可能不合适。

方法 2:使用 ngrok 内网穿透

ngrok 是一个流行的内网穿透工具,可以将本地服务映射到一个公网 URL。

步骤:

  1. 安装 ngrok
    前往 ngrok 官方网站 下载并安装,或者通过包管理工具安装,例如在 Ubuntu 上执行:

    1
    sudo apt install ngrok
  2. 启动 Gradio 本地服务
    在代码中显式禁止 Gradio 默认的 share 功能:

    1
    iface.launch(share=False)

    例如:

    1
    2
    3
    4
    5
    6
    7
    import gradio as gr

    def greet(name):
    return f"Hello, {name}!"

    iface = gr.Interface(fn=greet, inputs="text", outputs="text")
    iface.launch(share=False) # 禁用 Gradio 默认的穿透服务
  3. 使用 ngrok 暴露本地端口
    假设 Gradio 服务在 http://127.0.0.1:7860 运行,使用以下命令启动 ngrok:

    1
    ngrok http 7860

    成功后,ngrok 将为你的服务分配一个临时公网地址,例如:

    1
    Forwarding   https://<generated-id>.ngrok.io -> http://127.0.0.1:7860
  4. 访问服务
    通过显示的 ngrok.io 地址即可从公网访问你的 Gradio 应用。

方法 3:使用 FRP(更适合自定义内网穿透)

FRP (Fast Reverse Proxy) 是一个强大的开源内网穿透工具,相比 ngrok 更适合自定义和长期搭建稳定的服务。

示例:

  1. 设置 FRP 服务端(公网服务器):
    配置一个 VPS 或其他服务器,运行 FRP 服务端,并设置 frps.ini

    1
    2
    [common]
    bind_port = 7000

    启动命令:

    1
    ./frps -c ./frps.ini
  2. 配置 FRP 客户端(你的本地主机):
    创建 frpc.ini 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    [common]
    server_addr = <your_public_server_ip>
    server_port = 7000

    [gradio]
    type = http
    local_port = 7860
    custom_domains = <your_custom_domain>

    启动命令:

    1
    ./frpc -c ./frpc.ini
  3. 访问服务
    配置完成后,可以通过你的公网服务器 IP 或自定义域名的 HTTP 地址访问 Gradio 应用。

方法 4:使用 Cloudflare Tunnel

Cloudflare 提供了免费的隧道服务,可以将本地服务安全地暴露给公网用户。

步骤:

  1. 安装 Cloudflare Tunnel CLI 工具
    安装 cloudflared。参考官方文档:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/

  2. 运行 Gradio 本地服务
    与之前一样,启动 Gradio,无需启用 share

    1
    iface.launch(share=False)
  3. 启动 Cloudflared 并连接本地服务
    假设 Gradio 运行在 http://127.0.0.1:7860,可以执行:

    1
    cloudflared tunnel --url http://127.0.0.1:7860

    执行完毕后,Cloudflare Tunnel 会为你分配一个临时的 *.trycloudflare.com 公网地址。

对比:

方法 优点 缺点
Gradio 默认 Share 快速简单,开箱即用 免费计划有频率限制,可能不适合生产环境
Ngrok 容易使用,支持更多配置 免费隧道地址是临时的,频率有限
FRP 自定义强,适合自建稳定服务 需要自行部署服务器,配置稍复杂
Cloudflare Tunnel 免费、稳定、安全 免费用户无法绑定自定义域名,受限于隧道规则

根据实际需求选择适合的方案即可!


内网穿透方案
https://schrodingerfish.github.io/2025/02/04/Web/内网穿透方案/
作者
Johnson
发布于
2025年2月4日
许可协议