对外部 node.js 套接字的网络访问被拒绝

Network access denied to external node.js socket

我在 Amazon 的 EC2 上有两台服务器 运行。一个是标准的 Web 服务器 运行 LAMP(在弹性负载均衡器后面),另一个是安装了 Express 和 socket.io 的 Node.js 服务器。在那个节点服务器上我有我的 server.js 文件(这个文件在服务器启动时自动加载)。

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(8080); 

io.on('connection', function (socket) { 
    socket.on('join', function() {
        console.log('joined');
    }
}

在 LAMP 服务器上,客户端通过以下方式连接到此外部服务器:

<script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>

var socket = io.connect('http://URL_HERE:8080');
socket.on('connect', function() {
    socket.emit('join', room_id);
});

但是,问题是控制台不断地吐出 ERR_NETWORK_ACCESS_DENIED,表明对该端口的访问被阻止。但是Node服务器的入站规则如下:

Custom TCP Rule -- TCP -- 8080 -- 0.0.0.0/0 (Anywhere)
HTTP            -- TCP -- 80   -- My IP
HTTPS           -- TCP -- 443  -- My IP

我已经或多或少地完全打开了入站端口,但都无济于事。人们访问客户端脚本(LAMP 服务器)的唯一方法是通过负载平衡器,这可能也毫无价值——您不能直接访问 LAMP 服务器。负载均衡器入站规则如下:

Custom TCP Rule -- TCP -- 8080 -- 0.0.0.0/0 (Anywhere)
HTTP            -- TCP -- 80   -- 0.0.0.0/0 (Anywhere)
HTTPS           -- TCP -- 443  -- 0.0.0.0/0 (Anywhere)

以及 LAMP 服务器的规则:

Custom TCP Rule -- TCP -- 8080 -- sg-elb_id
HTTP            -- TCP -- 80   -- sg-elb_id
HTTPS           -- TCP -- 443  -- sg-elb_id
... other irrelevant rules (SHH, MYSQL, ...)

有人知道为什么我会收到拒绝访问错误吗?节点服务器不在负载均衡器后面——它实际上完全在进程外部。所有安全组在出站规则方面不受限制。

原来是找不到全局安装的 express 或 socket.io 模块。执行 cd /var/www/html 然后 sudo npm link socket.io sudo npm link express 解决了问题。