如何在HAProxy后面部署node.js表达应用程序?

时间:2014-03-14 19:19:29

标签: node.js express haproxy

我在端口3000上的machine1上运行了node.js express应用程序。我可以通过machine1:3000

成功访问我的应用程序

我在machine2上运行HAProxy。我更新了haproxy.cfg如下

frontend main *:80
    acl url_mynodeapp path_beg -i /mynodeapp

    use_backend mynodeapp if url_mynodeapp

backend mynodeapp
    mode http
    reqrep ^([^\ ]*\ /)mynodeapp[/]?(.*)     \1\2
    balance roundrobin
    server machine1 1.1.1.1:3000

我现在可以在machine2 / mynodeapp上点击我的应用程序了。但是现在所有相对链接都被破坏了,包括css和javascript(因为它们指向machine2而不是machine2 / mynodeapp)。

如何在代理后面部署快速应用程序?如何使用子文件夹部署快速应用程序?我来自java世界,所有web应用程序都在servlet容器内部名称间隔,从而为每个应用程序提供了自己的子文件夹。

谢谢,

内森

2 个答案:

答案 0 :(得分:0)

/mynodeapp不是子域名。它是一个子文件夹。子域名为mynodeapp.machine2

子域名托管在快递方面运作良好,因为这不是快递的工作,而是前端的。 只要您的前端一致地解析(它将与子域,而不是子文件夹),Express将从HAproxy接收预期的URL

答案 1 :(得分:0)

我能找到的唯一解决方案是手动设置节点应用程序以从子文件夹运行。

我使用了How to handle relative paths in node.js / express?提供的解决方案 和call functions from with ejs templates on node

var subfolder = '/mynodeapp';
app.set('view engine', 'ejs');
app.use(subfolder, app.router);
app.use(subfolder, express.static(__dirname + '/public'));
app.locals.createLink = function(uri) {
    return subfolder + uri;
}

然后在ejs视图中,通过函数调用createLink创建链接。

<script src="<%= createLink('/javascript/myjavascript.js') %>">
<a href="<%= createLink('/') %>">Home</a>

现在我在machine1:3000 / mynodeapp上运行了一个node.js express应用程序。

然后,我可以轻松地通过代理路由并访问我的应用程序在machine2 / mynodeapp。注意:在代理配置中,只需删除regrep行。