大型网站优化-

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大型网站优化-相关的知识,希望对你有一定的参考价值。

目录

一、判断大型网站的标准:????1

1pv(page views)网页的浏览量:????1

2uv值(unique vistor)独立访客????1

3、独立ip????1

二、大型网站带来的一些问题。????1

1、大的并发。????1

2、大流量。????2

3、大的存储,????2

三、大并发的解决方案:????2

1、负载均衡器:????2

2、负载均衡实现的方式:????3

3、集群:????3

四、大流量解决方案:????3

1、防止我们的网站资源被盗链。????3

2、减少http请求,????3

3、启用压缩,????6

4、通过浏览器缓存数据内容。????7

5、可以把比较占用流量的一些资源,单独组建一个服务器,????7

6、花钱买带宽。????8

五、大存储解决方案:????8

1、缓存技术:????8

2、在设计表的时候,要满足3范式????9

3、要给表添加适当的索引:索引非常重要的,可以提高查询速度。????9

4、要创建适当的存储过程,函数,触发器等。????10

5、读写分离(主从服务器)????10

6、分表技术(垂直分割和水平分割)????10

7、分区技术????10

8、升级mysql服务器(添加配置:加大内容,64位)????11

9、要对sql语句进行调优????11

10、对配置文件进行优化配置。????11

六、网页静态化的内容:????11

1、网页静态化的使用原理:????12

2、了解几个概念:????12

3、实现静态化的方式:????13

4、通过ob缓存来实现真静态????13

5、利用ob缓存完成一个真静态案例????16

6、案例扩展,要给生成对应的静态页面一个有效期。????17

七、apache并发工具测试。????19

1ab.exe测试????19

2、要调整apache的并发配置,要清楚处理多并发的方式。????20

3、如何知道,当前apache服务器是使用哪一种方式处理并发????22

4、如何配置MPM(多路处理模块)的问题,调整最大的并发量。????22

?

?

一、判断大型网站的标准:

1、pv(page views)网页的浏览量:

概念:一个网站所有的页面,在24小时内被访问的总的次数。千万级别,百万级别,

2、uv值(unique vistor)独立访客

概念:一个网站,在24小时内,有多少个用户来访问我们的网站。达到10万

3、独立ip,

概念:一个网站,在24小时内,有多少个ip来访问我们的网站。

uv值约等于独立ip.如果要考虑局域网,uv值略大于独立ip

技术分享

?

?

二、大型网站带来的一些问题。

1、大的并发。

并发量:在同一时间点(1秒内),有多少个用户同时访问我们的网站。对同一个网址,同时刷新浏览器。达到500,就非常大了。

假如并发量是500,pv值是多少。500*3600*10

?

2、大流量。

网站需要的大的带宽。10G.

3、大的存储,

网站中的数据库,表的容量成海量趋势,GT级别,如何快速的查找出想要的数据。

?

三、大并发的解决方案:

要对网站的服务器重新架构,采用分层,负载均衡的架构。

?

1、负载均衡器:

硬件:f5-bigip 性能比较好,立竿见影,价格昂贵,一般适合于大型网站公司,网游公司。

技术分享

?

?

软件:

lvs(linux virtual server)linux虚拟服务,加入到linux的内核中。

nginx:可以做web服务器(apache),还可以做负载均衡。

2、负载均衡实现的方式:

主要有:

轮询技术:客户端请求服务器轮流转发。

ip哈希:同一ip地址的客户端,始终请求同一台服务器。

最少连接:把请求转发给最空闲的服务器。

?

3、集群:

主要是解决计算机单点故障,在一个集群中的计算机,只有一台计算机工作,其他计算机处于休眠状态,监视正在工作的计算机,当正在工作的计算机出现问题,则休眠的计算机立刻接替工作。

四、大流量解决方案:

1、防止我们的网站资源被盗链。

可以采用一些非技术手段防止被盗链,在图片上添加水印

?

技术分享

?

2、减少http请求,

