node.js - 无法通过节点应用程序代理 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);
任何帮助将不胜感激。
解决方案
这是一个有效的解决方案:
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
});
推荐阅读
- python - 如何跟踪 DCGAN 的损失
- javascript - React-Native:从父组件调用组件内的函数
- php - 我想在 cakephp 中创建 zip 文件。但是我的代码不起作用?
- apache - 如何在 Apache http server 2.4.43 中为特定端口记录所有 HTTP 标头
- javascript - 删除机器人消息和用户命令的 Discord.js 命令
- java - NOR、NAND 或 XNOR 的符号/方法/功能?
- django - 模型不渲染
- android - 带有协程的 liveData 仅第一次触发
- asp.net - Signal Hub 代理回调接收推送的对象为 Null
- sql - SQL中的棘手分区