![访问服务器外部的本地主机](https://linux22.com/image/1545149/%E8%AE%BF%E9%97%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%96%E9%83%A8%E7%9A%84%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA.png)
我是 node.js 的新手,正在尝试掌握实际使用方法。我非常熟悉 JavaScript,因此该语言本身是不言自明的,但 Node.js 的使用与浏览器实现有很大不同。
我有自己的远程虚拟服务器,安装了 Node 和包管理器,一切运行正常。我并不是一名服务器专家,对终端和 Apache 配置的经验有限。
我可以使用以下方式运行我的服务器:
nodejs index.js
这给了我:listening on *:3300
正如预期的那样。
然后我可以使用以下命令从终端访问我的本地主机:curl http://localhost:3300/
这给了我期望的响应。
鉴于链接到我的服务器的网站是https://example.com
,我尝试使用 连接到该服务器,但http://example.com:3300/
没有成功,因为我只得到ERR_CONNECTION_TIMED_OUT
。我不确定如何访问它。
答案1
访问 localhost 不是问题,因为您已经在监听 *(即所有接口)。为了让任何人使用名称“example.com”访问您的服务器,它必须解析为一个可从客户端计算机到达您的服务器的 IP。这意味着什么取决于您的环境。
为了进行测试,如果您尝试从运行 node.js 的同一台计算机访问该站点(仅适用于测试),我建议将环回地址添加到系统 dns 名称缓存中。unix 上的 /etc/hosts 和大多数 windows 上的 Windows\system32\drivers\etc\hosts。如前所述,这仅适用于测试:将行:添加到127.0.0.1 example.com
文件末尾的一行中。
对于生产用途,以便其他人可以访问您的网站,您需要一个 dns(域名服务)提供商将您的名称绑定到您的公共 IP。这将花费大约 10 美元/年。您还需要一个未被其他人的 ISP 阻止的公共 IP,最好是一个不经常更改的 IP。这可以是便利重定向(不推荐,如果只是为了带宽和可用性限制)到小型托管应用程序(25-100 美元/年及以上,取决于空间和计算需求)。
这两种服务都是由云提供商提供的,只需搜索云托管服务即可。流行的提供商包括 go daddy 和 amazon web services。我对 AWS 的体验更好。
此外,将 nodejs 暴露给公共 ip 可能不是最好的主意。我进一步建议您研究一些中间件,例如 apache 或 nginx,以将您的应用程序包装在可以监听传统 http 请求的程序中。
编辑以回应评论:
在这种情况下,您需要在 apache 配置中定义部分 url 路径。这称为反向代理,这意味着您定义一条规则,规定哪些 url/请求应重定向(代理)到 node.js,apache 会将它们引导到那里。请参阅此处的 apache 文档和此 serverfault 问题:
https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html
请注意,apache 文档倾向于假设后端应用程序在另一台服务器上运行,但它对 localhost 的作用相同。您需要 proxypass 和 proxypassreverse 指令。
答案2
代替const hostname = '127.0.0.1';
做:const hostname = '0.0.0.0';