主要手段就是合并js文件,css文件,背景图片的文件。将浏览器需要的样式文件或者js文件,合并成一个样式文件或js文件。比如通过背景图片举个例子。

?

技术分享

具体的代码:

技术分享

技术分享

?

3、启用压缩,

减少数据传输的数据量,常见的压缩格式是:gzip,deflate.

?

技术分享技术分享技术分享

?

原理:

技术分享

4、通过浏览器缓存数据内容。

在网站中有一些资源,比如js文件,css文件,一些图片文件,更新的频率比较少。通过个设置http的cache-control expires属性来进行设置缓存,可以设置缓存的文件类型,设置缓存的缓存周期,

?

5、可以把比较占用流量的一些资源,单独组建一个服务器,

比如图片服务器,视频服务器等。

技术分享

?

要注意:资源服务器的配置:

存储资源的服务器:主要要求是硬盘的容量,读写速度。

可以组建磁盘阵列。

raid0

raid1

磁盘阵列的存储技术:

分布存储:至少是两块硬盘

复制存储:至少是两块硬盘

?

技术分享

6、花钱买带宽。

技术分享

?

五、大存储解决方案:

?

1、缓存技术:

通过缓存技术,达到不查询数据库或者少查询数据库的目的。

计算机的访问速度,内存》硬盘文件》数据库

缓存技术主要有:

磁盘缓存(页面静态化),把一个查询数据库的页面变成一个不查询数据库的页面

内存缓存:把经常查询的数据保存到内存里面,下次查询数据时候直接在 内存里面查询。

(memcache/redis/mysql的memory引擎)

2、在设计表的时候,要满足3范式

第一范式是:原子性,字段不能再分割了。只要是关系型数据库就自动满足第一范式:

数据库的分类:

关系型数据库:有行和 列的概念,二维表格。常见的关系型数据库:mysql,sql server,oracle,db2,

非关系型数据库(nosql)面向集合和 文档的,没有行和列的概念常见的有redis/mongodb等。

第二范式:在一个表中不能有完全相同的记录。可以通过设置一个主键。

第三范式:表中的字段不能冗余存储。

技术分享

3、要给表添加适当的索引:索引非常重要的,可以提高查询速度。

常见索引有:主键索引,唯一索引,普通索引,全文索引,

4、要创建适当的存储过程,函数,触发器等。

5、读写分离(主从服务器)

6、分表技术(垂直分割和水平分割)

垂直分割:

?

技术分享

?

水平分割:

技术分享

7、分区技术

把一个表的数据内容,在不同的 区域存储,

8、升级mysql服务器(添加配置:加大内容,64位)

9、要对sql语句进行调优

select * from tablename 该语句不要使用,要按需查询。需要哪个字段的数据,就查询哪个字段的数据。

10、对配置文件进行优化配置。

比如配置mysql数据库的并发量:

技术分享

?

?

六、网页静态化的内容:

主要有两种:

真静态:就是把一个动态(查询数据库)的页面,转换成一个静态的页面html页面,

伪静态:从形式上看url地址是一个静态的页面,实际上还是要查询数据库的。

比如:http://www.abc.com/news-soprt-id100.html,实际上对应

http://www.abc.com/news.php?type=sport&id=100页面。

1、网页静态化的使用原理:

技术分享

2、了解几个概念:

动态的网址:一般来说,该页面有查询数据库的功能,比如后缀是:(php|asp|aspx|jsp)

特点:查询数据库,访问速度慢,可能sql注入,不是很安全,不是利于seo

静态的网址:一般来说就是html页面。

特点:不查询数据库,访问速度快,安全,利于seo

伪静态网址:从形式上看是一个静态网址,实际上是一个动态页面,

特点:查询数据库,安全,利于seo

比如:http://localhost/1028/demo.php/goods_id100.html

?

技术分享

3、实现静态化的方式:

真静态实现方式:

(1)通过ob缓存技术来实现。

(2)通过模板替换技术来实现

伪静态实现方式:

