Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NGINX with Express.js&;socket.io无法获取_Javascript_Node.js_Express_Nginx_Socket.io - Fatal编程技术网

Javascript NGINX with Express.js&;socket.io无法获取

Javascript NGINX with Express.js&;socket.io无法获取,javascript,node.js,express,nginx,socket.io,Javascript,Node.js,Express,Nginx,Socket.io,我在运行端口3002的Ubuntu服务器上安装了一个节点/express.js/socket.io应用程序。我已经打开了机器上的所有端口 当我转到11.111.111.1:3002/时,一切都很好地工作(socket.io和express.js)。我正试图通过代理将应用程序传递到/mediaDev/,这似乎很有效,因为我从express.js或node收到一条错误消息,上面说: “无法获取/mediaDev” 其中,as或未找到节点应用程序返回502坏网关 但直接进入我的IP地址加端口的应用程序

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

当我转到
11.111.111.1:3002/
时,一切都很好地工作(socket.io和express.js)。我正试图通过代理将应用程序传递到
/mediaDev/
,这似乎很有效,因为我从express.js或node收到一条错误消息,上面说:

“无法获取/mediaDev”

其中,as或未找到节点应用程序返回502坏网关

但直接进入我的IP地址加端口的应用程序,该应用程序就像预期的那样完美工作

简化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

发现执行以下操作会给我所需的行为,但如果有人想给出更好的答案,我觉得这个解决方案不合适理想

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

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

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

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

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

对于NGINX,在URI中添加一个尾随斜杠很重要(在
位置和
代理过程中)。如果设置正确,可以让它从请求路径中删除前缀

试试这个:

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

这样,对NGINX的
/mediaDev/
请求将“转换”为对“/”的Express请求。它作为前缀,因此NGINX端的
/mediaDev/socket.io
将请求Express端的
/socket.io

对于NGINX,如果在URI中添加一个尾部斜杠(在
位置和
代理传递中都是如此)。如果设置正确,可以让它从请求路径中删除前缀

试试这个:

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

这样,对NGINX的
/mediaDev/
请求将“转换”为对“/”的Express请求。作为前缀,因此,NGINX端的
/mediaDev/socket.io
将请求Express端的
/socket.io

您是在尝试代理将整个连接传递到端口3002还是仅代理socket.io?整个连接您是在尝试代理将整个连接传递到端口3002还是仅代理socket.io?当我使用“;”时,整个连接使用尾随斜杠,我得到一个nginx错误。“proxy_pass”不能在正则表达式给定的位置中包含URI部分,或者在命名的locatoin中包含URI部分,或者……”@PhilipKirkbride,并且您也更改了
位置
?如果在我使用“;”时继续使用
~^/mediaDev
,我会得到一个nginx错误。“proxy_pass”“不能在正则表达式给定的位置中,或在名为locatoin的位置中,或……”PhilipKirkbride,您也更改了
位置
?如果继续使用
~^/mediaDev