无法通过节点应用程序代理AWS EMR Jupyter-Notebook的套接字。无法加载内核

问题描述 投票:1回答:1

我们拥有要用于代理在AWS EMR上运行的jupyter Notebook的节点应用程序。我可以使用http-proxy-middleware代理来自节点应用程序的所有http请求。但是由于某种原因,我无法代理网络套接字请求。因此,我能够创建一个新的笔记本,但无法启动内核。这是我的代理中间件

'use strict';
const proxy = require('http-proxy-middleware');

module.exports = proxy({
  target: 'http://<EMR master_node IP>:<Port>',
  ws: true,
  changeOrigin: true,
  // onProxyReq: (proxyReq, req, res) => {
  //   proxyReq.removeHeader('Upgrade');
  //   proxyReq.removeHeader('Connection');
  //   proxyReq.setHeader('Upgrade', 'websocket');
  //   proxyReq.setHeader('Connection', 'upgrade');
  // },
  secure: true,
  loglevel: 'debug'
});

我也尝试过手动添加标头,您会看到标头,但这无济于事。同样对于服务器应用程序,我已启用升级。

server.on('upgrade', proxy.upgrade);

任何帮助将不胜感激。

node.js express websocket jupyter-notebook amazon-emr
1个回答
0
投票

这是一个可行的解决方案:

handleRequestHeaders = function (proxyRequest, request) {

    proxyRequest.setHeader('Host', request.headers['host']) ;
    proxyRequest.setHeader('X-Forwarded-For', request.connection.remoteAddress) ;
    proxyRequest.setHeader('X-Real-IP', request.connection.remoteAddress)

    if (request.headers['upgrade']) {
        proxyRequest.setHeader('Upgrade', request.headers['upgrade']) ;
    }

    proxyRequest.setHeader('Connection', request.headers['upgrade'] ? 'upgrade' : 'close') ;

    proxyRequest.setHeader('Referer', 'http://localhost') ;
    proxyRequest.removeHeader('Origin') ;

}

module.exports = proxy({
    target: 'http://<EMR master_node IP>:<Port>',
    ws: true,
    changeOrigin: true,
    onProxyReq: handleRequestHeaders,
    onProxyReqWs handleRequestHeaders
});
© www.soinside.com 2019 - 2024. All rights reserved.