Nginx优化(二)

  1. 云栖社区>
  2. 博客>
  3. 正文

Nginx优化(二)

科技探索者 2017-11-22 22:58:00 浏览1465

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

什么是防盗链
   简单的说,就是某些不法网站,通过在其自身网站程序里未经许可非法调用其它网站的资源,然后在自己的网站上显示这些调用的内容,达到填充自身网站显示的效果,但是消耗了了源站的网络流量,造成其他网站的带宽及服务压力吃紧,甚至宕机(图片水印,防火墙,防盗链)网站资源被盗链带来的问题
    最直接的影响就是网络带宽占用加大了,带宽费用损失,监控软件告警,服务器压力加大,甚至网站的正常用户访问也受到影响

如何及时发现盗链?

1、对IDC及CDN带宽做监控

2、作为高级运维或运维经理,每天上班的一个重要任务,就是经常查看网站流量图,关注流量变化与异常流量

3、访日日志分析,对于异常流量迅速定位,并且与市场推广有较好沟通,以便调度带宽和服务器资源,确保网站正常访问体验得到保证。


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


1、根据http referer实现防盗链在HTTP协议中,有个表头字段叫referer,使用URL格式来表示从哪里来的链接到当前网页的资源,通过referer可以检测目标访问的来源网页,
如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站,马上进行阻止或返回指定的页面HTTP Reffer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器是从哪个页面链接过来的,
服务器借此可以获得一些信息用于处理。Apache、Nginx、Lighttpd三者都支持根据此指令实现防盗链,目前referer是网站图片、附件、html等最常用的防盗链手段。

提示:nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.
location ~* \.(gif|jpg|png|bmp)$ {
   valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.;
   if ($invalid_referer) {
       return 403;
       #rewrite ^/ http://www.ttlsa.com/403.jpg;
   }
}
以上所有来至ttlsa.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.

2、根据cookie防盗链
通过ActiveX显示的内容不向服务器提供Referer Header(例如,Flash,WindowsMedia视频等)
ActiveX插件不传递Referer,但是却忠实的传递Cookie。于是在显示ActiveX的页面的<head> </head>标签内嵌入一段代码:
<script> document.cookie=”Cache=vod;domain=domain.com;path=/”; </script>
这段代码用 javascript 设置了一段 Cookie: Cache=vod
然后通过各种ACL来判断这个Cookie的存在以及验证其值的操作了

3、通过加密变换访问路径实现防盗链
 lighttpd有类似的插件 mod_secdownload

4、Nginx web服务通过referer实现防盗链
a、利用referer并且针对扩展名rewrite重定向
location ~* \.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
    valid_referers none blocked *.lvnian.com lvnian.com;
    if ($invalid_referer)
{
    #rewrite ^/ http://www.765h.com/error.html;
    return  403;
     }
}
提示:根据自己公司实际业务进行域名设置(外链合作)
b、利用referer并且针对站点目录过滤返回错误代码
location /img/ {
root /data/img/;
   valid_referers none blocked *.lvnian.com lvnian.com;
 if ($invalid_referer) {
 rewrite ^/ http://www.lvnian.com/error.gif;
 #return 403;
 }
}

5、Nginx的HttpAccessKeyModule实现防盗链
6、产品设计上解决防盗链,为网站上传图片增加水印



配置错误页面优雅显示


在网站运行过程中,可能由于页面不存在或者系统过载等原因,导致网站无法正常响应用户请求,此时web服务默认会返回默认的错误代码,或者不友好的页面我们可以将404、403等错误信息页面重定向到网站首页或者其他事先指定的页面,提升用户体验
server {    
listen    80;    
server_name    www.gtms.org;    
location / {        
root        html/www;       
 index    index.html index.htm;           
  }    
  
  error_page    403        /403.html    
  error_page    404        /404.html   
   error_page    404        http://www.gtms.org
}
    扩展(天猫)
    error_page  500 501 502 503 504 
     error_page  400 403 404 405 408 410 411 412 413 414 415 http://XXX/error1.html


 



nginx站点目录文件及目录权限优化


单机LNMP环境目录权限严格控制措施为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有目录权限设置为755,所有文件权限是644,然后把用户上传资源的目录权限设置为755 ,用户和组设置为nginx服务的用户,最后针对上传资源的目录做资源访问控制

大多数公司的不安全的授权如下:
1)chmod -R 777 /sitedir(最不安全)
2) chmod -R nginx.nginx /sitedir(最不安全)
如果大多数公司授权一般的授权,会给网站带来最大的安全隐患,特别是木马入侵在较好的网站业务架构中,应把资源文件,包括用户上传的图片、附件等服务和程序服务分离,最好把上传程序服务也分离,这样可以从容按照前面安全的标准授权了


 



防爬虫优化(开发管)

Nginx防蜘蛛爬虫处理
假定一个场景:某个网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取。有如下方法:
方法一:修改nginx.conf,禁止网络爬虫的ua,返回403。
server { 
listen 80; 
server_name 127.0.0.1; 
#添加如下内容即可防止爬虫if ($http_user_agent ~* " qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") 
{ 
return 403; 
}

方法2:网站更目录下增加Robots.txt,放在站点根目录下。
在http://tool.chinaz.com/robots/站点可以针对现在的搜索引擎按照想要的规则生成robots.txt文件。知识扩展:
       robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
   当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;
如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。百度官方建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。 Robots协议是国际互联网界通行的道德规范,基于以下原则建立:
1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;2、网站有义务保护其使用者的个人信息和隐私不被侵犯。 当然,如果搜索引擎不遵守约定的Robots协议,那么通过在网站下增加robots.txt也是不起作用的。(在正式环境中,可以适当允许搜索引擎抓取收录)


 



利用nginx限制http的请求方法


其中最常用的http方法为GET、POST,我们可以通过nginx限制http请求的方法来达到提升服务器安全的目的,例如,让http只能使用GET、HEAD和POST方法的配置如下
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
return 501;
}
#可以控制对设置针对某几个php不能get在上传服务器其上限制HTTP的GET方法配置如下
if ($request_method !~ ^(GET)$ ){return 501;}
#还可以加一层location更具体的显示文件名


 

