ngrok实现内网穿透(以Python FastAPI为例)

文章目录

简介

内网穿透:让外网设备能够访问你家或公司局域网内部的设备

ngrok:把本地电脑上的服务,如 API 接口安全地暴露到公网的工具。在没有公网 IP、无法配置路由器的情况下,也能让外网访问到本地服务

ngrok 工作原理:由内网主动建立一个到公网服务器的加密隧道,所有外部流量都通过这个隧道转发到本地服务

还可以使用 Cloudflare Tunnel

安装

解压到某目录下,添加环境变量 Path

shell 复制代码
ngrok config add-authtoken xxx

初试

main.py

python 复制代码
import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def index():
    return {"Hello": "World"}


if __name__ == "__main__":
    uvicorn.run("main:app")

暴露 8000 端口

shell 复制代码
ngrok http 8000

访问 Forwarding 的链接

Visit Site

查看请求日志

http://127.0.0.1:4040

设置静态域

免费版只能 1 个静态随机域名

前后端分离

frontend.html

html 复制代码
<!doctype html>
<html>
<head><meta charset="utf-8"><title>demo</title></head>
<body>
  <button id="btn">调后端</button>
  <pre id="out"></pre>

  <script>
    const API = "https://thing-prance-spindle.ngrok-free.dev";

    document.getElementById("btn").onclick = async () => {
      const r = await fetch(API + "/hello", {
        headers: { "ngrok-skip-browser-warning": "1" }
      });
      const data = await r.json();
      document.getElementById("out").textContent = JSON.stringify(data, null, 2);
    };
  </script>
</body>
</html>

backend.py

python 复制代码
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
    allow_credentials=True,
)


@app.get("/hello")
def hello():
    return {"msg": "hello"}


app.mount("/", StaticFiles(directory=".", html=True), name="static")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

启动

shell 复制代码
python backend.py

映射

shell 复制代码
ngrok http 8000

访问 https://thing-prance-spindle.ngrok-free.dev/frontend.html

TODO:多隧道

免费版并发隧道可以 3 条

backend.py

python 复制代码

启动

shell 复制代码
python backend.py

frontend.html

html 复制代码

启动

shell 复制代码
python -m http.server 3000

修改 %USERPROFILE%\AppData\Local\ngrok\ngrok.yml

yaml 复制代码
version: "3"
agent:
    authtoken: 你的token
    
tunnels:
  backend:
    proto: http
    addr: 8000
    domain: 你的domain(如thing-prance-spindle.ngrok-free.dev)
    
  frontend:
    proto: http
    addr: 3000

启动

shell 复制代码
ngrok start backend frontend

ngrok start --all

参考文献

  1. ngrok
相关推荐
2601_962381868 小时前
python安装好了如何设置环境变量
python·开发工具·环境变量·虚拟环境·ide配置
小溪学编程8 小时前
Java ListIterator 接口详解:双向遍历与列表修改的利器
java·开发语言·windows
影视飓风TIM8 小时前
C++11 新特性:Lambda表达式、std::function与std::bind
开发语言·c++
sbjdhjd8 小时前
在 8 字符、字母数字过滤与 PHP 版本差异下复盘临时文件命令执行链 | (8字符绕过)
android·java·开发语言·安全·web安全·数据挖掘·php
小柯南敲键盘8 小时前
跨马翻译:跨境电商图片翻译工具,批量处理视频字幕与抠图
python·音视频
Hali_Botebie8 小时前
PyTorch 内存布局,.view()要合并哪两个维度(比如 B 和 G),这两个维度在内存里就必须“紧挨着”。
人工智能·pytorch·python
嘻哈baby8 小时前
FastAPI + SQLite 从 0 写一个真正能用的待办 API
数据库·sqlite·fastapi
统计学小王子8 小时前
数学建模国赛倒计时 1 天 ——《统计模型精讲(逐步回归 R 语言实战篇)》
开发语言·数学建模·r语言
用户019027581618 小时前
如何用 Python 算多只股票的相关性矩阵与组合波动率?
python
ttwuai8 小时前
Go 后台接入单点登录后,JWT、菜单权限和接口 403 怎么验?
开发语言·后端·golang