Nodejs做静态资源服务器如何?
Nodejs做静态资源服务器如何?
有个轻业务,访问量不大,后端已经用 koa 写了,现在需要提供图片及其它文件给前端,请问可以直接在 koa 中返回文件的 stream 吗?
如果文件比较大( 100M 以内)是否还合适?
以前都是由 nginx 提供,现在为了省一个流程,想用 koa 直接做 http server
一般不都是 nginx 做静态资源服务器,然后其他请求用 proxy_pass 转发给后面的 koa 之类的么?你这是直接用的 koa ?
应该是可以的吧
这有个基准测试
centminmod.com/siegebenchmarks/2013/020313/
对…
静态资源服务器。。直接一个站点目录就是了,何必用 node 绕一层?
大胆用,出问题再说
可以的,我在司内搭了一个类似 gh-pages 的服务,就是用 koa 做静态服务,日访问挺大的,还有人放视频,都用起来没问题。
谢谢大佬
听起来不错
nginx 不就行了?
项目需要 能少就少
#9 不对不对,用 nginx 不比你 node 性能还好?能少就少是指什么
建议 nginx,或者静态资源放外部 cdn,哪怕丢其他服务器都好。
根据上面的链接,node.js 性能更好;
我发帖问的目的就是想知道,就算 node.js 比 nginx 差,是差多少?在哪种场景差最多?根据对比来决定用不用 node.js 。
回个贴说用 nginx 是很容易,但项目需要只有自己清楚,如果各位在用 node.js 做类似事情的时候踩过坑,或者了解过一些对比,非常欢迎给出来 互相讨论 互相参考,我相信比一句用 nginx 更有价值。
用呗,访问量不大的话,还没到考虑性能的时候
上面的链接并没有给出代码及可重现的步骤,所以测试结果不具有可信度
放视频的话 好像不能拖动进度条
访问量不大肯定可以哎
也对,还是自己测一下吧
纯静态资源服务走的是 sendfile, 吃的是 io, 多核性能提升的意义不大, 直接用 node 没啥大问题
访问量不大跑个什么服务都行的,没这么多需要考虑的
我认为可能是 node 不好做安全处理,nginx 是专业的 web 服务器的话可能 nginx 在安全方面可能更好……这是我猜测
狗头,连 node 性能更好都出来了…
OSS+CDN 一分钟搞定,就别自己写了
内网项目呢?敏感数据呢?呵呵
不知道楼主技术栈是啥。搭建 Nginx 静态资源服务器没啥技术成本丫。性能还是可以的。能少?指的是。30 min 配置好。
直接 caddy file-server ?
开头也说了是轻业务、访问量不大,基本原则就是如果没有可预见的问题或明确的需求,顺不顺手就会成为选型的首要因素,哪个顺手直接用就好了,等遇到问题再优化或者换方案。
如果你提供文件是有业务逻辑控制的,不好直接用 Nginx 简单 host 一个目录的话,那就直接在 Koa 里搞就行了,fs readable stream 直接 pipline 到 res 的 response writable stream 就行了。
一般如果在提供静态文件访问服务上面不需要额外的业务逻辑参与的话,Linux 上直接包管理器 install nginx,然后去 /etc/nginx/ 下改一下配置文件写上你的静态文件目录的路径,有需要再加上几个 Header,这个已经比装 Node 、装包、写代码要简单一些了;要想更简单的话大多数 Linux 都预装了 python,一行 python3 -m http.server 或者 python2 -m SimpleHTTPServer 就能启动一个静态文件服务器。
而且提供静态文件访问的性能方面话还要看你的磁盘 IO 、网络速度、能提供的内存缓存大小等。
要是真的对这个性能情况好奇,可以自己做一下 benchmark,然后把结果发上来。
服务地址在哪?我本地打个压测命令看看能不能撑得住 :)
nginx 有现成的网络防护,限制流量并发什么的,自己写的没有,如果有恶意用户都不用 DDOS,本机就搞死你了。
量不大都一样,量大 cdn 。~ ~ 能问出来这种问题的,8899 量不大的。
视频拖拽进度条可以么
额…这种事还是 nginx 做比较合适吧,虽然 node 也能做,但是手撸一个能和 nginx 功能的都很吃力,性能的话更不用说了吧。
使用Node.js搭建静态资源服务器是一个常见且高效的选择,特别是在开发环境中。Node.js的异步I/O和事件驱动架构使其非常适合处理高并发请求。以下是使用Node.js原生模块http
和fs
(文件系统)快速搭建静态资源服务器的一个简单示例:
const http = require('http');
const fs = require('fs');
const path = require('path');
const PORT = 3000;
const ROOT_DIR = path.join(__dirname, 'public'); // 静态资源存放目录
http.createServer((req, res) => {
let filePath = '.' + req.url;
if (filePath == './') filePath = './index.html';
filePath = path.resolve(ROOT_DIR, filePath);
fs.stat(filePath, (err, stats) => {
if (err) {
return res.status(404).end('File not found');
}
if (stats.isFile()) {
fs.readFile(filePath, (err, data) => {
if (err) {
return res.status(500).end('Internal Server Error');
}
const contentType = getContentType(filePath);
res.setHeader('Content-Type', contentType);
res.end(data);
});
} else {
return res.status(403).end('Access Denied');
}
});
}).listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
function getContentType(filePath) {
const extname = path.extname(filePath);
switch (extname) {
case '.html':
return 'text/html';
case '.js':
return 'application/javascript';
case '.css':
return 'text/css';
// 可以添加更多类型
default:
return 'application/octet-stream';
}
}
这个示例服务器监听3000端口,并将public
目录作为静态资源的根目录。根据请求的URL和文件类型,服务器返回相应的内容。