我们拥有要用于代理在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);
任何帮助将不胜感激。
这是一个可行的解决方案:
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
});