文档章节

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

ruiorz
 ruiorz
发布于 2014/06/17 12:01
字数 624
阅读 2425
收藏 94
点赞 4
评论 16

        随着网站的访问量增加,页面打开过程中,图片下载就占了好大一部分,今天就分享一种简单易用的方法来建立图片服务器,将主网站的图片访问压力转移到另外一台服务器上,经过这种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
Markdown博客系统Gitblog-V2.1版本代码更新

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

jockchou
2015/08/04
0
0
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
OkHttp3简单使用教程(一):请求和响应

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

木有粗面_9602
01/13
0
0
Gitblog v2.1.3 发布,开源 markdown 博客系统

Gitblogv2.1版本发布更新 2.1.3版本更新特性 此版本主要是bug修复 1.修复了中文markdown文件名页面404的问题2.修复了不同文件夹下同名markdown冲突的问题3.修复draft状态博客也显示的bug4.修...

jockchou
2015/08/22
1K
6
前端性能优化----yahoo前端性能团队总结的35条黄金定律l

除了自己总结:1. 减少http请求,2.压缩并优化js/css/image 3.尽量静态页面,从简原则 4.代码规范(详见:个人知识体系思维导图) 从yahoo 新学到的: 网页内容 减少http请求次数 80%的响应时间...

明了
2016/11/25
380
0
img src 中文路径解决办法

url路径包含中文 问题:使用显示图片,遇到的问题:如果图片的路径、图片名存在中文,则 无法读取到图片。 原因:主要是由于字符编码不一致,Tomcat 的http Connector默认字符编码是"iso-88...

灰鳖子
2016/12/22
53
0
html5 canvas系列教程-像素操作(反色,黑白,亮度,复古,蒙版,透明)

getImageData:获取一张图片的像素数据 cxt.getImageData( x, y, width, height ) x:图片所在的x坐标 y: 图片所在的y坐标 width,height 要获取的像素区域 返回值是一个对象,对象包括一个d...

急速奔跑中的蜗牛
06/23
0
0
初探JavaScript的截屏实现

最近参与了网易炉石盒子的相关页面开发,在做卡组分享页(地址:炉石盒子卡组分享),有个需求:用户可以把这个卡组以图片的形式分享给好友。最初的的做法是使用服务器把该页面转换成图片,然...

xsster
2017/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
26分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
33分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
56分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
44
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部