我在亚马逊的EC2上运行了两台服务器。一个是运行LAMP的标准Web服务器(这是弹性负载平衡器的后面),另一个是安装了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
,表明对该端口的访问被阻止。但是,节点服务器的入站规则如下:
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, ...)
有谁知道为什么我会收到拒绝访问错误?节点服务器不在负载均衡器后面 - 它实际上完全在流程外部。所有安全组在出站规则方面都不受限制。
答案 0 :(得分:0)
原因是它无法找到全局安装的express或socket.io模块。执行Riri
然后cd /var/www/html
sudo npm link socket.io
解决了这个问题。