在 ServBay 中使用 Pinggy 实现本地网站和服务的公网访问
Pinggy 是一款极其简单易用的内网穿透工具,通过反向代理技术,可以将您运行在本地(如 ServBay 环境中)的 Web 服务安全地暴露到公网上。本指南将详细介绍如何在 ServBay 环境下使用 Pinggy,帮助开发者快速实现本地 Web 服务的互联网访问,以便于远程演示、团队协作或接收 Webhook 请求等。
技术原理
Pinggy 的核心原理是建立一个安全的 SSH 隧道。它将部署在本地(可能位于 NAT 或防火墙之后)的服务端口,通过 SSH 连接转发到 Pinggy 的公网服务器上。当公网用户访问 Pinggy 分配的 URL 时,请求会通过隧道安全地转发到您的本地服务。
在 ServBay 的应用场景中,这意味着您可以将 ServBay 中运行的某个本地 网站(例如:https://myproject.servbay.demo
)通过 Pinggy 映射到公网 URL,而无需复杂的端口映射或防火墙配置。
环境准备
使用 Pinggy 无需在本地安装任何额外的客户端软件。您只需要:
- ServBay 已安装并运行: 确保您的 ServBay 环境已正确安装,并且您想要暴露的本地 网站 或服务正在正常运行。
- 一个运行中的 ServBay 网站: 您需要在 ServBay 中配置并启动一个或多个本地 网站。通常,这些网站会通过 ServBay 内置的 Caddy 或 Nginx 服务器在本地的 80 (HTTP) 或 443 (HTTPS) 端口上监听请求。
- 支持 SSH 的终端: macOS 系统自带终端,或者您使用的其他终端模拟器均支持 SSH。
- 基础 SSH 知识: 了解如何在终端中执行 SSH 命令。
隧道配置实战
核心命令
使用 Pinggy 建立隧道非常简单,只需在终端中执行一条 SSH 命令。以下命令示例展示了如何将 ServBay 中配置的、通过本地 443 端口访问的 servbay.new
网站暴露到公网:
ssh -p 443 -R0:localhost:443 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -t [email protected] x:localServerTls:servbay.new "u:host:servbay.new"
重要提示: 上述命令中的 XXXXXXXXXXX
需要替换为您在 Pinggy 网站上获取的用户名(通常是一串字符)。命令中的 servbay.new
应该替换为您在 ServBay 中配置的、希望通过 Pinggy 暴露到公网的那个本地网站域名(例如:myproject.servbay.demo
)。
让我们详细解释一下这个命令的关键参数:
参数组件 | 功能说明 |
---|---|
-p 443 | 指定 SSH 连接到 Pinggy 服务器的端口为 443。使用 HTTPS 默认端口可以提高穿透防火墙的成功率。 |
-R0:localhost:443 | 这是远程端口转发的核心。0 表示让 Pinggy 服务器自动分配一个随机的公网端口。localhost:443 表示将所有到达 Pinggy 分配的公网端口的流量转发到本地计算机的 localhost 地址的 443 端口。ServBay 的 Caddy 或 Nginx 通常会监听本地的 443 端口处理 HTTPS 请求。 |
-o StrictHostKeyChecking=no | 禁用 SSH 主机密钥检查。在首次连接或测试时方便,但出于安全考虑,在生产环境或长期使用时,建议允许并验证主机密钥。 |
-o ServerAliveInterval=30 | 每 30 秒发送一次 keep-alive 消息,以防止 SSH 连接因长时间不活动而被服务器断开。 |
-t [email protected] | Pinggy 用户名和服务器地址。XXXXXXXXXXX 是您的 Pinggy 用户名。 |
x:localServerTls:servbay.new | 这是 Pinggy 的自定义参数,告诉 Pinggy 您本地的服务支持 TLS (HTTPS),并且其本地域名是 servbay.new (请替换为您自己的 ServBay 网站域名)。这有助于 Pinggy 正确处理 HTTPS 连接。 |
"u:host:servbay.new" | 这是另一个 Pinggy 自定义参数,用于修改转发请求的 HTTP Host 头部。它将传入请求的 Host 头部强制设置为 servbay.new (请替换为您自己的 ServBay 网站域名)。这对于 ServBay 中配置了多个网站(虚拟主机)的情况至关重要,因为它告诉 ServBay 的 Web 服务器应该响应哪个特定的本地网站。 |
命令运行成功后,Pinggy 会在终端中输出用于访问您的本地服务的公网 URL 地址,通常会提供 HTTP 和 HTTPS 两个地址,例如:
http://rnirh-172-188-50-148.a.free.pinggy.link
https://rnirh-172-188-50-148.a.free.pinggy.link
2
服务验证
隧道建立后,您可以通过以下方式验证公网访问是否成功:
通过
curl
验证 (推荐): 使用curl
命令并带上-I
参数(只获取头部信息)来测试公网 URL。请将示例 URL 替换为您 Pinggy 实际输出的 URL。bashcurl -I https://rnirh-172-188-50-148.a.free.pinggy.link
1如果一切正常,您将看到类似以下的 HTTP 头部输出,其中包含您本地 Web 服务器(如 Nginx 或 Caddy)的响应信息:
HTTP/1.1 200 OK Connection: close Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Access-Control-Allow-Origin: * Cache-Control: max-age=0, must-revalidate, no-cache, no-store, private Connection: keep-alive Content-Type: text/html; charset=UTF-8 Date: Tue, 18 Feb 2025 11:51:48 GMT # 日期可能会不同 Expires: Sun, 02 Jan 1990 00:00:00 GMT Pragma: no-cache Server: nginx # 或 caddy 等,取决于您的 ServBay 配置 Vary: Accept-Encoding X-Frame-Options: SAMEORIGIN X-Powered-By: PHP/8.4.3 # 或其他技术栈信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16看到
HTTP/1.1 200 OK
状态码和正确的Server
头部通常意味着连接成功并由您的本地 ServBay Web 服务器响应。浏览器访问: 直接在任何设备(包括非本地网络)的浏览器中打开 Pinggy 提供的 HTTPS URL(例如
https://rnirh-172-188-50-148.a.free.pinggy.link
)。您应该能看到与您在本地通过 ServBay 访问该网站时一致的内容。预期结果:
- 公网用户能够通过 Pinggy 提供的 URL 访问您的本地 ServBay 网站或服务。
- 如果您的本地服务配置了 HTTPS (ServBay 默认会为本地网站生成自签名证书),Pinggy 也会自动支持通过 HTTPS 进行公网访问,并提供免费的公共 CA 签发的证书,无需额外配置。
- 响应时间和稳定性取决于您的本地网络、到 Pinggy 服务器的网络状况以及 Pinggy 服务的负载。
高级技巧
暴露不同的本地端口或服务: 如果您的本地服务不是 Web 服务,或者 Web 服务监听在 ServBay 默认的 80/443 之外的其他端口,您可以修改
-R
参数。例如,要暴露本地的 8000 端口(例如一个 Python 或 Node.js 应用):bashssh -p 443 -R0:localhost:8000 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -t [email protected]
1请注意,对于非 Web 服务或不处理
Host
头的 Web 服务,您可能不需要x:localServerTls
和u:host
参数。自定义域名 (Pinggy Pro): 如果您是 Pinggy Pro 用户,可以使用自己的自定义域名来代替 Pinggy 分配的随机子域名,提供更专业的访问地址。详细配置方法请参考 Pinggy 官方文档。
持久化隧道 (使用
autossh
): SSH 连接可能会因为网络波动等原因断开。如果您需要长时间保持隧道开启,推荐使用autossh
工具。autossh
会监控 SSH 连接,并在断开时自动尝试重新建立连接。安装autossh
(例如在 macOS 上使用 Homebrew:brew install autossh
) 后,您可以这样使用它:bashautossh -M 0 -t "ssh -p 443 -R0:localhost:443 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -t [email protected] x:localServerTls:servbay.new \"u:host:servbay.new\""
1-M 0
参数告诉autossh
不使用额外的端口进行连接监控,而是依赖 SSH 自身的 keep-alive (ServerAliveInterval
) 进行监测。Token-less 命令: Pinggy 提供无需在命令中包含您的用户名/Token 的方式,只需访问其网站获取一次性命令即可。这在分享命令给他人使用时非常方便,无需担心 Token 泄露。
常见使用场景
- 远程演示: 向客户或团队成员展示您在本地 ServBay 环境中开发的网站或应用,无需部署到 staging 或生产环境。
- Webhook 调试: 接收来自第三方服务(如支付网关、GitHub 等)的 Webhook 请求,直接在本地环境中进行调试。
- 跨设备测试: 在不同的设备(手机、平板)上测试本地网站的响应式设计和兼容性,即使这些设备不在同一局域网。
- 团队协作: 方便团队成员访问和测试彼此在本地 ServBay 上运行的服务。
故障排查
现象 | 解决方案 |
---|---|
SSH 连接超时或失败 | 检查您的网络连接,确保可以访问 a.pinggy.io 。检查本地防火墙设置是否阻止了出站的 443 端口连接。确认 Pinggy 用户名是否正确。 |
Pinggy 分配的 URL 无法访问或返回错误 (如 502 Bad Gateway) | 检查 ServBay 中的本地网站或服务是否正在运行,并且正在监听 localhost:443 (或您在 -R 参数中指定的端口)。确保 ServBay 的 Web 服务器(Caddy/Nginx)配置正确。 |
访问 Pinggy URL 返回 404 错误 (Not Found) 或默认 ServBay 页面 | 如果您在 ServBay 中配置了多个网站(虚拟主机),请务必检查 SSH 命令中的 x:localServerTls 和 u:host 参数是否正确地设置为您希望暴露的那个本地网站的域名(例如 myproject.servbay.demo )。这是告诉 ServBay 的 Web 服务器应该响应哪个虚拟主机请求的关键。 |
间歇性断开 | 这可能是由于网络不稳定或 SSH 连接超时。尝试增加 ServerAliveInterval 的值,或使用 autossh 来自动重连(请参阅“高级技巧”部分)。 |
HTTPS 访问出现证书错误 | Pinggy 通常会为免费用户提供公共 CA 证书。如果您在 ServBay 本地使用的是自签名证书,浏览器可能会警告。Pinggy 的公共 CA 证书应该能解决公网访问时的证书警告问题。如果仍有问题,确认您在 ServBay 中暴露的服务确实在本地使用 HTTPS (监听 443 端口)。 |
方案总结
通过 Pinggy,ServBay 用户可以极其简单快捷地建立安全的公网访问通道,将本地开发的网站和应用暴露给外部世界。该方案具有以下显著优势:
- 无需安装客户端: 简化了配置和使用流程。
- 一键式操作: 通过一条简单的 SSH 命令即可启动隧道。
- 自动 HTTPS 支持: Pinggy 提供免费的公共 CA 证书,解决公网访问时的 HTTPS 证书问题。
- 支持 HTTP 和 TCP 隧道: 满足各种类型的服务暴露需求。
- 与 ServBay 高度兼容: 通过设置正确的
Host
头部,可以轻松暴露 ServBay 中配置的特定本地网站。 - Token-less 命令选项: 提高了分享命令的安全性。
相较于一些需要安装复杂客户端或配置文件的内网穿透工具,Pinggy 提供了一种更加轻量和便捷的方式,尤其适合 ServBay 开发者进行快速测试、演示和临时共享本地服务。对于需要长期稳定运行或使用自定义域名的商业场景,可以考虑 Pinggy 的付费计划。ServBay 强大的本地开发环境结合 Pinggy 的便捷公网访问能力,将大大提升您的开发和协作效率。