Express.js(Node.js):静态文件服务真的如何工作?

时间:2013-09-19 17:10:39

标签: node.js nginx express

我认为使用Express提供静态文件(html,mov,css,jpg等)需要在nginx中使用一些黑客。

但似乎静态文件“只适用于Express”。不需要特别的东西。

  • Express静态文件服务如何真正起作用?

  • 为什么有些人主张将nginx用于静态文件?必须有充分的理由。 (例如:https://gist.github.com/joemccann/644282

  • 此外,在下载静态文件时,Node.js事件队列是否被阻止?我想不是,但为什么不呢?

3 个答案:

答案 0 :(得分:2)

使用express.static()中间件在Express中完成静态文件服务。这个中间件将在磁盘上查找您可能要求的文件,如果找到它将通过编写http标头然后编写内容来为它们提供服务。要使所有这些工作,您必须在中间件堆栈中app.use(express.static(...))

由于几个原因,提倡使用ngnix,最重要的是:

  1. 速度提高了很多倍

  2. 您有更多灵活性。使用挂载点,重写规则,磁盘上的位置等。更改ngnix配置比代码更容易。此外,这种灵活性允许ngnix处理部分或全部静态文件,同时将其他工作(动态内容?静态文件的其他部分)委托给其他人(您的node.js进程,CDN等)

  3. 节点请求队列不会被阻塞,这就是节点的工作方式:请求“快速”处理,异步处理,释放单个线程以完成更多工作,如接受和处理新请求。您的文件是“在后台”发送的,完成后会通知您(或实际上 - 发送它们的代码)。

答案 1 :(得分:2)

如果网址不属于您通过app.get(/...(或POST等)方法注册的任何路径,则如果设置了静态路径并且您提供的路径属于某些文件路径,则Express会发送该文件在静态文件目录下。文件发送只不过是streams,它们不会完全阻塞事件队列,它们只是被推送到队列中,当收到块时,它们通过管道连接到HTTP连接,因此它们发生在代码的后台。建议nginx的原因是它更适合那份工作,提供文件和路由,它也是用C语言编写的,并针对该工作进行了优化,其中NodeJS是一个比Nginx更通用的工具。

答案 2 :(得分:1)

在我的主服务器文件(app.js)中。

var express = require('express');
var app = express();
var path = require('path');
...
app.use(express.static(path.join(__dirname, 'public')));

我的文件夹是:

/public/js
/public/css
/public/img

这些是静态的,因此无需重新启动应用即可查看更改。不能说速度与ngnix有关,但在看完Nitzan Shaked的回答之后我会给ngnix一个机会! 编辑:对于此示例,您需要 connect (npm install connect)