问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nodejs 静态服务器和http服务器有什么区别

发布网友 发布时间:2022-04-25 13:01

我来回答

2个回答

懂视网 时间:2022-04-18 23:53

日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript、CSS、HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果。

比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:workassets,我们希望所有对 http://a.mycdn.com/* 的访问被映射到本地的 D:workassets* 下。如访问 http://a.mycdn.com/s/atp.js 时,实际上是读取的是本地的 D:workassetssatp.js,而不需要从网上下载线上的文件。

实现这个功能很简单,关键点如下:

1、在本地开启一个 HTTP 服务,监听 80 端口;
2、修改系统 hosts 文件,添加“127.0.0.1 a.mycdn.com”,将 CDN 域名绑定为本地服务器地址;
3、配置本地 HTTP 服务,接收到一个 GET 请求后,先检查本地硬盘上是否存在对应的文件,如存在,则返回这个文件的内容,如不存在,则返回线上对应的内容。

可以看到,关键部分是需要搭建一个本地的 HTTP 服务。这方面有很多教程,比如在本地安装 Apache 或 Ngnix 等服务器软件,再配置相应的转发规则等。不过个人觉得这类方法还是有点复杂,本文要介绍的,是另外的不需要安装服务器软件的方法。

因为我们是在本地开发调试,对性能、并发性的要求并不高,因此我们其实并不需要一个像 Apache/Ngnix 这样的专业的 HTTP 软件,我们只需要一段能提供 HTTP 服务的脚本即可。比如用 nodejs 来实现。

代码如下:


/**
* author: oldj
*
**/

var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
local_folders,
base_url;

local_folders = [ // 本地路径,代理将在这个列表中的目录下寻找文件,如果没有找到则转到线上地址
"D:/work/assets"
];
base_url = "http://10.232.133.214"; // 线上路径,如果找不到文件,则转向到这个地址


function loadFile(pathname, response) {
var i, l = local_folders.length,
fn;

console.log("try to load " + pathname);

for (i = 0; i < l; i++) {

fn = local_folders[i] + pathname;
if (path.existsSync(fn) && fs.statSync(fn).isFile()) {
fs.readFile(fn, function (err, data) {
response.writeHead(200);
response.write(data);
response.end();
});

return;
}

}

response.writeHead(302, {
"Location":base_url + pathname
});
response.end();
}

http.createServer(
function (request, response) {

var req_url = request.url,
pathname;

// 处理类似 http://www.gxlcms.com/,tbsp/tbsp.css?t=20110920172000.css 的请求
pathname = req_url.indexOf("??") == -1 ? url.parse(request.url).pathname : req_url;
console.log("Request for '" + pathname + "' received.");
loadFile(pathname, response);

}).listen(80);


注意将上面的 local_folders 和 base_url 两个变量的值修改为你需要的值。将这个文件保存下来,比如保存为 local-cdn-proxy.js,然后在命令行里执行“node local-cdn-proxy.js”,本地服务器就运行起来了,当然,别忘了绑定 hosts 。

当通过 http 访问一个路径时,上面的脚本会先在本地对应的目录下查找,找到则返回对应文件的内容,找不到则直接 302 跳转到线上对应的地址。对于找不到的情况,还有一种处理办法是由本地服务器从线上下载对应的内容并返回,不过对这个需求来说,302 跳转就足够了。

除了 nodejs 版本,我也写了一个 Python 的版本:


代码如下:


# -*- coding: utf-8 -*-
#
# author: oldj
#

import os
import BaseHTTPServer

LOCAL_FOLDERS = [
"D:/work/assets"
]
BASE_URL = "http://10.232.133.214"

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_GET(self):
print "Request for '%s' received." % self.path
for folder in LOCAL_FOLDERS:
fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
if os.path.isfile(fn):
self.send_response(200)
self.wfile.write(open(fn, "rb").read())
break

else:
self.send_response(302)
self.send_header("Location", "%s%s" % (BASE_URL, self.path))

server = BaseHTTPServer.HTTPServer(("0.0.0.0", 80), WebRequestHandler)
server.serve_forever()


可以看到,Python 版本的代码比 nodejs 版本的精简了很多。

上面的两段代码的功能还相对比较简单,比如没有输出内容的 MIME-Type、Content-Length 等头信息,对可能的阻塞操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这两个脚本,以便满足更多的需求。

更多使用nodejs、Python写的一个简易HTTP静态文件服务器相关文章请关注PHP中文网!

