自制简单的image图片服务器,404原理
博客专区 > ruiorz 的博客 > 博客详情
自制简单的image图片服务器,404原理
ruiorz 发表于4年前
自制简单的image图片服务器,404原理
  • 发表于 4年前
  • 阅读 2425
  • 收藏 94
  • 点赞 4
  • 评论 16

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 随着网站的日访问量增加,考虑到需要优化一番,今天就介绍一种简单易用的方法来建立图片服务器,将主网站的图片访问压力转移到另外一台服务器上,原创内容,欢迎探讨,转载请注明出处,谢谢

        随着网站的访问量增加,页面打开过程中,图片下载就占了好大一部分,今天就分享一种简单易用的方法来建立图片服务器,将主网站的图片访问压力转移到另外一台服务器上,经过这种404简单而又快速的方法,使网站的访问速度将大大提升。

方法如下:

假设现有网站 http://www.yourdomain.com,

且现有网站中图片访问的url都是基于http://www.yourdomain.com/assets/uploads/2014/0516/140023223793340.jpg

第一步:建立图片服务器

    装个nginx即可,关于nginx安装,网上自己搜,也可参考我前面的一篇博客http://my.oschina.net/ruiorz/blog/280289

    在nginx.conf中配置:

# 在server中添加或修改如下:
server_name  img01.yourdumain.com;
error_page 404  /404.php

    编辑虚拟主机目录下的404.php文件

vi /data/htdocs/img01.yourdumain.com/404.php

    输入一下内容:

<?php
$base_host = "http://www.yourdumain.com"; //这里是主机器的host

//获取图片访问的url,如:/assets/uploads/2014/0516/140023223793340.jpg
$url = $_SERVER["REQUEST_URI"];

//获取目录信息,如:/assets/uploads/2014/0516
$dir = dirname($url);

//存放目标目录(图片服务器的根目录)
$save_dir = "/data/htdocs/img01.yourdumain.com";

//建立目录,判断目录/data/htdocs/img01.yourdumain.com/assets/uploads/2014/0516是否存在
if( !is_dir($save_dir . $dir) ){
    //没有目录则创建目录
    mkdir($save_dir . $dir, 0777, true);
}

//开始下载图片
$status = curl_download($base_host . $url, $save_dir . $url);
if($status != 200){
    @unlink($save_dir . $dir);
}
header("Location:" . $base_host . $url);
exit;

//下载图片到本地的方法
function curl_download($remote, $local) {
    $cp = curl_init();
    $fp = fopen($local, "w");
    curl_setopt($cp, CURLOPT_URL, $remote);
    curl_setopt($cp, CURLOPT_FILE, $fp);
    curl_setopt($cp, CURLOPT_HEADER, 0);
    curl_exec($cp);
    $status = curl_getinfo($cp,CURLINFO_HTTP_CODE);
    curl_close($cp);
    fclose($fp);
    return $status;
}

第二步:调试运行

    将主机器的图片前缀改为 http://img01.yourdomain.com,例如:

<img src="http://www.yourdumain.com/assets/uploads/2014/0516/140023223793340.jpg" />
改为:
<img src="http://img01.yourdumain.com/assets/uploads/2014/0516/140023223793340.jpg" />

大功告成!


注:此种简单的方法仅供参考,只是为了告诉大家原理,并没有进行如何安全性的处理,例如判断访问url是必须图片,还有就是需要判断只允许目标主机进行访问,还有很多需要改进的地方,欢迎大家讨论!

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 8
码字总数 6773
评论 (16)
许雷神
谢谢
cnu2m
图片状态全部404?
ruiorz

引用来自“cnu2m”的评论

图片状态全部404?
第访问图片服务器的时候,如果不存在就是404,利用404将目标服务器的图片下载下来,下次就是200啦
ccmv
why ? why? 有啥优势?
ruiorz

引用来自“ccmv”的评论

why ? why? 有啥优势?

点击此处输入评论
ruiorz

引用来自“阿肆ruiorz”的评论

引用来自“ccmv”的评论

why ? why? 有啥优势?

点击此处输入评论

快速简单
大灰狼wow
额,每访问一张图片就要跑脚本,性能开销太大,直接用nginx做代理就行
ruiorz

引用来自“大灰狼wow”的评论

额,每访问一张图片就要跑脚本,性能开销太大,直接用nginx做代理就行

点击此处输入评论
ruiorz

引用来自“阿肆ruiorz”的评论

引用来自“大灰狼wow”的评论

额,每访问一张图片就要跑脚本,性能开销太大,直接用nginx做代理就行

点击此处输入评论

只跑一次
CheneyWong
跟直接把固定扩展名解析到别的地方,有什么区别?
ruiorz

引用来自“ChanneW”的评论

跟直接把固定扩展名解析到别的地方,有什么区别?
有目录生成的问题
Bigjin

引用来自“cnu2m”的评论

图片状态全部404?

可以使用nginx的代理是最简单的,对原站做镜像
ruiorz

引用来自“林大锦”的评论

引用来自“cnu2m”的评论

图片状态全部404?

可以使用nginx的代理是最简单的,对原站做镜像
负载均衡?
雨花
不支持中文文件名的下载?
ruiorz

引用来自“雨花”的评论

不支持中文文件名的下载?
没测试过
bkkkd
有代理,你这样做太耗资源了。
×
ruiorz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: