<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Webhook | 林子杨的个人网站</title><link>https://ziyanglin.netlify.app/zh/tags/webhook/</link><atom:link href="https://ziyanglin.netlify.app/zh/tags/webhook/index.xml" rel="self" type="application/rss+xml"/><description>Webhook</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh-Hans</language><lastBuildDate>Fri, 27 Jun 2025 01:00:00 +0000</lastBuildDate><image><url>https://ziyanglin.netlify.app/img/icon-192.png</url><title>Webhook</title><link>https://ziyanglin.netlify.app/zh/tags/webhook/</link></image><item><title>ngrok技术指南：本地服务的公网映射与隧道技术详解</title><link>https://ziyanglin.netlify.app/zh/post/ngrok-documentation/</link><pubDate>Fri, 27 Jun 2025 01:00:00 +0000</pubDate><guid>https://ziyanglin.netlify.app/zh/post/ngrok-documentation/</guid><description>&lt;h2 id="1-">1. 简介&lt;/h2>
&lt;h3 id="11-ngrok-">1.1 ngrok 是什么？&lt;/h3>
&lt;p>ngrok 是一个强大的反向代理工具，它可以将你的本地开发环境暴露在公网上。通过创建一个安全的隧道，ngrok 能够将公网的请求转发到你本地机器上运行的服务。这使得在开发和测试阶段与外部服务（如 Webhooks、APIs）集成变得异常简单。&lt;/p>
&lt;h3 id="12-">1.2 工作原理&lt;/h3>
&lt;p>ngrok 的工作原理可以概括为以下几个步骤：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>启动 ngrok 客户端&lt;/strong>：你在本地机器上运行 ngrok 客户端，并指定要暴露的本地端口。&lt;/li>
&lt;li>&lt;strong>建立安全隧道&lt;/strong>：ngrok 客户端连接到 ngrok 云服务，并建立一个安全的加密隧道。&lt;/li>
&lt;li>&lt;strong>分配公网地址&lt;/strong>：ngrok 云服务会为你分配一个唯一的公网 URL（例如 &lt;code>https://random-string.ngrok.io&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>请求转发&lt;/strong>：当有请求发送到这个公网 URL 时，ngrok 云服务会通过隧道将请求转发到你本地的 ngrok 客户端。&lt;/li>
&lt;li>&lt;strong>访问本地服务&lt;/strong>：ngrok 客户端再将请求转发到你指定的本地端口上运行的服务。&lt;/li>
&lt;/ol>
&lt;pre>&lt;code class="language-mermaid">sequenceDiagram
participant User as 用户/外部服务
participant NgrokCloud as ngrok 云服务
participant NgrokClient as 本地 ngrok 客户端
participant LocalServer as 本地 Web 服务
User-&amp;gt;&amp;gt;NgrokCloud: 请求 https://&amp;lt;subdomain&amp;gt;.ngrok.io
NgrokCloud-&amp;gt;&amp;gt;NgrokClient: 通过安全隧道转发请求
NgrokClient-&amp;gt;&amp;gt;LocalServer: 请求 http://localhost:&amp;lt;port&amp;gt;
LocalServer--&amp;gt;&amp;gt;NgrokClient: 返回响应
NgrokClient--&amp;gt;&amp;gt;NgrokCloud: 通过安全隧道返回响应
NgrokCloud--&amp;gt;&amp;gt;User: 返回最终响应
&lt;/code>&lt;/pre>
&lt;h3 id="13--ngrok">1.3 为什么使用 ngrok？&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Webhook 开发&lt;/strong>：在本地开发和测试需要接收 Webhook 的应用（如 GitHub、Stripe、Twilio）。&lt;/li>
&lt;li>&lt;strong>API 测试&lt;/strong>：让移动应用或其他外部服务可以访问你本地正在开发的 API。&lt;/li>
&lt;li>&lt;strong>项目演示&lt;/strong>：向客户或同事快速演示一个正在开发中的网站或应用，而无需部署到服务器。&lt;/li>
&lt;li>&lt;strong>调试&lt;/strong>：捕获和检查所有通过隧道的 HTTP 请求和响应，方便调试。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-">2. 快速入门&lt;/h2>
&lt;h3 id="21-">2.1 下载和安装&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>访问官网&lt;/strong>：前往 &lt;a href="https://ngrok.com/download">ngrok 官网&lt;/a>。&lt;/li>
&lt;li>&lt;strong>下载客户端&lt;/strong>：根据你的操作系统（Windows、macOS、Linux）下载对应的 ngrok 客户端。&lt;/li>
&lt;li>&lt;strong>解压文件&lt;/strong>：下载完成后，解压压缩包。你会得到一个名为 &lt;code>ngrok&lt;/code> 的可执行文件。&lt;/li>
&lt;/ol>
&lt;h3 id="22--authtoken">2.2 账户和 Authtoken&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>注册账户&lt;/strong>：在 &lt;a href="https://dashboard.ngrok.com/signup">ngrok 官网&lt;/a> 注册一个免费账户。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>获取 Authtoken&lt;/strong>：登录后，在你的 &lt;a href="https://dashboard.ngrok.com/get-started/your-authtoken">dashboard&lt;/a> 页面找到你的 Authtoken。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置 Authtoken&lt;/strong>：打开终端，进入 ngrok 可执行文件所在的目录，运行以下命令将 Authtoken 添加到默认的配置文件 &lt;code>ngrok.yml&lt;/code> 中：&lt;/p>
&lt;pre>&lt;code class="language-bash">./ngrok config add-authtoken &amp;lt;YOUR_AUTHTOKEN&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>配置 Authtoken 后，你将能够使用更多的功能，如自定义子域名、更长的会话时间等。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="23-">2.3 建立你的第一个隧道&lt;/h3>
&lt;p>假设你本地有一个在 &lt;code>8000&lt;/code> 端口上运行的 Web 服务，你可以使用以下命令来为它创建一个公网隧道：&lt;/p>
&lt;pre>&lt;code class="language-bash">./ngrok http 8000
&lt;/code>&lt;/pre>
&lt;p>命令执行后，你会在终端看到类似下面的输出：&lt;/p>
&lt;pre>&lt;code>ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account Your Name (Plan: Free)
Version 3.x.x
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding https://9a1b-2c3d-4e5f-6a7b-8c9d.ngrok.io -&amp;gt; http://localhost:8000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
&lt;/code>&lt;/pre>
&lt;p>现在，你就可以通过 &lt;code>https://9a1b-2c3d-4e5f-6a7b-8c9d.ngrok.io&lt;/code> 这个公网地址访问你本地 &lt;code>8000&lt;/code> 端口的服务了。&lt;/p>
&lt;p>同时，你也可以通过浏览器访问 &lt;code>http://127.0.0.1:4040&lt;/code> 来打开 ngrok 的 Web 界面，在这里你可以查看所有通过隧道的请求和响应详情。&lt;/p>
&lt;hr>
&lt;h2 id="3-">3. 核心概念&lt;/h2>
&lt;h3 id="31-">3.1 隧道协议&lt;/h3>
&lt;p>ngrok 支持多种协议来创建隧道：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>HTTP/HTTPS&lt;/strong>：最常用的协议，用于暴露 Web 服务。&lt;/p>
&lt;pre>&lt;code class="language-bash"># 暴露本地 80 端口的 HTTP 服务
ngrok http 80
# 暴露本地 3000 端口的 HTTPS 服务
ngrok http https://localhost:3000
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>TCP&lt;/strong>：用于暴露非 HTTP 的服务，如 SSH、数据库连接、游戏服务器等。&lt;/p>
&lt;pre>&lt;code class="language-bash"># 暴露本地 22 端口的 SSH 服务
ngrok tcp 22
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>TLS&lt;/strong>：用于暴露需要端到端 TLS 加密的 TCP 服务。&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok tls --domain=your-domain.com 443
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;h3 id="32-">3.2 自定义域名&lt;/h3>
&lt;p>对于付费用户，ngrok 允许你使用自定义的子域名或完全自定义的域名。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>自定义子域名&lt;/strong>：&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --subdomain=my-awesome-app 8080
&lt;/code>&lt;/pre>
&lt;p>这会将你的服务暴露在 &lt;code>https://my-awesome-app.ngrok.io&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>自定义域名&lt;/strong> (需要付费计划和 CNAME 配置):&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --hostname=dev.example.com 80
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-">4. 高级用法&lt;/h2>
&lt;h3 id="41-">4.1 配置文件&lt;/h3>
&lt;p>除了在命令行中指定参数，你还可以通过 &lt;code>ngrok.yml&lt;/code> 配置文件来定义隧道。这对于管理多个隧道和复杂的配置非常有用。&lt;/p>
&lt;p>默认情况下，配置文件位于：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>macOS&lt;/strong>: &lt;code>~/Library/Application Support/ngrok/ngrok.yml&lt;/code>&lt;/li>
&lt;li>&lt;strong>Linux&lt;/strong>: &lt;code>~/.config/ngrok/ngrok.yml&lt;/code>&lt;/li>
&lt;li>&lt;strong>Windows&lt;/strong>: &lt;code>C:\Users\YourUser\AppData\Local\ngrok\ngrok.yml&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>一个配置文件的示例：&lt;/p>
&lt;pre>&lt;code class="language-yaml">version: &amp;quot;2&amp;quot;
authtoken: &amp;lt;YOUR_AUTHTOKEN&amp;gt;
tunnels:
my-api:
proto: http
addr: 8080
subdomain: my-cool-api
ssh:
proto: tcp
addr: 22
&lt;/code>&lt;/pre>
&lt;p>配置好后，你可以通过名称来启动隧道：&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok start my-api
ngrok start ssh
ngrok start --all # 启动所有定义的隧道
&lt;/code>&lt;/pre>
&lt;h3 id="42-">4.2 安全选项&lt;/h3>
&lt;p>ngrok 提供了多种安全功能来保护你的隧道：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>HTTP 基本认证&lt;/strong>：为你的隧道添加用户名和密码保护。&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --basic-auth=&amp;quot;username:password&amp;quot; 8000
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>OAuth 2.0&lt;/strong> (付费功能): 与 Google, GitHub, Microsoft 等 OAuth 提供商集成，只有通过身份验证的用户才能访问你的隧道。&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --oauth=google --oauth-allow-emails=user@example.com 8000
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>IP 限制&lt;/strong> (付费功能): 只允许或拒绝特定 IP 地址或 CIDR 范围的访问。&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --ip-restriction-allow-cidrs=203.0.113.0/24 8000
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;h3 id="43-webhook--">4.3 Webhook 验证 (付费功能)&lt;/h3>
&lt;p>ngrok 可以自动验证来自某些服务（如 Twilio, Stripe）的 Webhook 请求的签名，增加安全性。&lt;/p>
&lt;pre>&lt;code class="language-bash">ngrok http --verify-webhook=twilio --verify-webhook-secret=&amp;lt;YOUR_SECRET&amp;gt; 8000
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="5-api-">5. API 和集成&lt;/h2>
&lt;p>ngrok 提供了官方的客户端库，可以让你以编程方式控制隧道。&lt;code>@ngrok/ngrok&lt;/code> 是官方的 Node.js 库。&lt;/p>
&lt;h3 id="51-">5.1 安装&lt;/h3>
&lt;pre>&lt;code class="language-bash">npm install @ngrok/ngrok
&lt;/code>&lt;/pre>
&lt;h3 id="52--nodejs-">5.2 示例：在 Node.js 应用中启动隧道&lt;/h3>
&lt;pre>&lt;code class="language-javascript">const ngrok = require(&amp;quot;@ngrok/ngrok&amp;quot;);
// 设置 Express 应用
const express = require('express');
const app = express();
const port = 8080;
app.get('/', (req, res) =&amp;gt; {
res.send('Hello from local server!');
});
app.listen(port, async () =&amp;gt; {
console.log(`Local server listening at http://localhost:${port}`);
// 启动 ngrok 隧道
try {
const listener = await ngrok.forward({
addr: port,
authtoken_from_env: true, // 从 NGROK_AUTHTOKEN 环境变量读取
});
console.log(`Ingress established at: ${listener.url()}`);
} catch (error) {
console.error(&amp;quot;Error establishing ngrok tunnel:&amp;quot;, error);
}
});
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="6--faq">6. 常见问题解答 (FAQ)&lt;/h2>
&lt;p>&lt;strong>Q: ngrok 隧道的地址是固定的吗？&lt;/strong>
A: 在免费计划中，每次重启 ngrok 客户端，你都会得到一个新的随机 URL。付费计划的用户可以使用固定的子域名或自定义域名。&lt;/p>
&lt;p>&lt;strong>Q: 如何在后台运行 ngrok？&lt;/strong>
A: 在 Linux 或 macOS 上，你可以使用 &lt;code>&amp;amp;&lt;/code> 将其置于后台：&lt;code>./ngrok http 8000 &amp;amp;&lt;/code>。对于更稳定的方案，建议使用 &lt;code>systemd&lt;/code> 或 &lt;code>supervisor&lt;/code> 等工具来管理 ngrok 进程。&lt;/p>
&lt;p>&lt;strong>Q: 免费版和付费版有什么主要区别？&lt;/strong>
A: 付费版提供更多高级功能，包括：&lt;/p>
&lt;ul>
&lt;li>自定义/固定子域名&lt;/li>
&lt;li>自定义域名&lt;/li>
&lt;li>更多的并发隧道&lt;/li>
&lt;li>IP 白名单/黑名单&lt;/li>
&lt;li>OAuth 集成&lt;/li>
&lt;li>更长的会v话超时时间&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Q: 我可以同时运行多个隧道吗？&lt;/strong>
A: 可以。你可以在配置文件中定义多个隧道并使用 &lt;code>ngrok start --all&lt;/code> 启动，或者打开多个终端窗口分别运行 &lt;code>ngrok&lt;/code> 命令。免费版对并发隧道的数量有限制。&lt;/p></description></item></channel></rss>