(1)通过正则表达式,匹配替换

(2)通过服务器的rewrite机制。

4、通过ob缓存来实现真静态

(1)概念:什么是ob缓存:

ob缓存:output_buffering:输出缓存,我们请求一个php页面,实际上是通过三个缓存的。

ob缓存(如果开启)---》程序缓存------》浏览器缓存,要注意:程序缓存和浏览器缓存必须存在的。

技术分享

(2)如何开启ob缓存:

第一种方式:通过ob_start()函数,只对当前页面有效

第二种方式:通过php.ini文件中:

技术分享

(3)学习几个函数来讲解

ob_clean();清除ob缓存里面的数据,并不关闭ob缓存。

技术分享

ob_end_clean():清除ob缓存里面的数据,并关闭ob缓存

技术分享

ob_flush();把ob缓存里面的数据刷新到程序缓存,并不关闭ob缓存。

技术分享

ob_end_flush():把ob缓存里面 的数据移动到程序缓存,并关闭ob缓存

技术分享

ob_get_contents();获取ob缓存里面数据

?

技术分享

5、利用ob缓存完成一个真静态案例

思路:判断该页面对应的静态页面,是否存在,若存在的直接访问静态页面,不存在则通过数据库查询出数据,并生成一个静态页面。

具体的代码:

<?php

header("content-type:text/html;charset=utf-8");

$filename="index.html";

//思路:判断该页面对应的静态页面,是否存在,

if(file_exists($filename)){

include $filename;exit;

}

//连接数据库的操作:

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use itdede");

mysql_query("set names utf8");

$sql="select title from dede_archives limit 10";

$res = mysql_query($sql,$conn);

$list=array();

while($row=mysql_fetch_assoc($res)){

$list[]=$row;

}

ob_start();

//echo ‘ok‘;

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

</script>

<style type="text/css">

</style>

</head>

<body>

<table width="500" border="1" >

<tr><td>电影名称</td><td>操作</td></tr>

<?php foreach($list as $v){?>

<tr><td><?php echo $v[‘title‘]?></td><td>电影 详情</td></tr>

<?php }?>

</table>

</body>

</html>

<?PHP

$contents = ob_get_contents();

file_put_contents($filename,$contents);

?>

?

6、案例扩展,要给生成对应的静态页面一个有效期。

判断条件:对应的静态页面要存在,而且在有效期内,就可以直接读取静态页面。

如何计算在有效期内:

?

对应静态页面的修改的时间戳+有效期>当前的时间戳

filemtime($filename)+300>time();

假如一个网站并发是1000,不缓存的话。60秒之内查询数据库多少次。60000次

?

假如一个网站并发是1000,缓存60秒的话,60秒之内查询数据库多少次。1次

?

具体的代码:

<?php

header("content-type:text/html;charset=utf-8");

$filename="index.html";

//思路:判断该页面对应的静态页面,是否存在,

if(file_exists($filename) && filemtime($filename)+10>time()){

include $filename;exit;

}

//连接数据库的操作:

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use itdede");

mysql_query("set names utf8");

$sql="select title from dede_archives limit 10";

$res = mysql_query($sql,$conn);

$list=array();

while($row=mysql_fetch_assoc($res)){

$list[]=$row;

}

ob_start();

echo time();

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

</script>

<style type="text/css">

</style>

</head>

<body>

<table width="500" border="1" >

<tr><td>电影名称</td><td>操作</td></tr>

<?php foreach($list as $v){?>

<tr><td><?php echo $v[‘title‘]?></td><td>电影 详情</td></tr>

<?php }?>

</table>

</body>

</html>

<?PHP

$contents = ob_get_contents();

file_put_contents($filename,$contents);

?>

?

该案例重点是:理清如下思路即可。

//思路:判断该页面对应的静态页面,是否存在,

if(file_exists($filename) && filemtime($filename)+10>time()){

include $filename;exit;

}

?

七、apache并发工具测试。

1、ab.exe测试

