当使用forever.js托管时,基本节点网站返回“无法获取/”

时间:2012-07-23 11:55:48

标签: node.js express node-http-proxy

我正在努力建立我的第一个生产节点网站(在我的生产网络服务器上只是一个基本的hello世界)。

以下是我正在使用的(基本的http代理将apache网站传递到端口:9000和节点网站到端口:8000)。我知道这部分是有效的,因为apache vhosts正如我所期望的那样被转发。然而,什么不起作用的是节点部分 - 我得到下面的错误

"Cannot GET /"

这是在Ubuntu 12.04上运行节点0.8.1

我用forever.js托管这个(永远启动foo.js)。当我回应NODE_ENV时 - 显示“生产”

还可能会注意到我在路径上没有node_modules(正如您在我的require语句中看到的那样)**不确定这是否与我的问题有关

var httpProxy = require('/usr/local/lib/node_modules/http-proxy/lib/node-http-proxy');
var express = require('/usr/local/lib/node_modules/express/lib/express');

httpProxy.createServer(function (req, res, proxy) {

    var nodeVhosts = ['www.mysite.com'];
    var host = req.headers['host'];
    var port = nodeVhosts.indexOf(host) > -1
        ? 8000
        : 9000;

    proxy.proxyRequest(req, res, {host: 'localhost', port: port});
}).listen(80);

var one = express.createServer();
one.get('/', function(req, res){
  res.send('Hello from app one!')
});

var app = express.createServer();
app.use(express.vhost('localhost', one));
app.listen(8000);

2 个答案:

答案 0 :(得分:1)

http-proxy模块不会更改请求的主机头,这就是connect/express vhost用于区分虚拟主机的内容。

在这一行:

proxy.proxyRequest(req, res, {host: 'localhost', port: port});

您告诉代理服务器将未更改的请求代理到localhost:port

所以你需要做的就是改变:

var app = express.createServer();
app.use(express.vhost('localhost', one));
app.listen(8000);

为:

var app = express.createServer();
app.use(express.vhost('www.mysite.com', one));
app.listen(8000);

它应该有用。

或者,您可以在代理之前将req.headers.host设置为localhost

答案 1 :(得分:1)

由于你正在运行Ubuntu,你可以看一下暴发户。如果你不知道,upstart将取代old-school-unix init-scripts方法来启动和停止服务。 (那些是黑暗,可怕的日子!)如果你希望你的应用程序在你的盒子启动/重启时自动启动并在它(你的应用程序)崩溃后自动重启,那么你想要新贵。学习upstart的基础知识很简单,然后你有一个可以反复使用的工具,无论是节点,apache,nginx,postfix,mongodb,mysql,等等!

我的意思是对那些在永远模块上工作的好人没有不尊重。可以说,它确实有一个坚实的用例,但它经常用于不完美地复制已经在你的系统上的基岩 - 新贵。另外,谷歌可能会对有经验的用户和一些node.js提交者提出的一些关于node.js的可分离性和陷阱的评论,这些评论与永远非常相关。

我想发布链接,但我还没有足够的代表。希望我写的内容足以谷歌。

祝你好运!