近期有一台服务器流量爆增,速度峰值从原来不到1M,一下子飚到12M,因为服务器上有很多mp3文件,是用户相册的背景音乐,估计是有用户把这个背景音乐的链接给发布出去了。
查看了一下日志文件,到处充斥着类似
125.71.138.240 - - [20/Oct/2007:23:59:29 +0800] "GET /user/hubaolai/misc/07131250f5da21189d8eea6104be3d9f.mp3 HTTP/1.1" 206 442947 "
http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=65&word=Anyclub+%C0%EE%D0%A2%C0%FB" "Mozilla/4.0 (compatible; MSIE 6.0; Win
dows NT 5.1)"
瀑布汗
而且这些流量主要集中在三个用户的目录下,检查了这三个用户的文件夹,除了mp3之外,一张图片都没有。额滴神呀,我们是做相册滴,这几个老兄也太有才了,20M的空间能放几个mp3呀,真是的,还非得把地址给共享出来。
vi httpd.conf
XML/HTML代码
- SetEnvIfNoCase Referer "^http://.*\.admin99\.net" local_ref=1
- <FilesMatch "\.(mp3|jpg|jpeg)">
- Order Allow,Deny
- Allow from env=local_ref
- </FilesMatch>
以此,保护mp3,jpg,jpeg三种文件,只能通过相册里的播放器才能调用
这样的设置有一个小问题。直接在地址栏中输入一个图片或者mp3的地址的时候,也无法访问。
如果允许能直接访问这些文件
需要在刚才的配置中加上一句
XML/HTML代码
- SetEnvIfNoCase Referer "^$" local_ref=1
如果要通过ip也能访问到这些文件,需要在上述配置中再加一句
XML/HTML代码
- SetEnvIfNoCase Referer "^http://000\.000\.000\.000\.*" local_ref=1
如果你有多台服务器,并且他们在一个ip段中
那么上面这句可以写为
XML/HTML代码
- SetEnvIfNoCase Referer "^http://000\.000\.000\.*" local_ref=1
上面两句配置都要主意其中第一个000前面没有那个“.”
保存退出重起apache
看日志,mp3.baidu.com来的链接,都成了403 Forbidden
观察10分钟,流量从12M里马回落到2M到3M之间
但是觉得这个流量还是偏高
再看日志,虽然大部分针对mp3的访问都成了403,却仍然有一些访问的代码成了206 获得部分文件?
百思不得其解,白查不得答案,感觉应该是迅雷,超级旋风之类的下载软件,自己用迅雷试了一下,果然还可以下载 -_-!。
据说这些软件有一种欺骗技术,可以欺骗服务器的reffer。有人根据迅雷下载是在日志中留下的agent代码 Mozilla/4.0 (compatible; MSIE 6.0 来进行限制,刚开始还挺高兴,猛地发现,自己访问网站是留下的agent代码也是这样地,这个问题留待以后解决,自己用IE访问,用maxthon访问,用迅雷下载,留下的agent代码都含有 Mozilla/4.0 (compatible; MSIE 6.0 。再细看这篇文章,发布日期是2006年,算了,你迅雷下载就下载吧,反正再过一星期,服务器上所有的mp3都要删除了,娃哈哈哈.....-_-!!!
使用.htaccess文件
首先,要确保开启了RewriteEngine。
apache中默认是不使用.htaccess文件的
与之相关的两个参数是 AllowOverride 和 AccessFileName
AllowOverride的全称是分布式配置文件功能。
默认时该指令设置为none,此时 .htaccess文件会被完全忽略。事实上,服务器根本不会读取.htaccess文件。
如果该指令设置为 All 时,所有具有 .htaccess 作用域的指令都允许出现在.htaccess文件中。
该指令还有其它几个值,比如AuthConfig,FileInfo ,Indexes,Limit,Options[=Option,...],此处不一一介绍。
一般要使.htaccess生效,将其设置为all。
另外,Allowoverride指令仅在不包含正则表达式的<Directory>配置段中才是有效的。这个很重要,单独修改httpd.conf中的那一行 Allowoverride none是没用的。
例如,在我服务器上的配置为
<Directory "/data/htdocs/spacemx/user">
AllowOverride All
</Directory>
其中的 /data/htdocs/spacemx/user 是用户数据的根目录,就是本例要保护防盗链的目录。
这三行配置可以写在虚拟主机配置段内,也可以写在段外。
另外一个参数AccessFileName,默认值为 .htaccess,当然,你可以修改为任意的你想要的文件名。
配置好apache之后,然后就来写 .htaccess文件了,该文件最好放置在你要保护的位置的根目录
我服务器上的.htaccess文件的内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !admin99.net [NC]
RewriteRule .*\.(gif|jpg|jpeg)$ http://www.admin99.net/xianzhi.gif [R,NC,L]
通过这个配置,所有盗链的图片均被rewrite到了自己设置的图片上,警示别人不允许盗链。
RewriteCond声明了生效的条件,在引用地址不是本站的时候,开始生效。
RewriteRule设置了规则,即,把盗链全部转向到设置好的警示图片。
.htaccess中的内容也可以直接写入httpd.conf中的虚拟主机配置段内,那样的话,就不需要设置.htaccess文件了。
apache的功能真是太强大了,这也直接导致它成了一个重型的web服务器,相比于后起的轻型web服务器lighttpd和Nginx 之流,他在响应速度方面已经远远落后了。但在稳定性和功能性依然遥遥领先。
有个下载站,提供大文件的上传下载服务,没有盗链,都是正常应用,带宽经常占满。后来查到原来有几个用户使用的带宽是百兆光纤,这几个用户一下载,整个服务器的带宽就基本上被用光了,其他用户再来下载,基本上就下载不下来了。
机房给的带宽是百兆共享,最多能用到10M,为了能充分合理的使用带宽,这里使用了apache的bw_module。
安装
wget http://apache.ivn.cl/files/source/mod_bw-0.8.tgz
tar xzvf mod_bw-0.8.tgz
cd mod_bw
/usr/local/apache/bin/apxs -i -a -c mod_bw.c
配置
编辑httpd.conf
添加如下一行
XML/HTML代码
- LoadModule bw_module modules/mod_bw.so
设置带宽控制策略
我这里的需求有两点,一是只要带宽足够,则尽量给用户最多的带宽;而是如果同时下载人数过多,则给用户保障一个最低带宽,并且尽量平均分配。
XML/HTML代码
- BandWidthModule on
- ForceBandWidthModule On
- BandWidth all 10240000
- MinBandWidth all 204800
在这种情况下,总带宽限制在10M,如果服务器上只有一个用户在下载,那么就给他10M的带宽(如果客户端也能有这么高带宽的话),当有50个用户在下载的话,则保障每个用户都能有200K带宽,当有100个用户在下载的话,则平均每个用户分配100K带宽。
bw_module的策略还有很多种,具体可以看源代码中的mod_bw.txt
mod_expires 模块的主要作用是自动生成页面头部信息中的 Expires 标签和 Cache-Control 标签,从而降低客户端的访问频率和次数,达到减少不必要流量和增加访问速度的目的。
mod_expires 是 apache 众多模块中配置比较简单的一个,它一共只有三条指令:
ExpiresActive
ExpiresByType
ExpiresDefault
ExpiresActive 指令:打开或关闭产生”Expires:”和”Cache-Control:”头的功能。
ExpiresByType 指令:指定MIME类型的文档(例如:text/html)的过期时间。
ExpiresDefault 指令:默认所有文档的过期时间。
过期时间的写法:
“access plus 1 month”
“access plus 4 weeks”
“now plus 30 days”
“modification plus 5 hours 3 minutes”
A2592000
M604800
access、now及A 三种写法的意义相同,指过期时间从访问时开始计算。
modification及M 的意义相同,指过期时间是以被访问文件的最后修改时间开始计算。
所以,后一种写法只对静态文件起作用,而由脚本生成的动态页面不受它的作用。
一般情况下,我们都使用access方式,下面是一个我使用的配置:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault “access plus 12 hours”
ExpiresByType text/html “access plus 3 days”
ExpiresByType text/plain “access plus 3 days”
ExpiresByType image/gif “access plus 30 days”
ExpiresByType image/png “access plus 30 days”
ExpiresByType image/jpeg “access plus 30 days”
ExpiresByType image/x-icon “access plus 30 days”
</IfModule>
需要提醒您的是,经过Expires处理的URL地址,可以被浏览器及代理服务器缓存,请只在需要的地方使用。
参考文档:
Apache 1.3.x http://httpd.apache.org/docs/1.3/mod/mod_expires.html
Apache 2.0.x http://httpd.apache.org/docs/2.0/mod/mod_expires.html