Node.js 在生产中是不是有永远和连接的 vhosts / nginx 替代方案?

Posted

技术标签:

【中文标题】Node.js 在生产中是不是有永远和连接的 vhosts / nginx 替代方案?【英文标题】:Node.js in production with forever and connect's vhosts / nginx alternative?Node.js 在生产中是否有永远和连接的 vhosts / nginx 替代方案? 【发布时间】:2012-04-02 23:15:12 【问题描述】:

我的项目主要使用 node.js,nodemon 用于开发,forever 用于生产。

我通常将我的项目拆分为虚拟主机,因此我的结构可能是这样的:

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.jsbootstrap.js 启动我定义的虚拟主机应用程序。

这样,我让每个虚拟主机都在自己的端口上监听,而虚拟主机在 3000 上监听。

我现在的问题是永远监视器的 bootstrap.js,因此如果任何 vhost 由于任何原因失败,将永远重启 bootstra.js,这也会导致其他 vhost 不必要的重启。

我的问题是,在我的情况下,最好的方法是什么?

我虽然没有一个 bootstrap.js 文件来具有这样的结构:

admin.js
front.js
api.js
apps/
  admin/
  front/
  api/

并为每个根 js 文件使用forever start,在这种情况下,我不会使用虚拟主机,但我相信虚拟主机是我需要它们的某种方式。

如果我放弃 connect 的虚拟主机以使用 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 来提供静态内容而不是节点,这对节点来说是不必要的开销。

你怎么看?我是对的还是你可以给我建议更好的?

谢谢!

【问题讨论】:

【参考方案1】:

我认为您基本上以合理的答案回答了您自己的问题,但您正在寻找一些替代方案......

我不熟悉 express 中的虚拟主机功能。但是,我认为您在单个 Node.js 进程中运行具有 3 种不同可扩展性需求的有效 3 个不同应用程序是在自找麻烦。

您仍然可以使用 express vhosts 解决方案,通过使用child_process.fork 来启动多个 express 实例(所有这些实例仍然可以共享同一个 http 服务器)。

【讨论】:

是的,在某种程度上我回答了我自己的问题,我只需要一些确认,我并不真正了解子进程分叉,感谢分享,但正如你所说,在多节点应用程序不是最好的方法吗?还有一些我希望听到的替代方案是 nginx vs varnish 或类似的东西,我只是说为了更清楚我做这个问题的原因:) 感谢您努力回答:)

以上是关于Node.js 在生产中是不是有永远和连接的 vhosts / nginx 替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

在生产中连接 mongo 和流星

socket.io 连接在生产中失败,在 localhost 中工作

使用 webpack 或 node.js 编译器包装所有函数和方法

websocket-rails 在生产中没有连接

在生产中使用“coffee”而不是“node”命令

Spring boot中最大连接数最大线程数与最大等待数在生产中的异常场景