NGINX与Express.js& socket.io |不能获取

时间:2016-12-14 12:07:21

标签: javascript node.js express nginx socket.io

我在端口3002上运行的Ubuntu服务器上设置了node/express.js/socket.io应用程序。我已打开机器上的所有端口。

当我去11.111.111.1:3002/时,一切都很完美(socket.io和express.js)。我试图将应用程序代理传递给/mediaDev/,这似乎有效,因为我收到了来自express.js或节点的错误消息:

  

"不能GET / mediaDev"

如果找不到节点应用,则返回502 Bad Gateway。

但是直接通过我的IP地址和端口直接进入应用程序,应用程序可以正常运行。

Simplified NGINX:

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name _;

  location ~ ^/mediaDev {
    proxy_pass http://localhost:3002;
  }
}

与服务内容相关的node.js:

var app = express()
app.user(bodyParser.urlencoded({ extended:false}))
app.use(bodyParser.json())

app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')

app.get('/', function (req, res) {
  res.render('index')
})

var server = app.listen(PORT, function () {
  console.log("listening on port 3002")
})

var io = require('socket.io')(server, {
  path: '/mediaDev/socket.io'
})

注意:在IP地址上,express.js和socket.io都正常工作。在实际域express上返回错误,但我的socket.io路径/mediaDev/socket.io仍然有效。

我觉得上面的内容有点奇怪。如果我通过/mediaDev传递代理并使我的socket.io路径/mediaDev/socket.io不应该出现错误而且实际上是/mediaDev/mediaDev/socket.io

2 个答案:

答案 0 :(得分:4)

对于NGINX,如果您向URI添加尾部斜杠(locationproxy_pass中)都很重要。如果正确设置,可以让它从请求路径中删除前缀。

试试这个:

location /mediaDev/ {
  proxy_pass http://localhost:3002/;
}

这样,对/mediaDev/的NGINX请求将被“翻译”为Express的“/”请求。它用作前缀,因此NGINX端的/mediaDev/socket.io将在Express端请求/socket.io

答案 1 :(得分:0)

发现执行以下操作可以为我提供所需的行为,但如果有人想要给出更好的答案,我觉得这个解决方案并不理想。

app.get('/mediaDev', function (req, res) {
  res.render('index')
})

这个方法似乎要求我将我想在nginx中使用的位置硬编码到我的node.js应用程序中。理想情况下,我希望有一个更模块化的解决方案。