Apache ProxyPass和Node.js - 不提供socket.io

时间:2015-10-29 22:09:58

标签: node.js apache socket.io proxypass

我正在尝试与现有的apache一起运行Node.js,并且在从Express.js服务器提供内容时遇到ProxyPass问题。看起来麻烦的是节点服务器在Apache转发时看到的请求。

我试过这个配置:

undefined

节点就像这样设置服务器:

<VirtualHost *:80>
    DocumentRoot "/var/www/html"
    ProxyPreserveHost on
    ProxyPass /node http://localhost:3000/
    ProxyPassReverse /node http://localhost:3000/
</VirtualHost>

我通过节点记录了这个:

var express = require('express')
, app = express()
, server = require('http').createServer(app)
, io = require("socket.io").listen(server) 

app.use(function(req, res, next){
    console.log(req.method, req.url); // log the method and route
    next();
});
app.use(express.static(__dirname + '/public'));
app.use('/components', express.static(__dirname + '/components'));
app.use('/js', express.static(__dirname + '/js'));

问题:当apache发送请求并且未提供socket.io库时,我得到一个额外的斜杠。如何让Apache在进入node.js之前删除前导斜杠?

1 个答案:

答案 0 :(得分:0)

我最终选择了HAProxy来坐在节点和apache前面;正如上面的评论所示。

这些是我使用的设置:

 frontend main
    bind *:80
    mode http
    default_backend apache

    acl is_node path_beg -i /node/
    use_backend node if is_node

    acl is_node_too path_beg -i /node
    use_backend node if is_node_too

    acl is_socket path_beg -i /socket.io/
    use_backend socketio if is_socket

    acl is_socketio_too path_beg -i /socket.io
    use_backend socketio if is_socketio_too

backend apache
    mode http
    balance     roundrobin
    server      apache localhost:81

backend node
    mode http
    balance     roundrobin
    server      node localhost:3000
    reqrep ^([^\ :]*)\ /node/(.*)     \1\ /\2
    reqrep ^([^\ :]*)\ /node(.*)     \1\ /\2

backend socketio
    mode http
    balance     roundrobin
    server      node localhost:3000
    reqrep ^([^\ :]*)\ /node/(.*)     \1\ /\2
    reqrep ^([^\ :]*)\ /node(.*)     \1\ /\2