你好吗?
我对我的(dockerized 与否)应用程序的外部访问有疑问。
我使用带有以下代码文件的 socket.io 进行了简单的 ping-pong 套接字通信:
服务器.js
let Server = require('socket.io')
const io = new Server().attach(8090)
io.on('connection', (socket) => {
console.log('connection')
socket.on('message', (msg) => {
console.log('< ' + msg)
console.log('> pong')
socket.emit('event', 'pong')
})
})
客户端.js
let host = process.argv[2]
let io = require("socket.io-client");
let client = io.connect(`http://${host}`)
let connected = false
client.on('connect', () => {
connected = true
})
client.on('event', (msg) => {
console.log('< ' + msg)
ping()
})
function ping () {
if (!connected) {
setTimeout(ping, 1000)
} else {
setTimeout(() => {
console.log('> ping')
client.emit('message', 'ping');
}, 1000)
}
}
ping()
随着我的服务器启动并运行,我可以执行客户端来测试通信,如下所示:
$ node client.js localhost:8090
并且输出与此类似:
> ping
< pong
> ping
< pong
> ping
< pong
... and so on
当我在我的 EC2 机器之外测试它(客户端和服务器)时,一切正常,但是当我将 server.js 部署到云并运行它时,我无法从外部访问它。
当我在端口 80 或 81 上绑定 nginx Web 服务并将每个请求代理到应用程序时,一切都从云外部开始正常工作,但在其他端口上仍然无法正常工作。
我的安全组是完全开放的(用于测试目的)(入站和出站允许所有端口上的任何地方(0.0.0.0/0,::/0)的所有流量)(附截图)。
可能对故障排除有用的事情:
- 当我在同一端口上使用节点尝试使用 NodeJS http 服务器(没有 nginx)时,它也不起作用(仅适用于 80 和 81)
- 我确定我的机器位于允许所有流量的“完全开放不安全”安全组中。
- 我的应用程序绑定到所有地址,因为我可以从云机器内部使用公共地址或本地主机连接到它。
- 当我从与 NodeJS 应用程序位于同一台计算机上的 nginx Web 服务器进行 proxy_pass 连接时,它仅适用于端口 80 和 81
任何帮助或故障排除建议将不胜感激。
非常感谢您的宝贵时间