我的项目主要使用node.js,开发使用nodemon
,生产使用forever
。
我通常将我的项目拆分成vhost,这样我的结构就可以像这样:
bootstrap.js
apps/
admin/
front/
api/
我的bootstrap.js如下所示:
// Get Express
var express = require('express');
// Create express server
var app = express.createServer();
// Configure Development Environment
app.configure('development', function() {
//app.use(express.vhost('localhost', require('./apps/front')));
app.use(express.vhost('localhost', require('./apps/admin')));
app.use(express.vhost('localhost', require('./apps/api')));
app.listen(3000);
});
// Configure Production Environment
app.configure('production', function() {
app.use(express.vhost('example.com', require('./apps/front')));
app.use(express.vhost('admin.example.com', require('./apps/admin')));
app.use(express.vhost('api.example.com', require('./apps/api')));
app.listen(80);
});
当我想启动我的应用程序时,我使用
forever start bootstrap.js
和bootstrap.js
启动我定义的vhost应用程序。这样我就让每个vhost在自己的端口监听,vhost在3000上监听。
我现在的问题是forever monitor的bootstrap.js,如果vhost中的任何一个因为任何原因而失败,forever都将重新启动bootstra.js,这也将导致其他vhost不必要的重新启动。
我的问题是,在我的情况下,最好的方法是什么?
我想不是用一个bootstrap.js文件来实现这样的结构:
admin.js
front.js
api.js
apps/
admin/
front/
api/
对每个根js文件使用
forever start
,在这种情况下,我不会使用vhost,但我相信vhost在某种程度上是我所需要的。不过,如果我放弃connect的vhost使用nginx,那么每个应用程序的配置如下:
server
{
listen 80;
server_name admin.example.com;
access_log /var/log/nginx/admin.example.com.access.log;
error_log /var/log/nginx/admin.example.com.error.log;
root /home/panosru/domains/example.com/apps/admin/public;
location ~* ^.+\.(svg|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
root /home/panosru/domains/example.com/apps/admin/public;
}
location / {
proxy_pass http://admin.example.com:3001;
}
}
我可以看到,使用nginx我有更多的好处,比如我使用nginx来服务我的静态内容而不是节点,这对节点来说是不必要的开销。
你怎么认为?我说的对吗?或者你可以给我推荐更好的?
谢谢!
最佳答案
我认为你基本上用一个合理的答案回答了你自己的问题,但你正在寻找一些替代方案…
我不熟悉Express中的vhost功能。不过,我认为您是在一个node.js进程中运行3个不同的应用程序,这实际上是在自找麻烦。
您仍然可以使用express vhosts解决方案,方法是使用child_process.fork启动express的多个实例(所有实例仍然可以共享同一个http服务器)。