【问题标题】:Nodejs proxy to another portNodejs代理到另一个端口
【发布时间】:2014-09-06 18:05:51
【问题描述】:

我想在我的服务器上运行一个节点进程。

http://mysite.me:80/ 的请求应发送至http://localhost:8000

http://mysite.me:80/xxx 的请求应发送至http://localhost:8001

我曾经做过这样的事情:

httpProxy = require('http-proxy');
var options = {
    router: {
        'mysite.me': 'localhost:8000',
        'mysite.me/xxx': 'localhost:8001'
    }
};
httpProxy.createServer(options).listen(80)

但我知道“路由器”现在已被弃用。

我已经在这玩了好几个小时了!

【问题讨论】:

    标签: node.js proxy


    【解决方案1】:

    好的,所以我已经完成了所有工作......

    修改 apache2 使其只监听环回接口:

    vim /etc/apache2/ports.conf

    将“听 80”改为“听 127.0.0.1:80”

    让你的 socket.io 服务器(“server.js”)监听 8001 端口:

    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(8001);
    
    io.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      /*socket.on('my other event', function (data) {
        console.log(data);
      });*/
    });
    

    node server.js

    现在您需要一个代理 ("proxy.js") 监听您的公共接口 (x.x.x.x:80)

    它会根据需要在 apache2 和 socket.io 之间拆分流量

    var http      = require('http');
    var httpProxy = require('http-proxy');
    
    var routes = [
      'http://127.0.0.1:80',
      'http://127.0.0.1:8001'
    ];
    
    var proxy = new httpProxy.createProxyServer({});
    
    var proxyServer = http.createServer(function (req, res) {
        var route=0;
        var split1=req.url.split('/');
        if (split1.length>0) {
            if(split1[1]=="socket.io"){   //requests to "socket.io" get tapped off to nodejs
                route=1;
            }
        }
    
        proxy.web(req, res, {target: routes[route]});
    });
    proxyServer.on('upgrade', function (req, socket, head) {
        proxy.ws(req, socket, head, {target: routes[1]});
    });
    proxyServer.listen(80,"x.x.x.x");
    //proxyServer.listen(80,"ip:v6:address");   //optional...
    

    sudo node proxy.js

    这是网页的 HTML/jQuery:

    <script src="./lib/socket.io/socket.io-1.1.0.js"></script>
    <script>
    $(document).ready(function(){
        var socket = io.connect('http://www.mysite.me:80');   //where mysite.me resolves to x.x.x.x
        socket.on('news', function (data) {
            console.log(data);
            socket.emit('my other event', { my: 'data' });
        });
    });
    </script>
    

    现在我需要一种方法来确定如何确保 proxy.js 不会崩溃并且是防锤的!

    【讨论】:

    • 我建议把apache换成nginx,这样更合适。
    • 是的,但是我已经习惯了 Apache2,并且我在此服务器上运行了其他为 Apache2 设置的站点。我知道 nginx 是优越的,只是我还没有准备好改变!
    • 废弃上面的代码。这是 much 更清洁的 Apache2/socket.io 解决方案:serverfault.com/questions/616370/…
    【解决方案2】:

    我将它用于反向代理。使用节点 v8.1.3 测试。

    使用内置http.request的解决方案

    #!/usr/bin/env node
    
    http = require('http')
    http.createServer((req, res) => {
      var port = (/\/xxx/.test(req.url)) ? 8001 : 8002
      _req = http.request(
        {port, path:req.url, headers:req.headers, method:req.method}, 
        (_res) => {
          res.writeHead(_res.statusCode, _res.headers)
          _res.pipe(res)
        }
      )
      _req.on('error', (e) => {
          console.error('proxied request failed: '+e.message)
          res.writeHead(500)
          res.end()
      })
      req.pipe(_req)
    }).listen(80, () => console.log('listening on port 80...'))
    
    // for verfication purpose only:
    http.createServer((req, res) => {res.writeHead(200);res.end('server on 8001')}).listen(8001)
    http.createServer((req, res) => {res.writeHead(200);res.end('server on 8002')}).listen(8002)
    

    将其放入文件 proxy.js 并尝试:

    sudo node proxy.js &
    

    服务器启动后:

    curl localhost/xxx
    curl localhost
    

    关于 sudo 的注意事项

    我不建议以 root 用户身份运行脚本。尽管如此,要使用端口 80,我个人使用的是

    sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to-destination 127.0.0.1:8080
    

    欢迎提出更好的建议。

    这个答案来自this answer

    【讨论】:

      猜你喜欢
      • 2017-02-26
      • 2021-11-04
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2017-09-07
      相关资源
      最近更新 更多