我认为使用 Express 提供静态文件(html、mov、css、jpg 等)需要在 nginx 中进行一些修改。
但似乎静态文件“只适用于”Express。不需要特别的东西。
Express 静态文件服务如何真正起作用?
为什么有些人提倡使用 nginx 处理静态文件?这一定是有充分理由的。(示例:https ://gist.github.com/joemccann/644282 )
此外,在下载静态文件时,Node.js 事件队列是否被阻塞?我想不是,但为什么不呢?
静态文件服务是通过使用express.static()
中间件快速完成的。该中间件将在磁盘上查找您可能要求的文件,如果找到,将通过编写 http 标头和内容来为它们提供服务。为了使所有这些工作,您必须app.use(express.static(...))
在您的中间件堆栈中。
由于几个原因,提倡使用 ngnix,最重要的恕我直言:
它快很多倍
你有更多的灵活性。使用挂载点,使用重写规则,使用磁盘上的位置等。更改 ngnix 配置比更改代码更容易。此外,这种灵活性允许 ngnix 处理部分或全部静态文件,同时将其他工作(动态内容?静态文件的其他部分)委托给其他人(您的 node.js 进程、CDN 等)
节点请求队列不会被阻塞,节点就是这样工作的:请求被“快速”处理,异步,释放单个线程来做更多的工作,比如接受和处理新的请求。您的文件是“在后台”发送的,完成后会通知您(或实际上是发送它们的代码)。
如果 url 不属于您通过app.get(/...
(或 POST 等)方法注册的任何路径,如果设置了静态路径并且您提供的路径属于静态文件目录下的某些文件路径,Express 会发送文件。文件发送只不过是流,它们不会完全阻塞事件队列,它们只是被推送到队列中,当收到块时,它们通过管道传输到 HTTP 连接,因此它们发生在代码的后台。推荐 nginx 的原因是它更适合那个工作,提供文件和路由,而且它也是用 C 编写的,并且针对那个工作进行了优化,其中 NodeJS 是一个比 Nginx 更通用的工具。
在我的主服务器文件(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 一个机会!
编辑:对于这个例子,你需要连接(npm install connect)