NGINX之企业优化最佳实践二

1、Nginx图片及目录防盗链解决方案

资源盗链:盗用别人的网站资源,达到装饰自己网站的效果,导致盗用网站的带宽、压力增大;

1.1网站资源被盗出现严重问题及防御

  1. CDN网站加速服务流量超了好几个GB
  2. 对IDC及CDN带宽做监控报警
  3. 经常查看流量图,关注流量变化,关注异常流量
  4. 对访问日志做分析,迅速定位异常流量

1.2常用防盗链解决方案的基本原理

(1)根据HTTP referer实现防盗链

在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示是哪里的链接用了当前网页的资源,通过referer可以检测访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止或返回指定的页面。

HTTP referer是header的一部分,但浏览器向Web服务器发送请求时,一般会带上referer,告诉服务器我是从那个页面链接过来的,服务器借此获得一些信息用于处理。Apache、Nginx、Lighttpd三者都支持根据HTTP referer实现防盗链,referer是目前网站图片、附件、html等最常用的防盗链手段。

(2)根据cookie防盗链

对于Flash、Windows Media视频这种占用流量较大的业务数据,防盗链是比较困难的,此时可以采用Cookie技术,解决Flash、Windows Media视频等的防盗链问题。

例如:ActiveX插件不传递referer,但会传递Cookie,可以在显示ActiveX的页面的<head></head>标签内嵌入一段JavaScript代码,设置”Cookie Cache=av”如下:

<script> document.cookie="Cache=av;domain.com;path=/"; </script>

然后就可以通过各种手段来判断Cookie的存在,以及验证其值的操作了。

(3)通过加密变换访问路径实现防盗链

此种方法比较适合视频及下载类业务数据的网站。例如:Lighttpd有类似的插件mod_secdownload来实现此功能。先在服务器端配置此模块,设置一个固定用于加密的字符串,比如chengzi,然后设置一个url前缀,比如/mp4/,再设置一个过期时间,比如1小时,然后写一段PHP代码,利用加密字符串和系统时间等通过md5算法生成一个加密字符串。最终获取到的文件的URL链接中会带有一个时间戳和一个加密字符的md5值,在访问时系统会对这两个数据进行检验。如果时间不在预期的时间段内(如1小时内)则失效;如果时间戳符合条件,但是加密的字符串不符合条件也会失效,从而达到防盗链的效果。

PHP代码实例如下:

<?php
$secret = "chengzi";                             //加密字符串,必须和lighttpd.conf里的保持一致
$uri_prefix = "/mp4/";                           //虚拟的路径、前辍,必须和lighttpd.conf里的保存一致
$file = "/test.mp4";                             //实际文件名,必须加“/”斜杠
$timestamp = time();                             //current timestamp
$t_hex = sprintf("%80x",$timestamp);             
$m = md5($secret.$file.$t_hex);
printf('%s',$uri_prefix,$m,$t_hex,$file,$file);  //生成uri地址串
?>

1.3Nginx Web服务实现防盗链实战

(1)利用referer,并且针对扩展名rewrite重定向

下面的代码为利用referer且针对扩展名rewrite重定向,实现防盗链的Nginx配置:

location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
  valid_referers none blocked *.xionghaier.cn xionghaier.cn;
if ($invalid_referer) {
   rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg;
   }
}

设置expires的方法如下:

[root@iZm5eh8g1nh0vcbupue6dnZ nginx]# vim conf.d/blog.conf 

 server {
 listen 80 default_server;
 server_name _;
 rewrite ^(.*) http://xionghaier.centoscn.cn/$1 permanent;
}

 server {
 listen 80;
 server_name xionghaier.centoscn.cn;
 location / {
 root html/blog;
 index index.php index.html index.htm;
 }
 location ~* .*\.(php|php5)?$ {
 root html/blog;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 }
 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
 access_log off;
 }
 location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
 valid_referers none blocked *.xionghaier.cn xionghaier.cn;
 if ($invalid_referer) {
 rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg;
 }
 access_log off;
 expires 1d;
 break;
 }
 }

(2)利用referer,并且针对站点目录过滤返回错误码

针对目录的方法如下:

location /images {
 root /data0/www/www;
 valid_referers none blocked *.xionghaier.cn xionghaier.cn;
 if ($invalid_referer) {
 return 403;
 }
 }

