静态文件服务

为什么做静态文件服务器

  这几天博客搭建起来后,美化和主题也设置得差不多了,就是在写作时,
有时候需要插入图片,图片使用的相对地址会在hexo生成博客时失效,总不
可能插入一个图片就在它生成后去相应的html里改引用地址吧,再说上传的时
候Hexo可能默认不会上传。
  所以这种情况下,就需要一个文件服务器去为我们生成的博客传输图片。

现有的解决方法

1.七牛服务

  七牛的静态文件服务听说性能很高,也是用我最近学习的golang写的。不少
人都是推荐这种服务,所以我就去七牛官网看了一下,有免费试用版,每个月
请求一万次到十万次,对我来说够用了。想注册的时候有以下两点要求我比较介意:

  • 需要填写手机号
  • 个人信息等隐私内容。

  国内的服务很多都把个人信息卖了,导致我总是收到垃圾短信和推销电话,因此现在就奉行
能不注册就不注册的态度。另外,我写个博客还要去七牛上上传,两边还得对上号,再说自己的
需求就是插入静态内容,也不复杂,为什么不自己做呢?自己动手,丰衣足食,还可以后续改进。
所以有了下面的做法。

2.在云上搭建文件服务器

  当浏览到包含插入图片的博客时,相当于发起了一次http请求,如果返回的是200,那就是说明
取到了图片,所以我们文件服务这边就是写一个http服务,监听这些请求,发送图片的数据过去就
行了。具体逻辑如下:

  1. 在md引用地址写上要请求的文件的地址A
  2. 服务监听端口,一旦有请求过来,就取request的url中的文件路径
  3. 判断该文件是否存在,如果不存在返回404
  4. 存在该文件的话,读取文件,response返回二进制数据即可

具体实现

  本来先写Go版本的,结果测试时,go中读取文件的”ioutil”和”os”模块都不能读取多层目录下的
文件内容,为了尽快上线,我用了nodejs,里面的http模块也很好用,异步不需要等待的特点正好适合
I/O操作,前期也没有考虑多个请求就开多个操作,或者是否Javascript异步模型不需要这些东西来提
高性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');

/**
* 访问根目录在当前目录,
* 例如要访问img下的fact.png,就使用http://[云地址]:8080/img/fact.png
*
**/

http.createServer(function(req,res){
var rootPath = ".";
//屏蔽favicon请求
if(req.url!=='/favicon.ico'){
var filename = rootPath+req.url;
var img_type = path.extname(req.url).split('.')[1];
//读取相应的文件
fs.readFile(filename,'binary',function(err,file){
if(err){
res.writeHead(500,{"Content-Type":"text/plain"});
res.write(err+'\n');
console.log('request:',req.url,'\t\t[Failed].');
res.end();
}else{//返回数据
res.writeHead(200,{"Content-Type":"image/"+img_type});
res.write(file,"binary");
console.log('request:',req.url,'\t\t[Ok].');
res.end();//等待发送完成
}
});
}
}).listen(8080);

  然后将这段代码发在云上运行,并将博客里要插入的图片放在rootPath下,更新
博客后,再访问服务端果然出现了request ok的信息,gitcafe和github上的博客在浏
览时,也成功加载了图片。说明我的想法是正确的。

后续

服务器写的还是很简陋的,总的来说有以下需要改进:

  1. 将服务器地址写到配置文件中,而不是每次都写域名,更新域名更方便。
  2. 既没有对请求进行判断,不能防范攻击。
  3. 多个人浏览时是否依旧能流畅加载图片没有测试。
  4. javascript的异步模式应该多个请求怎么处理没有弄清。
      
    所以,接下来针对这几点,可以一边用一边改,这就是未完的工作了。不过好歹可以用了,
    也不用去注册一个服务,自己又得到了锻炼。说不定发展到最后可以提供多个服务。一个
    web框架大概也是这样一点一点地加起来的。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 为什么做静态文件服务器
  2. 2. 现有的解决方法
    1. 2.1. 1.七牛服务
    2. 2.2. 2.在云上搭建文件服务器
  3. 3. 具体实现
  4. 4. 后续
,