我有一个使用socket.io通过websockets的应用程序。对于我的应用程序,我想使用一个单独的HTTP服务器来提供静态内容和JavaScript。因此,我需要放置代理。
我正在使用node-http-proxy。作为起点,我的websockets应用程序正在8081端口上运行。我正在使用以下代码将socket.io通信重定向到这个独立服务器,同时使用express提供静态内容:
var http = require('http'),
httpProxy = require('http-proxy'),
express = require('express');
// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });
// proxy HTTP GET / POST
app.get('/socket.io/*', function(req, res) {
console.log("proxying GET request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
console.log("proxying POST request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
// Proxy websockets
app.on('upgrade', function (req, socket, head) {
console.log("proxying upgrade request", req.url);
proxy.ws(req, socket, head);
});
// serve static content
app.use('/', express.static(__dirname + "/public"));
app.listen(8080);
上述应用程序运行得很正常,然而我发现socket.io不再使用WebSockets,而是退而求其次采用XHR轮询。
从代理代码的日志记录中可以确认这一点:
proxying GET request /socket.io/1/?t=1391781619101
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying POST request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=1391781629
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
有没有人知道如何代理Web Sockets通信?所有来自node-http-proxy
的示例都假设您想代理所有流量,而不是代理一些并服务其他流量。