上述代码说明:

  • “jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示对.jpg .gif .png .swf .flv .wma .wmv .asf .mp3 .mmf .zip和.rar为后缀的文件实行防盗链处理。
  • “*.xionghaier.cn xionghaier.cn”表示这个请求可以正常访问上面指定的文件资源。
  • if{}中内容的意思是如果地址不是上面指定的地址就跳转到通过rewrite指定的地址,也可以直接通过return返回403错误。
  • return 403 为自定义的http返回状态码。
  • rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg 表示显示一张防盗链图片;
  • access_log off;表示不记录访问日志,减轻压力。
  • expires 3d指的是所有文件设置3天的浏览器缓存。

1.4Nginx Http Access Key Module实现防盗链介绍

如果不怕麻烦,有条件的话,推荐使用Nginx Http Access Key Module。

其运行的方式是:如download目录下有一个file.zip的文件。对应的URI是http://www.abc.com/download/file.zip,使用ngx_http_accesskey_module模块后就成了http://www.abc.com/download/file.zip?key=09093abeac094,只有正确地给定了key值,才能下载download目录下的file.zip,而且key值是与用户的IP相关的,这样就可以避免被盗链了

2.错误页面优雅显示

范例:将错误状态码重定向到一个location,命令如下:

location / {
  error_page 404 = @fallback;
}
location @fallback {
  proxy_pass http://backend;
}

阿里门户网站天猫的Nginx优雅显示配置案例如下:

 error_page 500 501 502 503 504 http://err.tmall.com/error2.html;
 error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;

1.5Nginx站点目录文件及目录权限优化

1.单机LNMP环境目录权限严格控制措施

为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有的目录权限是755;所有的文件权限是644。设置如下:

[root@izm5eh8g1nh0vcbupue6dnz blog]# chown root.root `ls /usr/share/nginx/html/blog/|tail -5`
[root@izm5eh8g1nh0vcbupue6dnz blog]# 
[root@izm5eh8g1nh0vcbupue6dnz blog]# ls -l /usr/share/nginx/html/blog/|tail -5
-rw-r--r-- 1 root root 8048 Jan 11 2017 wp-mail.php
-rw-r--r-- 1 root root 16255 Dec 21 05:50 wp-settings.php
-rw-r--r-- 1 root root 29896 Oct 19 2016 wp-signup.php
-rw-r--r-- 1 root root 4513 Oct 15 2016 wp-trackback.php
-rw-r--r-- 1 root root 3065 Sep 1 2016 xmlrpc.php

以上的权限设置可以防止黑客上传木马,以及修改站点文件,但是,合理的网站用户上传的内容也会被拒之门外。那么如何让合法的用户可以上传文件,又不至于被黑客利用攻击呢?

如果是单机的LNMP环境,站点目录和文件属性设置如下。

先把所有的目录权限设置为755,所有的文件权限设置为644,所用的目录及文件用户和组都是root;然后针对上传资源的目录权限设置为755,将用户和组设置为Nginx服务的用户,最后针对上传资源的目录做资源访问限制。

服务器角色:动态Web集群   static图片集群   上传upload集群

权限处理:动态Web集群,目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx+php

static图片集群,目录755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx

上传upload集群,目录权限755,文件权限644,所用目录及文件用户和组都是root,用户上传的目录设755,用户组用Nginx

1.6Nginx防爬虫优化

Nginx放爬虫优化配置

我们可以根据客户端的user-agents信息,轻松地阻止指定的爬虫爬取网站

范例1:阻止下载协议代理,命令如下:

if ($http_user_agent ~* LWP::Simple|bbbike|wget) {
  return 403;
}
如果用户匹配了if后面的客户端如wget,就返回403;

范例2:添加内容防止N多爬虫代理访问网站,命令如下:

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googbot-Image|Mediapartners-Google|...") {
   return 403;
}

范例3:禁止不同的浏览器软件访问:

if ($http_user_agent ~* "Firefox|MSIE") {
 rewrote ^(.*) https://www.xionghaier.cn/$1 permanent;
}

1.7利用Nginx限制HTTP的请求方法

限制http的请求达到提升服务器安全的目的,例如http只能使用get head post方法的配置:

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
 return 501;
}

在上传的服务器upload上现在http的get方法的配置:

if ($request_method ~* ^(GET)$ ) {
 return 501;
}

 

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到