对外部 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
解决了问题。
我在 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
解决了问题。