我试图通过一个NodeBB反向代理(https://docs.nodebb.org/configuring/proxies/node/)运行node.js
我已经遵循了所有的教程,提示/提示,但我仍然在经历与我的NodeBB服务器的websocket连接的问题,导致会话问题,无法登录等等。
我的设置如下:
应用程序1 - http://www.mywebsite.co.uk/
我正在使用‘http-代理’npm模块来代理任何将http://mywebsite.co.uk/forum加载到http://www.myforum.co.uk/forum的人。
这部分正在正常工作,资产负荷如预期。然而,NodeBB有一部分使用websockets来轮询论坛的功能,即用户会话。这个部分没有正确地代理,或者至少NodeBB响应是不正确的,因此给了我很多错误:
“您正在以未知的来源访问论坛。这可能会导致websockets无法连接。要修复此问题,请将
config.json中的config.json值设置为访问该站点的URL。有关详细信息,请参阅以下常见问题主题:https://community.nodebb.org/topic/13388”
另外:
“看来您与NodeBB的连接丢失了,请稍候,我们将尝试重新连接。”
而且,在网络面板中,许多“挂起”的请求最终由于来自NodeBB的空响应而失败。
http://mywebsite.co.uk/forum/socket.io/?EIO=3&transport=polling&t=MgJQSMk
App 2 - http://www.myforum.co.uk/forum
这个应用程序是一个基本的NodeBB安装运行,有一个插件- (https://github.com/julianlam/nodebb-plugin-session-sharing)
配置JSON文件如下(注意,URL是我的前端应用程序的URL,如代理时的说明所示)。
{
"url": "http://www.mywebsite.co.uk/forum",
"secret": "secret",
"database": "postgres",
"port": "4567",
"postgres": {
"host": "HOST",
"port": "PORT",
"password": "PASSWORD",
"database": "DATABASE"
}
}
应用程序1代码:
// app
const express = require("express");
const app = express();
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({ secret: 'secret', resave: true, saveUninitialized: true }));
//
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader(
"Access-Control-Allow-Methods",
"OPTIONS, GET, POST, PUT, PATCH, DELETE"
);
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
next();
});
// serve the content
app.use(express.static("dist"));
// Frontend
app.set('view engine', 'pug');
// serve out the api
// app.use ...
// Server set up
const httpProxy = require('http-proxy');
const HttpProxyRules = require('http-proxy-rules');
// Forum urls
let rules = {
rules: {
'/forum': 'http://www.myforum.co.uk/forum',
'/forum/*': 'http://www.myforum.co.uk/forum',
},
};
const proxyRules = new HttpProxyRules(rules);
const proxy = httpProxy.createProxy();
app.use(function (req, res, next) {
try {
if (req.url.includes("socket.io") === true) {
// console.log("SOCKET.IO", req.url)
return proxy.web(req, res, {
target: 'wss://www.myforum.co.uk',
ws: true,
changeOrigin: true
}, function (e) {
// console.log('PROXY ERR', e)
// next();
});
} else {
var target = proxyRules.match(req);
if (target) {
// console.log("TARGET", target, req.url)
return proxy.web(req, res, {
target: target,
changeOrigin: true
}, function (e) {
// console.log('PROXY ERR', e)
});
} else {
next();
}
}
} catch (e) {
// res.sendStatus(500);
res.json({ error: e });
}
});
// Frontend routes
// app.use ...
// HTTP
const http = require('http');
// Create server
mainserver = http.createServer(app);
const PORT = process.env.PORT || 3000;
mainserver.listen(PORT);
mainserver.on('listening', onListening);
mainserver.on('error', function (error, req, res) {
let json;
console.log('proxy error', error);
if (!res.headersSent) {
res.writeHead(500, { 'content-type': 'application/json' });
}
json = { error: 'proxy_error', reason: error.message };
res.end(JSON.stringify(json));
});
function onListening() {
console.log(`Listening on :${PORT}`);
}
发布于 2019-06-11 08:56:27
为了解决这个问题,我更改了我使用的代理模块。它使用更少的代码来实现和使用websockets。我认为NodeBB Node.js代理文档已经过时,所以我将使用我找到的新方法进行更新。
工作守则如下:
/**
* Proxy forum
*/
const proxy = require('http-proxy-middleware');
// Forum Proxy
app.use(
'/forum',
proxy({
target: 'http://www.myforum.co.uk/forum',
changeOrigin: true,
ws: true,
})
);这里另一个潜在的问题是,这个Prixy设置需要在‘body-解析器’模块上面声明(如果它正在使用的话)。错误的订单会阻止邮件请求被代理。
https://stackoverflow.com/questions/56028180
复制相似问题