关注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

posted on 2014-02-26 11:24  书中叶  阅读(1011)  评论(5编辑  收藏  举报