标签 高并发 下的文章

高并发的解决方案

1:相关概念

  • 高并发:某个时间点,有多少个访问同时到来
  • 日PV在千万以上,有可能是一个高并发的系统
  • QPS:每秒钟请求或者查询的数量
  • 吞吐量:单位时间内处理的请求数量
  • 响应时间:请求发出到响应花费的时间
  • PV:综合浏览量(Page View),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量
  • UV:独立访客,一定时间内
  • 带宽:峰值流量和页面的平均大小

2:前端:web资源防盗链

工作原理:通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址;一旦检测到来源不是本站即进行阻止或者返回指定的页面

  • Referer:ngignx模块 ngx_http_referer_module用于阻挡非法的域名请求;Nginx指令valid_referers,全局变量$invalid_referer

valid_referers : none表示来源头部为空的情况;blocked表示来源头部不为空,但是里面的值被代理或者防火墙删除了;server_names表示来源头部包含当前的server_names

location ~* \.(gif|jpg|png|swf|flv)$ { 
  valid_referers none blocked www.jzxue.com jzxue.com ; 
  if ($invalid_referer) { 
    rewrite ^/ http://www.jzxue.com/retrun.html; 
    #return 403; 
  } 
}
第一行:gif|jpg|png|swf|flv 
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链 
第二行: 表示对www.ingnix.com这2个来路进行判断 
if{}里面内容的意思是,如果来路不是指定来思是,如果来路不是指定来路就跳转到http://www.jzxue.com/retrun.html页面,当然直接返回403也是可以的。

针对图片目录防止盗链
location /images/ { 
  alias /data/images/; 
  valid_referers none blocked www.jzxue.com jzxue.com ; 
  if ($invalid_referer) {return 403;} 
} 
  • 加密签名解决伪造Refere

使用第三方模块ngx_http_accesskey_module实现Nginx防盗链

location ~* \.(gif|jpg|png|swf|flv)$ { 
  accesskey on;
  accesskey_hashmethod md5;
  accesskey_arg "key";
  accesskey_signature "mypass$remote_addr";
}

访问测试脚本download.php:
<?
$ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
$output_add_key="<a href=http://www.jzxue.com/download/G3200507120520LM.rar?key=".$ipkey.">download_add_key</a><br />";
$output_org_url="<a href=http://www.jzxue.com/download/G3200507120520LM.rar>download_org_path</a><br />";
echo $output_add_key;
echo $output_org_url;
?>

参考:

3:前端:减少HTTP请求

2/8原则,80%以上的响应时间花在了css,js,图片上;
HTTP连接产生开销:域名解析->TCP连接->发送请求->等待->下载资源->解析时间
查找DNS缓存也需要时间,多个缓存就要查找多次,并且有可能缓存会被清除;http请求是串行发送

  • 图片地图:一个图片关联多个URL,目标URL的选择取决于用户点击图片的哪个位置,将多张图片合并为一张图片
HTML <map> 标签:
<img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" />

<map name="planetmap" id="planetmap">
  <area shape="circle" coords="180,139,14" href ="venus.html" alt="Venus" />
  <area shape="circle" coords="129,161,10" href ="mercur.html" alt="Mercury" />
  <area shape="rect" coords="0,0,110,260" href ="sun.html" alt="Sun" />
</map>
  • css精灵:通过使用合并图片,指定css的backgroud-image和backgroud-posion来显示元素
  • 合并脚本和样式表
  • 图片使用base64编码减少页面请求数:将图片直接嵌入到网页中,而不是从外部载入

4:前端:浏览器缓存和压缩优化技术

200 from cache:直接从本地缓存中获取响应,最快,最省流量;304 Not Modified:协商缓存,只返回一些基本的响应头信息,不发送实际响应体;200 OK:以上两种缓存全部失败,相对最慢;
请求头优先级:Pragma > Cache-Control > Expires

5:CDN加速

CDN: 内容分发网络,智能的虚拟网络,节点服务器
优势:本地Cache加速,提高企业站点的访问速度,跨运营商都得到良好的访问质量
工作原理:传统访问:请求->解析域名获取服务器IP地址->根据IP找到对应的服务器->服务器响应并返回数据

  • 实现:BAT提供的CDN服务
  • LVS做4层负载均衡
  • web服务器提供的负载均衡,nginx反向代理

6:独立图片服务器的部署

独立域名,必要性;

7:服务端 动态语言静态化

将现有PHP等动态语言的逻辑代码生成静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程,对实时性不高的数据
原因:动态脚本通常会做逻辑计算和数据查询,访问量越大,服务器压力越大;访问量大的时可能会造成CPU负载过高,数据库服务压力过大;

  • 模板引擎
  • ob函数