node.js静态HTTP服务器实现
关注node.js很长时间了,有了这东西就可以用Javascript来写后端了,而且据说是单线程、无阻塞、高并发,对于前两种优势我不明觉厉(有大牛看到了麻烦讲解以下咯~~),结合之前看到的PhoneGap,以及许许多多的神级HTM5应用,充分说明了Javascript是万能的。
安装和配置node.js我就不写了,网上多的是,也十分简(shǎ)单(guā)。
首先说明一点的是node.js不是一个Web服务器,Web功能只是它众多功能的一项,当然也是目前使用最广泛的一项。要想实现Web功能,在node.js中其实是多个模块合作完成的,我们需要写一个js文件来构建一个Web服务器。以下是这个js文件的源代码:
1 //开始服务启动计时器 2 console.time(‘[WebSvr][Start]‘); 3 //请求模块 4 var libHttp = require(‘http‘); //HTTP协议模块 5 var libUrl=require(‘url‘); //URL解析模块 6 var libFs = require("fs"); //文件系统模块 7 var libPath = require("path"); //路径解析模块 8 //依据路径获取返回内容类型字符串,用于http返回头 9 var funGetContentType=function(filePath){ 10 var contentType=""; 11 //使用路径解析模块获取文件扩展名 12 var ext=libPath.extname(filePath); 13 switch(ext){ 14 case ".html": 15 contentType= "text/html"; 16 break; 17 case ".js": 18 contentType="text/javascript"; 19 break; 20 case ".css": 21 contentType="text/css"; 22 break; 23 case ".gif": 24 contentType="image/gif"; 25 break; 26 case ".jpg": 27 contentType="image/jpeg"; 28 break; 29 case ".png": 30 contentType="image/png"; 31 break; 32 case ".ico": 33 contentType="image/icon"; 34 break; 35 default: 36 contentType="application/octet-stream"; 37 } 38 return contentType; //返回内容类型字符串 39 } 40 //Web服务器主函数,解析请求,返回Web内容 41 var funWebSvr = function (req, res){ 42 var reqUrl=req.url; //获取请求的url 43 //向控制台输出请求的路径 44 console.log(reqUrl); 45 //使用url解析模块获取url中的路径名 46 var pathName = libUrl.parse(reqUrl).pathname; 47 if (libPath.extname(pathName)=="") { 48 //如果路径没有扩展名 49 pathName+="/"; //指定访问目录 50 } 51 if (pathName.charAt(pathName.length-1)=="/"){ 52 //如果访问目录 53 pathName+="index.html"; //指定为默认网页 54 } 55 //使用路径解析模块,组装实际文件路径 56 var filePath = libPath.join("/home/libook/Documents/WebRoot",pathName); 57 //判断文件是否存在 58 libPath.exists(filePath,function(exists){ 59 if(exists){//文件存在 60 //在返回头中写入内容类型 61 res.writeHead(200, {"Content-Type": funGetContentType(filePath) }); 62 //创建只读流用于返回 63 var stream = libFs.createReadStream(filePath, {flags : "r", encoding : null}); 64 //指定如果流读取错误,返回404错误 65 stream.on("error", function() { 66 res.writeHead(404); 67 res.end("<h1>404 Read Error</h1>"); 68 }); 69 //连接文件流和http返回流的管道,用于返回实际Web内容 70 stream.pipe(res); 71 } 72 else { //文件不存在 73 //返回404错误 74 res.writeHead(404, {"Content-Type": "text/html"}); 75 res.end("<h1>404 Not Found</h1>"); 76 } 77 }); 78 } 79 //创建一个http服务器 80 var webSvr=libHttp.createServer(funWebSvr); 81 //指定服务器错误事件响应 82 webSvr.on("error", function(error) { 83 console.log(error); //在控制台中输出错误信息 84 }); 85 //开始侦听8124端口 86 webSvr.listen(8124,function(){ 87 //向控制台输出服务启动的信息 88 console.log(‘[WebSvr][Start] running at http://127.0.0.1:8124/‘); 89 //结束服务启动计时器并输出 90 console.timeEnd(‘[WebSvr][Start]‘); 91 });
启动服务器的时候只需要在Terminal中输入:
node /home/ailk/Documents/StartUp.js
当然,如果你想开机就自动启动的话可以在系统中配置,linux下一般是/etc/rc.local中,但是需要注意一点的是,这条语句执行的时候会不断监视并输出运行日志,Terminal会被独占,如果直接将上述语句写入/etc/rc.local中会导致这条语句下面的所有语句都不被执行,相关解决方案可以参考nohup的功能。
这东西支持一般的HTTP静态资源访问。
为什么我这个Web服务器使用8124端口而不是80端口呢?因为在linux下,小于1024的端口号都需要root权限,考虑到安全问题,我们可以用低权限来运行node.js,然后使用root权限来做80到8124的转发:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8124
上面这个指令的效果是临时的,关机失效,所以要每次开机都要执行一次。
好啦,可以快乐的玩耍了~~~
本文章系受著作权法保护,未经著作人同意,不得盗用;使用或引用本文章内容请注明作者名、原地址:书中叶http://www.cnblogs.com/libook
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。