热心网友 时间:2022-04-18 21:01

参考cnodejs.org上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下

/**
* 静态文件服务器测试例子
* User: xuwm
* Date: 13-5-17
* Time: 上午8:38
* To change this template use File | Settings | File Templates.
*/
var port=3333;
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
var mime = require("./mime").types;
var config = require("./config");
var zlib = require("zlib");
//创建http服务端
var server=http.createServer(function(request,response){
var obj= url.parse(request.url);
response.setHeader("Server","Node/V8");
console.log(obj);
var pathname=obj.pathname;
if(pathname.slice(-1)==="/"){
pathname=pathname+config.Welcome.file; //默认取当前默认下的index.html
}
var realPath = path.join("assets", path.normalize(pathname.replace(/\.\./g, "")));
console.log(realPath) ;
var pathHandle=function(realPath){
//用fs.stat方法获取文件
fs.stat(realPath,function(err,stats){
if(err){
response.writeHead(404,"not found",{'Content-Type':'text/plain'});
response.write("the request "+realPath+" is not found");
response.end();
}else{
if(stats.isDirectory()){
}else{
var ext = path.extname(realPath);
ext = ext ? ext.slice(1) : 'unknown';
var contentType = mime[ext] || "text/plain";
response.setHeader("Content-Type", contentType);

var lastModified = stats.mtime.toUTCString();
var ifModifiedSince = "If-Modified-Since".toLowerCase();
response.setHeader("Last-Modified", lastModified);

if (ext.match(config.Expires.fileMatch)) {
var expires = new Date();
expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
response.setHeader("Expires", expires.toUTCString());
response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
}

if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {
console.log("从浏览器cache里取")
response.writeHead(304, "Not Modified");
response.end();
} else {
var raw = fs.createReadStream(realPath);
var acceptEncoding = request.headers['accept-encoding'] || "";
var matched = ext.match(config.Compress.match);

if (matched && acceptEncoding.match(/\bgzip\b/)) {
response.writeHead(200, "Ok", {'Content-Encoding': 'gzip'});
raw.pipe(zlib.createGzip()).pipe(response);
} else if (matched && acceptEncoding.match(/\bdeflate\b/)) {
response.writeHead(200, "Ok", {'Content-Encoding': 'deflate'});
raw.pipe(zlib.createDeflate()).pipe(response);
} else {
response.writeHead(200, "Ok");
raw.pipe(response);
}
}
}
}
});

}
pathHandle(realPath);
});
server.listen(port);
console.log("http server run in port:"+port);

首先需要在JS文件里创建一个assets的文件夹,里面放入你要浏览的静态文件,比如,index.html,demo.js等。
运行方式为:在命令行里切换到上面的JS的文件目录,然后输入 node JS文件名
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 简述node.js的流的作用? 带有“静”字诗句有哪些? 本科优秀毕业论文一般学校会保存其电子版吗 在Node.js中,怎么向spawn和exec产生的子进程的stdin输入东西 我的QQ号登陆不上去怎么回事啊? 带有“静”字的四字词和成语 关于静的四字词语。 深入浅出Node.js的内容简介 河南师范大学的毕业论文真的保存到光盘里了吗?保存多久呀? 带静字的词语 毕业之后自己还需要存着毕业论文的相关资料吗? 使用node.js,实现一个简单的接口服务器的功能 推荐四个带有“静”字的词语。 毕业论文只能在一个电脑上写保存吗 写出四个带有“静”字的词语 如何从字符串中的Node.js创建流 女朋友最近有事忙不来,叫我弄一篇毕业论文,我没有优盘,昨天去网吧写... word高手 !!来啊!怎样让 word的窗口总是在桌面的最前? 带有“静”字的成语有哪些? node.js怎么往文本文档中写入数据 我的QQ账号不能解封? 我的QQ号登录不上了咋办 我QQ号怎么上不去啊 我QQ号上不去了 我的QQ号码不能登录了. 我的QQ号用不了 我的QQ号码怎么是帐号不成在 我的qq号码上不了了! 我的QQ号码上不了 我的qq号怎么上不了?&gt; 小米的mi4tle是什么意思? 控制器怎么安装? 求《可编程控制器教程》40讲全部视频教程 电动车控制器怎么接线,看完视频你基本上懂了 控制器安装方法 梦见看医生,医生动手动脚 远方动力控制器摇控器怎么使用教程视频 maya创建控制器 梦见老婆陪我看医生 单门门禁一体控制器操作视频