zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    实现发送邮件
    c#操作sqlite(包含中文支持)
    C# & SQLite
    卸载impala
    kudu集成impala
    Kudu的卸载(cdh)
    Kudu的集群安装(1.6.0-cdh5.14.0)
    ELK日志平台搭建
    logstash之OutPut插件
    logstash之Filter插件
  • 原文地址:https://www.cnblogs.com/libook/p/3568701.html
Copyright © 2011-2022 走看看