首页 > 解决方案 > 无法通过节点应用程序代理 AWS EMR Jupyter-Notebook 的套接字。加载内核失败

问题描述

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

'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.jsexpresswebsocketjupyter-notebookamazon-emr

解决方案


这是一个有效的解决方案:

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
});

推荐阅读