服务器在收到浏览器请求的时候,可能会有不同的header信息,我们做个测试。

做个简单的php文件,打印出接受到的header信息:
<?php
foreach($_SERVER as $k=>$v){
  if(substr($k,0,5)=='HTTP_')echo "[$k] => $v\n";
}
?>

注:php接受到信息都在 $_SERVER[HTTP_xxxxx] 变量里。

IE访问

[HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-silverlight, application/x-shockwave-flash, */*
[HTTP_ACCEPT_LANGUAGE] => zh-cn
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; CIBA)
[HTTP_HOST] => www.aslibra.com
[HTTP_CONNECTION] => Keep-Alive

google浏览器

[HTTP_HOST] => www.aslibra.com
[HTTP_CONNECTION] => keep-alive
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.33 Safari/530.5
[HTTP_ACCEPT] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip,deflate,bzip2,sdch
[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8
[HTTP_ACCEPT_CHARSET] => UTF-8,*;q=0.5

firefox

[HTTP_HOST] => www.aslibra.com
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => zh-cn,zh;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_CHARSET] => gb2312,utf-8;q=0.7,*;q=0.7
[HTTP_KEEP_ALIVE] => 300
[HTTP_CONNECTION] => keep-alive

file_get_contents

[HTTP_HOST] => www.aslibra.com

wget

[HTTP_USER_AGENT] => Wget/1.9+cvs-stable (Red Hat modified)
[HTTP_HOST] => www.aslibra.com
[HTTP_ACCEPT] => */*
[HTTP_CONNECTION] => Keep-Alive

curl

[HTTP_USER_AGENT] => curl/7.12.1 (i386-redhat-linux-gnu) libcurl/7.12.1 OpenSSL/0.9.7a zlib/1.2.1.2 libidn/0.5.6
[HTTP_HOST] => www.aslibra.com
[HTTP_PRAGMA] => no-cache
[HTTP_ACCEPT] => */*

curl访问经过squid代理
( curl http://www.aslibra.com/ -x 127.0.0.1:3128 )

[HTTP_USER_AGENT] => curl/7.12.1 (i386-redhat-linux-gnu) libcurl/7.12.1 OpenSSL/0.9.7a zlib/1.2.1.2 libidn/0.5.6
[HTTP_HOST] => www.aslibra.com
[HTTP_PRAGMA] => no-cache
[HTTP_ACCEPT] => */*
[HTTP_VIA] => 1.1 cache.aslibra.com:3128 (squid/2.5.STABLE14)
[HTTP_X_FORWARDED_FOR] => 127.0.0.1
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive

我们可以看出来,每个方式都有很大的不同,一般服务器可以通过HTTP_USER_AGENT做出不同的限制。
要做欺骗行为,那也可以调整header信息达到效果。
一般浏览器会发出 [HTTP_ACCEPT_ENCODING] => gzip,deflate 表示可以接受代码压缩
Tags: , ,
20180228更新,nginx就可以完成

server {
    listen       8080;
    server_name  proxy.www.aslibra.com;
    if ( $uri ~ ^/x0y1/([^/]+)(.+)) {
        set $new_host $1;
        set $referer "";
        rewrite ^/x0y1/([^/]+)(.+) $2 last;
    }
    location / {
        proxy_set_header host $new_host;
        proxy_set_header referer  $referer;
        proxy_pass        http://127.0.0.1:8081;
    }
}

server {
    listen       8081;
    resolver 223.5.5.5;
    location / {
        proxy_pass        http://$http_host;
    }
}

---------------

阿权今天要说的问题是:
用户粘贴的图片是对方防盗链处理的图片,别人就无法看到图片了,体验很不好。

有问题就有解决办法,但需要预热一下:
1 别人是如何做图片防盗链的?
2 如何可以避免在防盗链范围?

了解或者解决以上两个问题你就可以出师了啦!

众所周知,图片防盗链是为了让自己的服务器提供给固定的某些域名下的网页显示自己的图片,主要为了解决带宽的占用问题。
阿权之前管理的图片类型的网站,居然可以让盗链的图片流量跑满了服务器带宽,所以盗链的问题很讨厌,一般网站都会处理此问题,一般采取的是检查图片请求的referer参数,这个不明白那这个课题还不适合你来读。

我们来看看凤凰网的图片防盗链,图片是很hot的美女哦,curl就可以测试:

[root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg
HTTP/1.1 200 OK
Server: DnionOS/1.0
Date: Fri, 26 Jun 2009 13:14:31 GMT
Content-Type: image/jpeg
Connection: keep-alive
Last-Modified: Wed, 10 Jun 2009 11:16:05 GMT
Accept-Ranges: bytes
Content-Length: 37727
Expires: Wed, 23 Jun 2010 08:11:48 GMT
Cache-Control: max-age=31536000
X-Cache: HIT from cache26.ifeng.com
Age: 24507
X-Cache: HIT from CNC-BJBY-53-172.fastcdn.com

[root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg -H "referer:http://www.aslibra.com/"
HTTP/1.1 403 Forbidden
Server: DnionOS/1.0
Date: Fri, 26 Jun 2009 13:14:57 GMT
Content-Type: text/html
Connection: keep-alive
Content-Length: 1204
Expires: Fri, 26 Jun 2009 13:15:02 GMT
X-Squid-Error: ERR_ACCESS_DENIED 0
X-Cache: MISS from CNC-BJBY-53-172.fastcdn.com

[root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg -H "referer:http://img.ifeng.com/"
HTTP/1.1 200 OK
Server: DnionOS/1.0
Date: Fri, 26 Jun 2009 13:17:37 GMT
Content-Type: image/jpeg
Connection: keep-alive
Last-Modified: Wed, 10 Jun 2009 11:16:05 GMT
Accept-Ranges: bytes
Content-Length: 37727
Expires: Wed, 23 Jun 2010 08:11:48 GMT
Cache-Control: max-age=31536000
X-Cache: HIT from cache26.ifeng.com
Age: 24691
X-Cache: HIT from CNC-BJBY-53-172.fastcdn.com


第一个是没有来源标识的,一般为在窗口直接输入图片地址
第二个是模拟在网页里面的图片,网址假设为http://www.aslibra.com/
第三个是模拟在img.ifeng.com的网页打开的

第一个和第三个返回是200的状态码,图片正常,第二个则因为是非授权网页引用,返回了403禁止的消息。
也有可能是返回200的状态码的,比如百度hi的图片:

[root@aslibra ~]# curl -I http://hiphotos.baidu.com/yuanyingmanhua/pic/item/6e1da9d832163a3b33fa1c2b.jpg
HTTP/1.1 200 OK
...
Cache-Control: max-age=315360000
Expires: Sun, 08 May 2016 14:12:03 GMT
Last-Modified: Sat, 29 Apr 2006 07:04:00 GMT
Content-Length: 43171
...

[root@aslibra ~]# curl -I http://hiphotos.baidu.com/yuanyingmanhua/pic/item/6e1da9d832163a3b33fa1c2b.jpg -H "referer:http://www.aslibra.com/"
HTTP/1.1 200 OK
...
Cache-Control: no-cache
Content-Length: 1809
...


当然,如果对方服务器是验证用户的信息的,那就没法解决了,我们能够解决的防盗链一般是根据来源防盗链的服务器。
注意了,破解对方的防盗链并非坏事,是为了提高用户体验,解决一般的用户的疑惑,他们根本不知道粘贴的图片为什么不正常,这你没必要跟他们聊一下图片防盗链吧?

你也许只要付出一台服务器就可以解决了:
1 首先你得把防盗链的域名的图片地址给替换为你的服务器域名,因为正常的访问你是控制不了referer信息的
2 交给代理服务器去掉或者修改referer信息,这个nginx很简便解决
3 再交给缓存服务器下载此图片,缓存此图片,这样对对方服务器没有什么影响,是好事来的

步骤1:替换图片地址

第一个就不用多说了,比如php就可以处理:

//example php code
$content = ereg_replace("http://($domain)/", "http://proxy.www.aslibra.com/m/\\1/", $content);
// from http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg
// to http://proxy.www.aslibra.com/m/img.ifeng.com/res/200906/0610-070615_1339_20.jpg


这样的简单处理可以保留所有的图片地址信息,而且可以自动还原原来的请求地址

步骤2 去掉或更改referer信息

这个有很多方法,比如配置proxy.www.aslibra.com/m交给php处理,php容易分析出地址,并且可以用socket或者调用curl等系统命令来下载图片,然后返回给用户。
这里用web服务器(nginx)解决这个问题,肯定比php来的简便和高效:

upstream squid {
  server 127.0.0.1:3128;
}
server {
  expires       240h;
  server_name  proxy.www.aslibra.com;
  if ( $uri ~ ^/m/([^/]+)(.+)) {
    set $new_host $1;
    set $referer "";
    #set $referer http://$1/; #you can set it like this
    rewrite ^/m/([^/]+)(.+) $2 break;
  }
  location / {
    proxy_set_header host $new_host;
    proxy_set_header referer  $referer;
    proxy_pass        http://squid;
  }
}


简单来说就是rewrite回原先的地址,并且设置referer,交给squid的后端。

步骤3 交给代理服务器缓存

visible_hostname cache.aslibra.com
acl all src 0.0.0.0/0.0.0.0
http_access allow all
http_port 127.0.0.1:3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on
httpd_accel_with_proxy off
cache_dir ufs /cache/proxy.www.aslibra.com 2000 16 256
cache_effective_user daemon
cache_access_log none
cache_store_log none
cache_log none


以上是squid的配置(2.5版本),基本不用配置什么参数,能代理缓存即可,有别的合适软件也许也可以做,但squid做这个实在是太合适了!你的不二之选!

实验效果很正常,返回的信息如下,访问两次有HIT说明就正常了:

(Status-Line)  HTTP/1.1 200 OK
Cache-Control  max-age=864000
Connection  keep-alive
Content-Length  59969
Content-Type  image/jpeg
Date  Fri, 26 Jun 2009 13:42:32 GMT
Expires  Mon, 06 Jul 2009 13:42:32 GMT
Last-Modified  Mon, 18 Dec 2006 07:25:14 GMT
Server  nginx/0.7.59
X-Cache  HIT from cache.aslibra.com


点击在新窗口中浏览此图片

效果对比,前面会提示禁止引用,后面是解决后正常显示图片的效果!
很神奇吧~~ 这样就为用户体验提高了一个等级啦~
注意,以上方案域名为测试指定,访问并非正常,请自行修改相关内容进行试验,大家使用愉快!

本方案更新请关注:
http://www.aslibra.com/blog/post/crack_pic_referer_solution.php

本解决方案目前无法解决的类型:

1 不是判断referer信息来防盗链的,当然如果你知道,也许可以类似方式解决
2 不能解决redirect后的图片,也许可以使用nginx的内部redirect来处理,还没试验,这类情况还不多
Tags: , , ,
memcachedb使用的BerkeleyDB的数据库,但每10M生成一个log文件:

[root@aslibra db]# ll -h
total 26G
-rw-r--r-- 1 root root  25G Jun 22 00:12 data.db
-rw-r----- 1 root root  24K Jun 20 19:33 __db.001
-rw-r----- 1 root root 3.8M Jun 20 19:33 __db.002
-rw-r----- 1 root root  81M Jun 20 19:33 __db.003
-rw-r----- 1 root root  96K Jun 20 19:33 __db.004
-rw-r----- 1 root root  11M Jun 20 19:33 __db.005
-rw-r----- 1 root root  48K Jun 20 19:33 __db.006
-rw-r----- 1 root root  10M Jun 21 22:47 log.0000002271
-rw-r----- 1 root root  10M Jun 21 22:47 log.0000002272
-rw-r----- 1 root root  10M Jun 21 22:48 log.0000002273
-rw-r----- 1 root root  10M Jun 21 22:49 log.0000002274
.....


定期清理为好,否则就要有两倍数据的空间了,以前写的是定期清理某个时间修改的日志:

find /BerkeleyDB/aslibra.com/db/ -maxdepth 1 -type f -name 'log.*' -mmin +100 | xargs -i rm -f {}


清理100分钟前的文件,导致了一个文件,如果停用或者100分钟内没有更新动作,将删掉了所有日志,吃亏了,导致启动失败了,当然,可能可以修复,只是糊涂的话就没法再启用了。

稳当点,就删除所有的日志文件,保留最新的100个:

#!/bin/sh

cd /BerkeleyDB/aslibra.com/db/
ls -t log.* | awk '{ if(NR>100)print $0}'|xargs -i -t rm -f {}


简单解析一下脚本意思:

ls -t log.* 是列出所有log开头的日志文件,按时间排序,也就是最新的排前面
awk里面NR代表当前行数,NR>100则是100行后的才输出
xargs就是接收到awk输出的文件才转给rm删除

参考资料:awk手册
Tags: ,
安装可以参考官方说明:
http://blog.csdn.net/simon...

顺带放个笔记:

[root@aslibra install_memcachedb]# ls
db-4.7.25.tar.gz  install.sh  libevent-1.4.8-stable.tar.gz  memcachedb-1.2.0.tar.gz

[root@aslibra install_memcachedb]# cat install.sh

echo ==== install BerkeleyDB-4.7.25 ====
sleep 2

tar xfz db-4.7.25.tar.gz
cd db-4.7.25/build_unix/
../dist/configure || exit 6
make || exit 6
make install
cd ../../

if grep /usr/local/BerkeleyDB.4.7/lib /etc/ld.so.conf
then
        echo OK
else
        echo /usr/local/BerkeleyDB.4.7/lib >> /etc/ld.so.conf
fi

echo ==== install libevent-1.4.8 ====
sleep 2

tar xfz libevent-1.4.8-stable.tar.gz
cd libevent-1.4.8-stable
./configure || exit 6
make || exit 6
make install
cd ../

if grep /usr/local/lib /etc/ld.so.conf
then
        echo OK
else
        echo /usr/local/lib >> /etc/ld.so.conf
fi

ldconfig

echo ==== install memcachedb-1.2.0 ====
sleep 2

tar xfz memcachedb-1.2.0.tar.gz
cd memcachedb-1.2.0
./configure || exit 6
make || exit 6
make install
Tags:
问题示例:
网站有千万个网页文件需要存储,占用空间大约有300-400G,导致问题:
1 小文件太多,备份困难
2 空间增长很难调整
3 前端做缓存,因为object很高,效率很低,squid和lighttpd都不合适

解决方案说明:

1 nginx+memcached接口

Nginx有一个模块是可以读取memcached的数据的,可以把网页文件内容保存到memcached里面,如果数据无效,则proxy到后端,后端服务器更新此数据

2 memcachedb接口

memcachedb是新浪的一个开源项目,用硬盘作为存储空间,用的是Berkeley DB的存储引擎,memcached的协议。
有memcached的方便性,同时有高效的读写性能,没有内存作为存储空间的限制,数据永久保留,同时使用局域网的机器就可以处理并且很容易共享,不限制为本地文件,有自动的备份机制。

3 php程序管理存储

php处理memcached很容易,和前端约定相应的key即可

4 计划任务处理更新

由于memcachedb是永久保存,前端无法判断是否过期,所以需要自己制定策略删除过期的网页,以便前端获取不到而自动更新

5 magent作为memcachedb的代理接口,解决备份问题

memcachedb有备份方法,我碰到过出现无法同步的情况,magent也可以帮助解决此问题,它是为memcached设计的,但由于memcachedb使用memcached协议,所以也同样适用

解决方案配置示例:

假设www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服务器A(2)和B(3)作为memcachedb服务,可以在A(2)上跑magent,C(4)服务器是后端服务器,负责存入memcachedb数据

前端Nginx配置判断:

upstream backend {
  server 192.168.1.4;
}
upstream memcachedb {
  server 192.168.1.2:11212;
  server 192.168.1.3:11212 backup;
}
server {
  server_name  www.aslibra.com;
  location / {
    proxy_pass http://backend;
  }
  location ~* ^/article/ {
    set $memcached_key $host$uri;
    default_type       text/html;
    memcached_pass     memcachedb;
    error_page         404 = /fallback;
  }
  location = /fallback {
    internal;
    proxy_set_header  memcached_key $memcached_key;
    proxy_pass http://backend;
  }
}


定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header  memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致

A和B缓存服务器:

memcachedb -p 11212 -l 0.0.0.0 -u root -d -r -N -H /data/aslibra.com/article/


如果配置主从,那可以启用magent:

magent -s 192.168.1.2:11212 -b 192.168.1.3:11212
#默认监听 0.0.0.0:11211,提供给PHP使用
#比如这里是在192.168.1.2上运行


C服务器配置rewrite(lighttpd):

$HTTP["host"] == "www.aslibra.com" {
        server.document-root = "/data/www.aslibra.com/"
        url.rewrite-once = (
                "^/article" => "/php/cache.php"
        )
}


PHP代码参考:

<?
//do sth to build html
echo $html;

//如果有传递memcached_key值就把结果存入memcachedb
//不需要设置缓存时间,因为没有用 :)
//有需要更新,那就记录一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
  $m = new Memcache;
  if($m->connect('192.168.1.2', 11211) ){
    $key = $_SERVER['HTTP_MEMCACHED_KEY'];
    $m->set($key, $html);
    //有必要就记日志
    //log to file...
  }
}
?>


删除文件:

如果有记录日志(可以是web服务器日志或者php记录的日志),可以根据保存的日志处理
需要删除的 $m->delete($key) 即可

备份请参考memcachedb的操作指南。
此解决方案适合memcached的存储方式,况且不用处理过期的问题,php可以解决过期时间
文章更新请关注本文更新:
http://www.aslibra.com/blo...

参考资料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式数据库系统Berkeley DB
6 memcached和magent的安装
7 memcachedb的安装
分页: 7/12 第一页 上页 2 3 4 5 6 7 8 9 10 11 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