为什么云服务器上启动的Node服务通过公网IP+端口访问不到?

新手上路,请多包涵

云服务器上启动的node服务为什么访问不到?
写了一个node服务,通过宝塔挂到阿里云服务器上。
服务端口是4173,但通过 公网ip:4173 的形式却访问不到。这是为什么?

蹲个大佬谢谢 orz

然后用nginx配置了一下,4173端口自己代理到自己就可以访问到。这又是怎么回事?
nginx配置如下

    server {
      listen 4173;
      server_name anonymous;
      location / {
        proxy_pass http://localhost:4173;
      }
    }

蹲大佬 orz

阅读 175
avatarAI BotBETA

回答

可能有以下几个原因导致你在云服务器上启动的Node服务通过公网IP+端口访问不到,但通过Nginx代理后可以访问:

  1. 防火墙设置

    • 云服务器防火墙:确保云服务器的防火墙规则允许从你的客户端IP到服务器4173端口的流量。
    • 本地防火墙:如果Node服务运行在服务器上的特定用户空间,可能还需要检查并配置该用户空间的防火墙设置。
  2. 安全组规则

    • 如果你使用的是阿里云等云服务提供商,需要确保安全组规则允许从你的客户端IP地址到服务器的4173端口的入站流量。
  3. Node服务绑定问题

    • 确保Node服务是绑定在0.0.0.0(表示所有可用网络接口)或具体的公网IP上,而不是仅绑定在localhost127.0.0.1上。
  4. 云服务提供商的网络配置

    • 某些云服务提供商可能默认不允许直接访问某些端口,或者需要特定的配置才能开放端口。
  5. Nginx代理的作用

    • Nginx配置中的proxy_pass http://localhost:4173;表明Nginx在本地回环接口(localhost)上代理请求到Node服务。这种方式通常可以绕过一些直接访问的限制,因为Nginx已经在服务器上运行并有权访问本地服务。
    • 当通过Nginx访问时,请求先到达服务器的4173端口(由Nginx监听),然后Nginx将请求转发到localhost:4173,这通常可以成功,因为Node服务正在本地运行。

解决步骤

  1. 检查并配置防火墙

    • 确保服务器防火墙和安全组规则允许4173端口的入站流量。
  2. 检查Node服务绑定

    • 确保Node服务绑定在正确的IP地址上(通常是0.0.0.0)。
  3. 检查云服务提供商的网络配置

    • 查阅云服务提供商的文档,确认是否有关于端口访问的特定配置要求。
  4. 使用Nginx作为代理

    • 如果直接访问仍然有问题,可以继续使用Nginx作为反向代理,因为这种方式通常更稳定且能提供更多功能(如负载均衡、SSL终止等)。

通过这些步骤,你应该能够诊断并解决Node服务无法通过公网IP+端口直接访问的问题。

2 个回答

是不是防火墙没有把端口放开, 你去云服务器厂商找到防火墙入口将4173端口开放,我这个是腾讯云的,各大厂商入口不同
image.png

1. 安全组规则

确保阿里云实例的安全组规则允许入站流量通过4173端口。

操作步骤

  1. 登录到阿里云控制台。
  2. 找到实例并进入“网络与安全”部分。
  3. 找到“安全组”并点击进入。
  4. 添加一条安全组规则:

    • 协议类型:TCP
    • 端口范围:4173
    • 授权对象:0.0.0.0/0(表示允许所有IP地址访问)

2. 防火墙设置

如果实例上有防火墙(例如 iptables),确保它允许4173端口的流量。

操作步骤

  1. 使用以下命令检查和添加规则:

    sudo iptables -A INPUT -p tcp --dport 4173 -j ACCEPT
    sudo service iptables save
    sudo service iptables restart
  2. 确保规则保存并生效。

3. Node服务绑定

确保Node服务绑定在 0.0.0.0 或服务器的公网IP上,而不是 localhost127.0.0.1。这样可以确保服务可以通过外部网络访问。

操作步骤

  1. 在Node.js应用中,监听 0.0.0.0 或服务器的公网IP:

    const express = require('express');
    const app = express();
    
    // 假设服务器端口是 4173
    const PORT = 4173;
    
    app.listen(PORT, '0.0.0.0', () => {
      console.log(`Server is running on port ${PORT}`);
    });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