使用CDN做网站内容加速


CDN的全称是Content Delivery Network,即内容分发网络。(网宿、蓝讯、快网)
简单的讲,通过现有的internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器,通过只能DNS负载均衡技术,判断用户的来源,让用户就近使用和服务器相同线路的带宽访问cache服务器取得所需内容
例如:天津网通用户访问田间网通cache服务器上的内容,北京电信访问北京电信cache服务器上的内容,
这样可以减少数据在网络上传输的时间,提高访问速度BGP机房虽然可以提升用户体验,但是价格昂贵,对于用户来说,CDN的诞生可以提供比机房更好的体验(让同一地区、同一线路的用户访问和当地的网站)。
BGP机房和普通机房有将近5-10倍的价格差。CDN多使用单线的机房,根据用户的线路以及位置,为用户选择靠近用户位置以及相同的运营商线路,不但提升了用户体验,价格也降下来了。

CDN的价值
1、为架设网站的用户省钱
2、提升企业网站用户的访问体验(相同线路、相同地域、内存访问)
3、可以阻挡大部分流量攻击,例如DDOS

100万PV架构设计思路:首先应该尽量考虑把网站数据放到CDN中的缓存,这样计算网站总流量总访问量减去CDN的访问流量后,剩下的访问量规模需要的架构才是我们需要设计考虑的,一个良好的网站架构设计,访问量尽量都交给CDN


 



为网站程序解耦


解耦是开发人员中流行的一个名词,简单的说就是把一堆程序代码按照业务用途分开,然后提供服务,
例如:注册登录、上传、下载、浏览列表、商品内容页面、订单支付等都应该是独立的程序服务、只不过在客户端看来是一个整体而已。
如果中小公司做不到上述细致的解耦,起码也要让下面的几个程序模块独立

1、网页页面服务

2、图片附件及下载服务

3、上传图片服务上述三者的功能尽量分离


 



解决普通端口非80提供服务的问题

用lb解决web服务非80端口的转换问题(haproxy、nginx、f5)
本解决方案优点
1、给nginx服务降权,让网站更安全
2、按用户设置站点权限,使站点更独立
3、开发不需要用root即可完整的管理服务器及站点
4、可实现对责任的划分:网络问题属于运维责任,网站打不开就是开发责任或共同承担

 



控制nginx并发连接数量


Module ngx_http_limit_conn_module
此模块用于限制每个定义的key值得连接数,特别是单IP的连接数,不是所有的连接数都被计数,一个符合要求的连接时一个由服务器处理的请求,整个请求头已经被读取
1、限制单IP并发连接数(可用于down限制)
http {    
limit_conn_zone $binary_remote_addr zone=addr:10m;    ...    
server {      ...        
location /download/ {            
limit_conn addr 1;        
}
# allow only one connection per an IP address at a time.
Syntax: limit_conn_zone key zone=name:size;
Default: —  
Context: http 
设置共享内存区域,key可以是字符串、nginx自有变量或者两者组合,如$binary_remote_addr、$server_name。name为内存区域的名称,size为内存区域的大小。Syntax: limit_conn zone number;Default: —  Context: http, server, location 为指定key设置最大并发连接数,超过时返回503
#测试并发连接3,访问10次ab -c 3 -n 10 
 #测试并发连接1,访问10次ab -c 1 -n 10 http://ip



限制虚拟主机总连接数


不仅可以限制单IP的并发连接数,还可以限制虚拟主机总连接数,可以同时使用
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {    
...    limit_conn perip 10;    
limit_conn perserver 100;
提示:nginx内部变量表http://nginx.org/en/docs/varindex.html



控制客户端请求nginx的速率


此模块用于限制每个IP访问每个定义key的请求速率
http {    
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;    #定义共享区    ...    
server {        ...        
location /search/
 {            
 limit_req zone=one burst=5;    #使用定义的one内存空间,队列值5,即5个请求排队等待        
 }}
 Syntax: limit_req_zone key zone=name:size rate=rate;
 Default: —  
 Context: http 
 设置共享内存区域,key可以是字符串、nginx自有变量或者两者组合,如$binary_remote_addr、$server_name。name为内存区域的名称,size为内存区域的大小。rate为速率,单位为r/s,每秒一个请求
 Syntax: limit_req zone=name [burst=number] [nodelay];Default: —  Context: http, server, location 
 运用了令牌桶原理,burst=number,一共有num块令牌,发完后,多出来的请求就会返回503
 换句话说,一个银行,只有一个营业员,银行很小,等候室只有5个人的位置。因此营业员一个时刻只能为一个人提供服务,剩下的不超过5个人可以在银行内等待,超出的人直接不提供服务,返回503
 nodelay默认在不超过burst值得情况下会排队等待处理,就会处理完num+1次请求,剩余都视为超时503
 #测试并发连接3,访问10次ab -c 6  -n 10 http://ip
本文转自写个博客骗钱博客51CTO博客,原文链接http://blog.51cto.com/dadonggg/1950939如需转载请自行联系原作者

菜鸟东哥