我们做好一个网站后,要测一下当前网站架构,能够支持并发情况。

测试工具:

可以使用apache自带的一个工具。

技术分享

并发测试的工具有很多,

常用的压力测试软件:

ab : 优点:可以模拟各种请求 缺点:最大只能支撑1000的并发

webbench: 优点:30000万的 并发 缺点:只能模拟GET请求

loadrunner : 非常专业的压力测试软件

winrunner:专业的压力测试软件。

?

ab.exe -n访问的总的次数 -c用户并发数量(有多少人同时访问)网站的地址。

技术分享

?

测试结果:

技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享

?

请求的时间越短越好。

把同时请求的人数调整到600则出现了问题。实际上,在默认情况下,apahce最高支持150并发。

技术分享

2、要调整apache的并发配置,要清楚处理多并发的方式。

首先搞清楚当前apache是什么MPM(多路处理模块), 通俗讲就是apache处理多并发的方式,

常见的有三种

(1)perfork(预派生模式)

技术分享

(2)worker(工作者模式)

技术分享

(3)winnt模式(windows下默认的模式)

技术分享

3、如何知道,当前apache服务器是使用哪一种方式处理并发

技术分享技术分享技术分享

?

4、如何配置MPM(多路处理模块)的问题,调整最大的并发量。

(1)打开apache的配置文件 httpd.conf,开启多路处理模型

技术分享

(2)打开extra目录下面的httpd-mpm.conf辅助配置文件。

技术分享

?

?

技术分享技术分享技术分享技术分享技术分享

?

?

(3)根据当前apache的mpm的方式进行调整如下:

技术分享

测试如下:

技术分享

?

还要注意:虽然调整成了1000但是测试无法完成,原因是,还要和当前服务器的环境配置有关系,并不是说调整成1000,就能支持到1000.

技术分享

?

5、一般在linux系统下面,apache的mpm方式是预派生模式。有一个推荐的配置。

?

在linux下一般是perfor模式

给大家一个合理的建议配置. 对大部分网站,中型网站,配置:

<IfModule mpm_prefork_module>
????????????? StartServers???????? 5 #预先启动
????????????? MinSpareServers????? 5
????????????? MaxSpareServers????? 10 #最大空闲进程
????????????? ServerLimit????????? 1500 #用于修改apache编程参数
????????????? MaxClients?????????? 1000 #最大并发数
????????????? MaxRequestsPerChild? 0 #一个进程对应的线程数,对worker 更有效果。如果是0则不让进程死掉。

</IfModule>

如果你的网站pv值 百万

ServerLimit????????? 2500 #用于修改apache编程参数
MaxClients?????????? 2000 #最大并发数

?

?

?

总结:

1大型网站的标准(pv,uv,独立ip)

2、带来的问题:大并发,大流量,大的存储

3、大并发解决。网站服务器架构调整(负载均衡,集群,数据库的读写分离)

4、大流量的解决:防止被盗链,启用压缩,启用缓存,减少http请求,增加带宽。

5、大存储的解决:缓存,表要符合三范式,添加索引,存储过程,对sql语句调优,分表和分区,服务器的配置加强。

6、静态化,真静态,伪静态,

真静态实现方式:ob缓存,模板替换技术

伪静态:正则替换,rewrite机制。

7、ab.exe 工具使用。

ab.exe –n 访问的总的次数 -c并发量 页面地址。

mpm(多路 处理模块)并发的处理方式

常见的有:预派生,工作者,winnt,

如何查看自己的mpm是哪种模式:httpd.exe –l

以上是关于大型网站优化-的主要内容,如果未能解决你的问题,请参考以下文章

《大型网站技术架构——核心原理与案例分析》读书笔记

大型php网站性能和并发访问优化方案

学习笔记5:《大型网站技术架构 核心原理与案例分析》之 瞬时响应:网站的高性能架构

大型网站MySQL深度优化揭秘2

1.1:大型网站的主要参数

《大型网站技术架构》--第三章:大型网站核心架构要素