文档章节

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

ruiorz
 ruiorz
发布于 2014/06/17 12:01
字数 624
阅读 2432
收藏 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
2018/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
2018/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux syslog相关函数详解

介绍 syslog是Unix系统的日志系统。可以将日志记录在本地系统中。 一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。 syslong相关函数 1....

RongJinhui0
16分钟前
0
0
使用nsenter工具进入Docker容器

查看本机装没有nsenter whereis nsenter或者whatis nsenter 未安装先安装,网上有很多这样的脚本 vi nsenter.sh#!/bin/bashcurl https://www.kernel.org/pub/linux/utils/util-linux/v2....

问题终结者
17分钟前
1
0
MaxCompute安全管理指南-基础篇

背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全。 MaxCompute有安全模型,DataWorks也有安全模型,当通过DataWorks使用MaxCompute,而...

阿里云云栖社区
17分钟前
0
0
Retrofit设计模式源码解析

因为Retrofit做到了很强的解耦,因此就一定需要用到很多设计模式。所以,我觉得,通过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。 大致看了一圈Retrofit源码,受益匪浅...

亭子happy
18分钟前
3
0
哈夫曼编码

哈夫曼编码的基本思想是以字符的使用频率作为权构建一颗哈夫曼树,然后利用 哈夫曼树对字符进行编码 哈夫曼算法采用的贪心策略是每次从树的集合中取出没有双亲权值最小的两棵作为左右子树, ...

writeademo
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部