带有 Express.js 和 socket.io 的 NGINX | 不能获取

Phi*_*ide 1 javascript nginx node.js express socket.io

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

当我去11.111.111.1:3002/一切工作完美(socket.io 和 express.js)。我正在尝试代理传递/mediaDev/似乎可以工作的应用程序,因为我从 express.js 或节点收到一条错误消息,其中说:

“无法获取/mediaDev”

要么找不到节点应用程序返回 502 Bad Gateway。

但是直接通过我的 IP 地址和端口访问该应用程序,该应用程序按预期完美运行。

简化的 NGINX:

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

  server_name _;

  location ~ ^/mediaDev {
    proxy_pass http://localhost:3002;
  }
}
Run Code Online (Sandbox Code Playgroud)

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'
})
Run Code Online (Sandbox Code Playgroud)

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

我觉得上面说的有点奇怪。如果我是代理传递/mediaDev并制作我的 socket.io 路径,我/mediaDev/socket.io不应该期望错误并且实际上是在/mediaDev/mediaDev/socket.io

rob*_*lep 8

对于 NGINX,是否向 URI(inlocation和 in proxy_pass)添加尾部斜杠很重要。如果设置正确,您可以让它从请求路径中去除前缀​​。

尝试这个:

location /mediaDev/ {
  proxy_pass http://localhost:3002/;
}
Run Code Online (Sandbox Code Playgroud)

这样,对 NGINX for 的请求/mediaDev/将被“转换”为对 Express 的“/”请求。它作为前缀,所以/mediaDev/socket.io在 NGINX 端会/socket.io在 Express 端请求。