文档章节

自制简单的image图片服务器,404原理

ruiorz
 ruiorz
发布于 2014/06/17 12:01
字数 624
阅读 2429
收藏 94

        随着网站的访问量增加,页面打开过程中,图片下载就占了好大一部分,今天就分享一种简单易用的方法来建立图片服务器,将主网站的图片访问压力转移到另外一台服务器上,经过这种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是必须图片,还有就是需要判断只允许目标主机进行访问,还有很多需要改进的地方,欢迎大家讨论!

© 著作权归作者所有

共有 人打赏支持
ruiorz
粉丝 7
博文 8
码字总数 6773
作品 0
西安
技术主管
私信 提问
加载中

评论(16)

bkkkd
bkkkd
有代理,你这样做太耗资源了。
ruiorz
ruiorz

引用来自“雨花”的评论

不支持中文文件名的下载?
没测试过
雨花
雨花
不支持中文文件名的下载?
ruiorz
ruiorz

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

引用来自“cnu2m”的评论

图片状态全部404?

可以使用nginx的代理是最简单的,对原站做镜像
负载均衡?
Bigjin
Bigjin

引用来自“cnu2m”的评论

图片状态全部404?

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

引用来自“ChanneW”的评论

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

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

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

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

点击此处输入评论

只跑一次
ruiorz
ruiorz

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

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

点击此处输入评论
大灰狼wow
大灰狼wow
额,每访问一张图片就要跑脚本,性能开销太大,直接用nginx做代理就行
centos 6 cdn简单搭建笔记

总体结构: 拓扑图如下 192.168.2.128配置: yum install nginx -y vim /etc/nginx/conf.d/default.conf server { listen 80 defaultserver; //指定监听 servername www.cdbtest.com;//域名访......

crews_lomans
06/29
0
0
Gitblog-v2.1 版本更新功能,Markdown 博客系统

Gitblog 2.1 更新进度,已经完成开发的功能: 1.优化了博客属性的提取,采用正则,减少代码 2.summary属性支持多行 3.支持wordpress导入 4.SEO优化 5.新增主题line 6.博客可定义head属性表示...

jockchou
2015/08/04
2.1K
4
nginx与Tornado服务中的图片问题

我用Nginx和Tornado搭建一个环境。图片放在服务器/www/web/image,配置如下面。 浏览器输入http://xx.xx.xx.xx能够显示(无图片),然后我在浏览器输入http://xx.xx.xx.xx/image/xx.gif时出现4...

hapming
2011/12/27
1K
2
Markdown博客系统Gitblog-V2.1版本代码更新

Gitblog官网 Gitblog使用手册 Gitblog官方QQ群: Gitblog2.1更新进度 已经完成开发的功能: 1.优化了博客属性的提取,采用正则,减少代码 2.summary属性支持多行 3.支持wordpress导入 4.SEO优...

jockchou
2015/08/04
0
0
OkHttp3简单使用教程(一):请求和响应

一,HTTP请求、响应报文格式 要弄明白网络框架,首先需要先掌握Http请求的,响应的报文格式。 HTTP请求报文格式: HTTP请求报文主要由请求行、请求头部、请求正文3部分组成. request.png 请求...

木有粗面_9602
01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
29分钟前
1
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
38分钟前
1
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
42分钟前
1
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
47分钟前
1
0
cron语法格式

Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month DayofWeek...

JavaSon712
48分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部