想用Node.js写一个静态web服务器
想用Node.js写一个静态web服务器
有一个冲动,想用Node.js写一个静态web服务器,不知道有没有同类的产品了?(避免重复造轮子,也避免被骂臭显摆^_^)。刚才看到了 @朴灵 的nodev5 写的不错,不过略显简陋。
想用Node.js写一个静态web服务器
你可能已经注意到,Node.js 社区中有许多成熟的静态 Web 服务器工具,比如 http-server
和 serve
。这些工具已经非常完善,可以满足大多数需求。然而,如果你对如何构建这样的服务器感兴趣,并希望通过实践学习 Node.js,那么下面是一个简单的示例。
示例代码
首先,我们需要创建一个基本的 HTTP 服务器来处理静态文件请求。以下是一个简单的示例:
const http = require('http');
const fs = require('fs');
const path = require('path');
// 设置静态文件目录
const staticDir = path.join(__dirname, 'public');
const server = http.createServer((req, res) => {
// 获取请求的URL路径
const filePath = path.join(staticDir, req.url);
// 检查文件是否存在
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
// 如果文件不存在,返回404错误
res.writeHead(404);
res.end('File not found');
return;
}
// 读取文件并发送响应
fs.readFile(filePath, (err, data) => {
if (err) {
res.writeHead(500);
res.end('Internal Server Error');
return;
}
res.writeHead(200);
res.end(data);
});
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
引入必要的模块:
http
模块用于创建 HTTP 服务器。fs
模块用于文件系统操作。path
模块用于处理文件路径。
-
设置静态文件目录:
staticDir
变量定义了存放静态文件的目录,默认为项目根目录下的public
文件夹。
-
创建 HTTP 服务器:
- 使用
http.createServer()
创建一个服务器实例。 - 在请求处理函数中,解析请求的 URL 路径,并尝试访问对应的文件。
- 使用
-
处理文件请求:
- 使用
fs.access()
检查文件是否存在。 - 如果文件存在,则使用
fs.readFile()
读取文件内容,并将其作为响应发送给客户端。 - 如果文件不存在或读取过程中出现错误,则返回相应的错误码和消息。
- 使用
-
启动服务器:
- 使用
server.listen()
方法将服务器绑定到指定端口(这里使用的是 3000 端口)。
- 使用
通过这个简单的示例,你可以看到如何用 Node.js 构建一个基本的静态 Web 服务器。虽然它功能简单,但足以帮助你理解基础原理。如果你需要更复杂的功能,可以考虑使用现有的库,如 express
或 koa
,它们提供了更多高级功能和更好的性能。
nodejs缺一个类似memcached的东西,可以根据tag过滤出数据,相当于视图,还有可以在添加,或者过期时触发回调函数 这个回调函数可以提前注册好
你可以试一下redis
在NPM上找 有不少
不知道express自带的静态服务器有没有满足你的需求 我自己写了个脚本利用express建立临时的静态服务器, 用来测试jquery和学习html5, 在这个层次的需求上是完全够用了的.
我是想做一个将静态文件(主要是针对体积小访问频繁的网页)缓存在内存中,以降低磁盘IO,提高性能。以及html文件更新分发。
mongodb 会使用内存来缓冲数据,所以你可以把文件存在数据库里面, 利用mongodb天生的缓存机制就不用自己搞了,除非有很特别的需求. html分发就不懂了
如果用第三方的工具cache数据,感觉应该考虑mc和redis。如果考虑多IDC的文件分发,还是不能完全依赖cache的存储,还需要实时分发的需求。
Cache直接保存在shm文件夹如何?
如果服务器断电,岂不是数据被清了。
凌乱了~-~ 专门的静态服务器还是nginx上吧,Node的性能要差好几个档次,在请求量不大的情况下还是可以用的
没有做过测试,就不要说“只差那么一点点”
![nodejs vs php][1] [1]: http://cupic.img168.net/bbsfile/forum/201305/26/215834mzlt0dlpmosoeu6s.jpg ![nodejs vs nginx][2] [2]: http://cupic.img168.net/bbsfile/forum/201305/26/2158538suj9a8ajlsjjffl.jpg
在虚拟机测试的helloword,200个并发下的rps, 相同的网络io模型,性能差不多的语言,nodejs要稍逊于nginx,但灵活性与简单是nginx没法比的
测试代码?
var json='{"hello":"world"}';
response.write(josn);
response.end();
后面的测试是读入一个同样大小的html模板文件
LS这是在测试速度而不是负载能力吧… 参数很小 nginx直接调用操作系统级别的sendfile,静态HTML并发轻松上万无压力 如果是NODE则还要 1.一部分一部分把文件地从磁盘读取到内存 2.一部分一部分地转换为JS类型的BUFFER. 3.一部分一部分地扔给socket;上述每一步都要占用V8的主线程队列;
即使你不考虑CPU消耗,NODE也能应付足量的静态请求,但是无论如何跟NGINX没法比;建议把测试文件改成100MB再测试!看看CPU消耗和内存占用比,如果再把请求扩大10倍百倍呢?nginx可以轻松跑满G口带宽,NODE需要什么样的CPU才能跑满G口呢~-~
sendfile就是nginx比node优的地方。
啊啊啊我没看错吧,“灵活性与简单是nginx没法比的”
http://blog.std.in/2010/09/09/using-sendfile-with-nodejs/
对于系统api,应用程序nginx能调用,nodejs也可以调用,这能说明有什么优势呢?
我也求求您别再歪楼了,主题是静态文件的处理,你跟我扯100M的HTML.~-~
歪楼 +1
seasonx4 别人一说点什么你就说人家歪楼 你弄个测试出来说话吧
fs原来的sendfile被删了,原来使用的是binding,谁知道它去哪儿了?
好啊,你给我台AMAZON的云测试吧
语言跟web 服务器不要混为一谈。Nodejs 没有最外层的包裹,很容易形成阻塞,或是当机。这也是我在考虑他能不能进行大规模开发的原因。上回一个做.net公司要把网站改成Nodejs 做。真是让我崩溃。现在的项目经理都不了解语言。看来都是靠忽悠。
其实我现在偏向的是前端angularjs 后端 Nodejs。反向代理图片等大数据的东西。。nodejs 专门做接口。和少量html代码的输出。其他请求都利用ajax。
删了好 Node生搬硬套sendfile 实现必然是非常的丑陋
NGINX低的不正常… 你的配置文件用的默认?
重点是, NODE 4核必然已经满载了,不信你可以打开TOP - 0查看 / 而NGINX CPU占用很低 当CPU是瓶颈的时候这个东西已经没有可以提升的空间了
看我的NGINX 单核近7000QPS
Server Software: nginx Server Hostname: 127.0.0.1 Server Port: 4000
Document Path: /robots.txt Document Length: 29 bytes
Concurrency Level: 10 Time taken for tests: 0.145 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 0 Total transferred: 269000 bytes HTML transferred: 29000 bytes Requests per second: 6911.76 [#/sec] (mean) Time per request: 1.447 [ms] (mean) Time per request: 0.145 [ms] (mean, across all concurrent requests) Transfer rate: 1815.69 [Kbytes/sec] received
这个差异应该是来自服务器的配置吧
对比应该在同台服务器,相似的设置上
那nodejs你也跑一下喽~
我记得 BYVoid的书里写的是node更快 = = 新手理解错了勿喷
当然可以!以下是如何使用Node.js编写一个简单的静态Web服务器的示例代码。为了不重复造轮子,这里会使用流行的库http
来实现这一功能。
示例代码
const http = require('http');
const fs = require('fs');
const path = require('path');
// 设置静态文件目录
const staticDir = path.join(__dirname, 'public');
const server = http.createServer((req, res) => {
// 请求的文件路径
const filePath = path.join(staticDir, req.url === '/' ? '/index.html' : req.url);
// 检查文件是否存在
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
// 如果文件不存在,则返回404错误
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('404 Not Found');
return;
}
// 读取文件
fs.readFile(filePath, (err, data) => {
if (err) {
// 如果读取文件时出错
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal Server Error');
return;
}
// 确定文件类型
let contentType = 'text/html';
switch (path.extname(filePath)) {
case '.css':
contentType = 'text/css';
break;
case '.js':
contentType = 'application/javascript';
break;
case '.png':
contentType = 'image/png';
break;
case '.jpg':
case '.jpeg':
contentType = 'image/jpeg';
break;
}
// 发送响应头
res.writeHead(200, { 'Content-Type': contentType });
// 发送响应数据
res.end(data);
});
});
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
- 引入必要的模块:首先需要引入
http
、fs
以及path
模块。 - 设置静态文件目录:这里我们设定一个名为
public
的文件夹作为存放静态资源的根目录。 - 创建HTTP服务器:使用
http.createServer()
方法创建一个HTTP服务器,并处理接收到的请求。 - 检查文件是否存在:对于每个请求,检查请求的文件是否存在于服务器上。
- 读取并发送文件:如果文件存在,就使用
fs.readFile()
方法读取该文件的内容,并将文件内容以正确的MIME类型发送给客户端。 - 启动服务器:最后,通过调用
server.listen()
方法让服务器监听指定端口(这里设置为3000),然后就可以访问服务器上的静态文件了。
这样,我们就完成了一个简单的静态Web服务器的搭建。