我想在我的笔记本电脑上运行一个 Node.js 网站,以便其他人可以访问它。我尝试过转发端口在我的路由器上,但它不起作用,因为我的 ISP 已停止向家庭用户提供公共 IP 地址。我能想到的另一个解决方案是使用Heroku举办某种类型的反向代理,通过该链接可以访问该网站。
我见过一些反向代理写成去和Node.js在新平台,但他们似乎使用单独的端口作为隧道和公共服务器,这Heroku 不允许。尽管 Heroku 只允许一个端口,但我仍然认为有一些方法可以实现它:
- 将第一个 websocket 用户视为客户端(网站)。
- 考虑具有特定 URL 的 websocket 用户作为客户端(网站)。
由于可能有多个用户同时连接到代理,因此可能有必要包含一个ID在对客户端(网站)的每个请求/响应中。
是否有一些软件包可以提供此功能,或者以其他方式允许客户端位于 NAT 后面,同时仍然只使用一个端口?
答案1
我记得小时候,我就开始寻找举办公共服务器从本地服务器在新平台。搜索关键词如下:
- 反向代理
- WS 隧道
- 反向 HTTP
- TCP 隧道
尝试过 ws-tunnel:
它需要一个分离端口为WebSocket 连接以及用于托管网络服务器。尽管这样也可以,Heroku只允许1 个端口可以使用,我不知道是否有其他云提供商将允许2 个公共端口(我觉得这是不可能的)。
尝试了反向http:
它可以充当反向 HTTP 客户端。反向 HTTP 是 IETF 提供的协议。但是,我需要一个反向 HTTP 服务器。然而,仍然存在一个问题反向 HTTP因为它只能流式传输一次一个请求。它基本上是一个反向的 HTTP 连接公共服务器到本地服务器。这意味着我必须以某种方式将多个用户的请求序列化到一个或多个连接(多个反向 HTTP 连接必须介于本地服务器和公共服务器)。
尝试使用 TCP 数据包:
然后我意识到可以使用单个连接和更简单的非缓冲代理方法来做到这一点。反向 HTTP如果有新的连接,可能需要缓冲,并且所有反向 HTTP 连接正在使用中。考虑使用以下格式的简单数据包:
--------------------------------------
| Packet Size | Connection ID | Data |
--------------------------------------
我正在寻找一种使用 WebSockets 来实现这一点的方法,看看他们是否有一些现有的功能可以使用,但后来我看到 Heroku 允许任何HTTP 升级,所以我决定改为使用 TCP 升级。我知道,这是我编造的。标头如下所示,我检查了 Heroku 是否接受它:
GET / HTTP/1.1
Upgrade: tcp
Connection: Upgrade
Origin: XXX
好的,现在有一个想法,你可以使用 TCP 升级本地服务器和公共服务器之间的连接,然后使用数据包进行通信。但是,数据包格式并没有告诉我们用户是连接了还是断开了。它只告诉我们用户发送了什么数据。所以我在数据包中添加了另一个字段:
----------------------------------------------
| Packet Size | Event | Connection ID | Data |
----------------------------------------------
尚未解决的一个问题是区分来自用户的连接和本地服务器的连接,因为我们对它们使用相同的端口。有很多方法可以做到这一点,但我决定使用一种特定于User-Agent
本地服务器的方法。
更多的疑问是,是否使用 Node 的 HTTP 或使用 Node 的 TCP 构建公共服务器代码。这次,我阅读了有关分块编码、预告片的内容,并决定最好使用 TCP。因此,我必须解析连接的初始请求,并根据确定的类型,将请求作为用户或本地服务器处理。但我想象会有一个性能问题,因为我将解析每个连接的 HTTP 标头。但如果我们使用一种罕见的 HTTP 方法进行快速区分,例如HEAD
,我们只需要读取 4 个字符。所以我们现在可以这样做:
1. If first 4 characters not HEAD, process as User.
2. Parse all the HTTP headers.
3. If User-Agent is special value, process as Local server
4. Process as User.
我现在还添加了对多个通道的支持,现在我可以作为在另一台机器(私有 IP)上运行的 SSH 服务器进行访问。移动代码并修饰 README:https://github.com/nodef/rhost。
我在搜索时发现了一些有趣的页面: