簡體   English   中英

使用node-http-proxy代理同一子域下的節點服務器和websocket服務器

[英]Proxy a node server and websocket server under same subdomain with node-http-proxy

這是我的代理設置:

var express = require('express');
var vhost   = require('vhost');
var proxy   = require('http-proxy').createProxyServer();

var app = express();
var server = http.createServer(app);

// route api subdomain to port 2000
app.use(vhost('api.*.*', function(req, res) {
  proxy.web(req, res, {target: 'http://localhost:2000'});
}));

// I need to get websocket requests to ws://api.example.com proxied port 4000
server.on('upgrade', function(req, socket, head) {
  // proxy.ws seems like the right way to go, but how do I get this under the vhost?
  proxy.ws(req, socket, head);
});

// everything else goes to port 3000
app.get('*', function(req, res) {
  proxy.web(req, res, {target: 'http://localhost:3000'});
});

server.listen(80, function() {
  console.log('Proxy listening on port 80.');
});

我是否需要深入研究vhost處理程序內的req, res對象以路由套接字請求? 什么是正確的方法?

更新

不漂亮,但是我將嘗試一下。

server.on('upgrade', function(req, socket, head) {
  var host = req.headers.host;
  var parts = host.split('.');
  if (parts.length === 3 && parts[0] === 'api') {
    proxy.ws(req, socket, head, {target: {target: 'http://localhost:2000'});
  }
});

希望有一個更優雅的類似於vhost的解決方案。

事實如此簡單:

server.on('upgrade', vhost('api.*.*', function(req, socket, head) {
  proxy.ws(req, socket, head);
}));

vhost可以包裝在upgrade偵聽器中,就像可以用作http請求的中間件一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM