http-proxy-rules 和 Websockets
http-proxy-rules and Websockets
我找不到任何 documentation/answer 满足我需要的东西。
我正处于困境中。我正在开发一个 websocket 应用程序,它将允许通过创建新服务(websocket 服务器)来扩展模块。当然,这意味着需要连接更多的端口。问题是,我们的公司政策只开放了很少的端口,所以我需要代理我的请求。
我看过很多回答说要使用 NGINX,但我就是做不到。首先我是 运行 windows,其次我们公司对什么能用什么不能用非常严格。不过,我可以安装任何节点模块。我试图将 http-proxy 模块与 http-proxy-rules 一起使用。
问题是,我在每个 websocket 请求上都收到 404。我会注意到默认代理(对于普通 Web 服务,而不是套接字)工作 100% 正常。
这是我当前的代码:
var http = require('http'),
httpProxy = require('http-proxy'),
HttpProxyRules = require('http-proxy-rules');
// Set up proxy rules instance
var proxyRules = new HttpProxyRules({
rules: {
'.*/ws/admin': 'http://localhost:26266', // Rule for websocket service (admin module)
'.*/ws/quickquery': 'http://localhost:26265' // Rule for websocket service (quickquery module)
},
default: 'http://Surface.levisinger.com:8080' // default target
});
// Create reverse proxy instance
var proxy = httpProxy.createProxy();
// Create http server that leverages reverse proxy instance
// and proxy rules to proxy requests to different targets
http.createServer(function(req, res) {
// a match method is exposed on the proxy rules instance
// to test a request to see if it matches against one of the specified rules
var target = proxyRules.match(req);
if (target) {
//console.log(req);
console.log("Returning " + target + " for " + req.headers.host);
return proxy.web(req, res, {
target: target,
ws: true
});
}
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('The request url and path did not match any of the listed rules!');
}).listen(5050);
我连接到 websocket 的客户端代码如下所示:
var servPath = (cliSettings["AppPaths"]["Admin"] == null) ? 'http://' + window.location.hostname + ':5050' : cliSettings["AppPaths"]["Admin"],
AdminIO = new io(servPath, {
extraHeaders: {
Service: "Admin"
},
path: '/ws/admin'})
...
websocket 服务器是这样调用的:
io = require('socket.io').listen(26266,{ path: '/ws/admin'}) // can use up to 26484
我真的希望这里有人能有想法。谢谢!
想出了如何做到这一点。这有几件事......
1. 如果你想代理它们,你必须使用自定义的 websocket 路径。
2. 代理它们时必须给出 websocket 的完整路径。
3. 您需要指定一个事件来处理 websocket (ws) 流量。
给大家举个例子
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
代理服务器:
var ini = require('node-ini'),
conf = ini.parseSync('../settings/config.ini'),
http = require('http'),
httpProxy = require('http-proxy'),
HttpProxyRules = require('http-proxy-rules');
// Set up proxy rules instance
var proxyRules = new HttpProxyRules({
rules: {
'.*/ws/remote': 'http://' + conf["Server"]["binding"] + ':26267/ws/remote',
'.*/ws/admin': 'http://' + conf["Server"]["binding"] + ':26266/ws/admin', // Rule for websocket service (admin module)
'.*/ws/quickquery': 'http://' + conf["Server"]["binding"] + ':26265/ws/quickquery' // Rule for websocket service (quickquery module)
},
default: 'http://' + conf["Server"]["binding"] + ':8080' // default target
});
// Create reverse proxy instance
var proxy = httpProxy.createProxy();
// Create http server that leverages reverse proxy instance
// and proxy rules to proxy requests to different targets
var proxyServer = http.createServer(function(req, res) {
// a match method is exposed on the proxy rules instance
// to test a request to see if it matches against one of the specified rules
var target = proxyRules.match(req);
if (target) {
//console.log(req.url);
//console.log("Returning " + target + " for " + req.url);
return proxy.web(req, res, {
target: target,
ws: true
});
}
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('The request url and path did not match any of the listed rules!');
}).listen(conf["Server"]["port"]);
//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
proxyServer.on('upgrade', function (req, socket, head) {
var target = proxyRules.match(req);
if (target) {
return proxy.ws(req, socket, head, { target: target });
}
});
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
Websocket 服务器套接字侦听器:
io = require('socket.io').listen(26266,{ path: '/ws/admin'});
从客户端页面连接到 websocket:
AdminIO = new io({path: '/ws/admin'});
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
上面的示例将通过端口 80 代理我的 "admin" 连接,即端口 26266 上的 运行。(我当然建议在任何情况下都使用 443/SSL,但那是有点复杂)。
希望这对某人有所帮助!
我找不到任何 documentation/answer 满足我需要的东西。
我正处于困境中。我正在开发一个 websocket 应用程序,它将允许通过创建新服务(websocket 服务器)来扩展模块。当然,这意味着需要连接更多的端口。问题是,我们的公司政策只开放了很少的端口,所以我需要代理我的请求。
我看过很多回答说要使用 NGINX,但我就是做不到。首先我是 运行 windows,其次我们公司对什么能用什么不能用非常严格。不过,我可以安装任何节点模块。我试图将 http-proxy 模块与 http-proxy-rules 一起使用。
问题是,我在每个 websocket 请求上都收到 404。我会注意到默认代理(对于普通 Web 服务,而不是套接字)工作 100% 正常。
这是我当前的代码:
var http = require('http'),
httpProxy = require('http-proxy'),
HttpProxyRules = require('http-proxy-rules');
// Set up proxy rules instance
var proxyRules = new HttpProxyRules({
rules: {
'.*/ws/admin': 'http://localhost:26266', // Rule for websocket service (admin module)
'.*/ws/quickquery': 'http://localhost:26265' // Rule for websocket service (quickquery module)
},
default: 'http://Surface.levisinger.com:8080' // default target
});
// Create reverse proxy instance
var proxy = httpProxy.createProxy();
// Create http server that leverages reverse proxy instance
// and proxy rules to proxy requests to different targets
http.createServer(function(req, res) {
// a match method is exposed on the proxy rules instance
// to test a request to see if it matches against one of the specified rules
var target = proxyRules.match(req);
if (target) {
//console.log(req);
console.log("Returning " + target + " for " + req.headers.host);
return proxy.web(req, res, {
target: target,
ws: true
});
}
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('The request url and path did not match any of the listed rules!');
}).listen(5050);
我连接到 websocket 的客户端代码如下所示:
var servPath = (cliSettings["AppPaths"]["Admin"] == null) ? 'http://' + window.location.hostname + ':5050' : cliSettings["AppPaths"]["Admin"],
AdminIO = new io(servPath, {
extraHeaders: {
Service: "Admin"
},
path: '/ws/admin'})
...
websocket 服务器是这样调用的:
io = require('socket.io').listen(26266,{ path: '/ws/admin'}) // can use up to 26484
我真的希望这里有人能有想法。谢谢!
想出了如何做到这一点。这有几件事...... 1. 如果你想代理它们,你必须使用自定义的 websocket 路径。 2. 代理它们时必须给出 websocket 的完整路径。 3. 您需要指定一个事件来处理 websocket (ws) 流量。
给大家举个例子
+++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++
代理服务器:
var ini = require('node-ini'),
conf = ini.parseSync('../settings/config.ini'),
http = require('http'),
httpProxy = require('http-proxy'),
HttpProxyRules = require('http-proxy-rules');
// Set up proxy rules instance
var proxyRules = new HttpProxyRules({
rules: {
'.*/ws/remote': 'http://' + conf["Server"]["binding"] + ':26267/ws/remote',
'.*/ws/admin': 'http://' + conf["Server"]["binding"] + ':26266/ws/admin', // Rule for websocket service (admin module)
'.*/ws/quickquery': 'http://' + conf["Server"]["binding"] + ':26265/ws/quickquery' // Rule for websocket service (quickquery module)
},
default: 'http://' + conf["Server"]["binding"] + ':8080' // default target
});
// Create reverse proxy instance
var proxy = httpProxy.createProxy();
// Create http server that leverages reverse proxy instance
// and proxy rules to proxy requests to different targets
var proxyServer = http.createServer(function(req, res) {
// a match method is exposed on the proxy rules instance
// to test a request to see if it matches against one of the specified rules
var target = proxyRules.match(req);
if (target) {
//console.log(req.url);
//console.log("Returning " + target + " for " + req.url);
return proxy.web(req, res, {
target: target,
ws: true
});
}
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('The request url and path did not match any of the listed rules!');
}).listen(conf["Server"]["port"]);
//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
proxyServer.on('upgrade', function (req, socket, head) {
var target = proxyRules.match(req);
if (target) {
return proxy.ws(req, socket, head, { target: target });
}
});
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
Websocket 服务器套接字侦听器:
io = require('socket.io').listen(26266,{ path: '/ws/admin'});
从客户端页面连接到 websocket:
AdminIO = new io({path: '/ws/admin'});
+++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++
上面的示例将通过端口 80 代理我的 "admin" 连接,即端口 26266 上的 运行。(我当然建议在任何情况下都使用 443/SSL,但那是有点复杂)。
希望这对某人有所帮助!