0

你好吗?

我对我的(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

任何帮助或故障排除建议将不胜感激。

非常感谢您的宝贵时间

以下是安全组定义的屏幕截图: 安全组规则

4

1 回答 1

0

我的问题解决了,这很尴尬。我的本地网络不允许在我提到的端口上进行出站连接。

如果您有同样的问题,我建议您测试您的本地网络。另外,检查您的 iptables 规则

于 2017-04-05T15:33:08.500 回答