0

我正在尝试建立我的第一个生产节点网站(只是我的生产 Web 服务器上的一个基本的 hello world)。

下面是我正在使用的(基本的http代理将apache网站传递到端口:9000,节点网站传递到端口:8000)。我知道这部分有效,因为 apache 虚拟主机按我的预期转发。但是,节点部分不起作用-相反,我收到以下错误

"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);
4

2 回答 2

2

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

我的意思是不尊重那些在永远模块上工作的好人。可以说,它确实有一个可靠的用例,但它经常被用来不完美地复制已经在你的系统上的基石——新贵。此外,您可能会谷歌一些经验丰富的用户和一些 node.js 提交者关于 node.js 的可分叉性和陷阱的评论,这些评论与永远相关。

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

祝你好运!

于 2012-07-23T20:36:10.907 回答
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

于 2012-07-23T14:54:39.967 回答