失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 大型网站架构提速关键技术(页面静态化 memcached Mysql优化)

大型网站架构提速关键技术(页面静态化 memcached Mysql优化)

时间:2022-11-23 12:51:40

相关推荐

大型网站架构提速关键技术(页面静态化 memcached Mysql优化)

大型网站关键技术介绍

1.pv值(pageviews),访问量大

带来问题

a.流量大10000000*2m->解决方案买带宽,优化程序(处理图片)

b.并发量,同时访问网站的人多.,解决方案

对程序的架构重新设计.->服务器集群示意图:

1.数据量大->10亿记录

解决方法是

a.表的设计合理

b.分表技术(垂直分割,水平分割)c.建立索引d.读写分离e.mysql配置优化(调整最大并发量,定时对数据库碎片整理,备份crontab)f.硬件升级)

c.页面静态化

d.缓存技术(memcached)

页面静态化

简单解释一下页面静态化:

看几个概念,然后写代码:

静态网址:比如http://localhost/abc.html即,如果我们访问的页面是静态页面,我们把这个url称为静态网站.

特点:1.利用seo(searchengineoptimization)搜索引擎优化2.访问速度快3.防止sql注入

http://localhost/index.php?u=xx&p=/*11288*/

如果我们写程序loginCheck.php

<?php$id=$_GET[‘id’];$pwd=$_GET[‘pwd’];$sql=”select pwd from users where id=$id”;$res=mysql_query($sql);if($pwd= = =从数据库中取出的密码){//说明该用户存在}else{//说明用户密码错误!}

动态网址:比如http://localhost/news.php?id=112,即,访问的是一个PHP页面,可以传入参数.称为动态网之.

特点:1.不利用SEO2.访问速度慢3.有被注入sql可能

伪静态网址:在实际开发中,我们希望达到这样目的,把下面的网址

http://localhost/news.php?lang=cn&class=sprot&id=2

修改成如下网址

http://localhost/news-cn-sport-id2.html

上面的网址,我们称为伪静态网址:

特点:1.利用SEO2.防止注入3.他任然要访问数据库,速度没有变化

页面静态化技术分类:

从方式看(1.真静态2.伪静态)

从范围看(1.全局静态2.局部静态化[ajax+jquery])

介绍一款测试压力的工具ab.exe该工具程序是apache自带的,大家在工作中可以使用该工具来测试自己的网站并发量大小,和某个页面的访问时间

基本用法,进入到cmd控制台

ab.exe–n访问的总次数–c有多少人访问(并发量)访问的页面url

举例说明:

ab.exe–n10000–c100http://locahost/test.php

当我们把–c调整到1000时,发现apache瘫痪.给大家说下如何调整apache的最大并发量.

MPM(多路处理模块,即apache采用怎样的方式来处理并发.),主要有三种方式

1.perfork预处理进程方式

2.worker工作模式

3.winnt这个一般说是windows采用的.

原理示意图:

u如何设置我们的apache的最大并发数,步骤如下:

(1)在httpd.conf文件中修改

#Server-poolmanagement(MPMspecific)

Includeconf/extra/httpd-mpm.conf

(2)确定当前的apahce是什么MPM模式

进入到apache/bin

httpd.exe–l

说明:看mpm_xxx.c如果xxx是winnt说明是winnt,另外还可能是perfork或者worker

(1)修改httpd-mpm.conf文件.

<IfModulempm_winnt_module>

ThreadsPerChild1000

MaxRequestsPerChild0

</IfModule>

(2)重启apahce,测试

因为在linux下,一般说采用的MPM是perfork模式,我们看看如何配置.

<IfModulempm_prefork_module>

StartServers5

MinSpareServers5

MaxSpareServers10

MaxClients150#并发量

MaxRequestsPerChild0#一个进程对应的线程数,对worker更用.

</IfModule>

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

<IfModulempm_prefork_module>

StartServers5#预先启动

MinSpareServers5

MaxSpareServers10#最大空闲进程

ServerLimit1500#用于修改apache编程参数

MaxClients1000#最大并发数

MaxRequestsPerChild0

</IfModule>

如果你的网站pv值百万

ServerLimit2500#用于修改apache编程参数

MaxClients2000#最大并发数

最后有一个关于html和php的访问效率图:

分享一下页面seo技巧:

如果一个图片希望被百度到

<imgalt=’小狗’src=’’/>

在网站前台,我们建议不要使用frame框架,不利用seo

如果我们给图片或者视频取名字,尽量简短.

页面静态化的技术实现有两种方式

1.使用PHP自己的缓存机制

先说明一下OB缓存的机制.

ob1.php代码:说明的ob的各个用法->项目中

ob2.php代码,说明了浏览器缓存存在.

说明:在php5.2这个版本在php.ini有一个配置output_buffering,默认是关闭,如果是关闭,这刚才的代码就会警告.

☞如何打开ob缓存

①配置php.ini文件output_buffering=4096

②直接在程序中ob_start();

1.使用模板替换技术实现(正则表达式)

使用ob缓存机制,完成一个简单的新闻管理系统-页面静态化(目标是实现全站静态化)

开发步骤:

(1)做的页面:

(1)简单的分析页面

(2)创建数据表

createtablenews(

idintunsignedprimarykeyauto_increment,/*新闻id,做成自增*/

titlevarchar(128)notnulldefault‘’,/*标题*/

contentvarchar(256)notnulldefault‘’,/*新闻内容*/

filenamevarchar(32)notnulldefault‘’/*将来这个新闻对应静态页面*/

)engine=MyISAMcharsetutf8

测试数据:

insertintonews(title,content)values('hello1','北京你好');

insertintonews(title,content)values('hello2','四川你好');

(3)走码

到此,我们已经实现了传统的查询任务,

分析代码后,我们发现问题是,因为新闻内容相对稳定,所以没有必要每次都查询。优化的思路是:当第一人查看某个新闻时,我们就生成一个对应的静态页面,当后面的人在查看,直接返回该静态页面即可.

代码实现:

newsList.php代码

showNews.php代码

再想想,上面的代码缺点是什么?

cms(内容管理系统,新闻,软件发布,文章管理)内容就固定不变,我们不能接受.

解决方案:

1 我设一个超时,30s,我们保证30内不去修改,超过30秒,就更新一把.

走码:

2 上面的解决方案有时间延时,所以如果我们希望静态化没有时间延时,就应该使用模板提换技术来搞定.

思路:图.

代码实现:整理

newslist.php

addnews.html页面

newsAction.php页面

思考题:

①请大家完成更新新闻的这个页面静态处理

②如何把newsList.php也做成一个静态页面.->思想

任务是:把新闻管理系统的首页面也静态化.

通用的CMS系统的示意图:

对我们的新闻管理系统首页静态化

思考:我们能不能再添加新闻后,就直接静态化首页面,如果你的确希望只要首页的内容有变化,就立即更新,最后的代理整理:

把所有的动态页面,放入到manage文件夹:

manage.html

<html><head><meta http-equiv='content-type' content='text/html;charset=utf-8'/></head><h1>管理新闻</h1><hr/><a href='addNews.html'>添加新闻</a>|<a href='newsList.php'>更新首页</a>|<a href='xxx.php'>列出所有信息</a></html>addNews.html<head><title>新闻标题</title><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head><!--我们在添加新闻时,就同时生成一个对应的新闻页面(比如你设计好的一个新闻内容显示模板)--><form action="newsAction.php" method="post"><table><tr><td>新闻标题</td><td><input type="text" name="title"/></td></tr><tr><td>新闻内容</td><td><textarea cols="50" rows="10" name="content"></textarea></td></tr><tr><td><input type="submit" value="添加"/></td><td><input type="reset" value="重新填写"/></td></tr><!--隐藏区--><input type='hidden' name='oper' value='add'/></table></form></html>

newsAction.php

<?php//处理用户的添加/更新/删除...请求//先获取 oper值$oper=$_POST['oper'];if($oper==='add'){//接收用户的新闻的各个信息$title=$_POST['title'];$content=$_POST['content'];//把新闻添加到数据库//这里大家可以使用工具类完成.$con=mysql_connect("localhost","root","root");if(!$con){die("连接失败");}mysql_select_db("newssys",$con);$sql="insert into news values(null,'$title','$content','')";//echo $sql;if(mysql_query($sql,$con)){//生成静态文件.$id=mysql_insert_id();$html_filename='news-id'.$id.'.html';$html_fp=fopen("../".$html_filename,'w');//把模板文件读取.$fp=fopen('news.tpl','r');//循环读取//如果没有读到文件的最后,就一直读取while(!feof($fp)){//一行行读.$row=fgets($fp);//把占位符替换掉->小函数 myreplace//问题?$row=str_replace('%title%',$title,$row);$row=str_replace('%content%',$content,$row);fwrite($html_fp,$row);}//关闭文件fclose($html_fp);fclose($fp);echo "恭喜你,添加成功<a href='manage.html'>管理新闻</a>";//怎样让首页面立即更新.include "newsList.php";}else{die('添加失败');}}else if($oper==='update'){}else if($oper==='delete'){}

newsList.php

<?php//列出新闻列表//这里,我使用最简单的方法来操作,没有使用mvc模式//这里你们可以使用工具类完成. db.class.php$con=mysql_connect("localhost","root","root");if(!$con){die("连接失败");}mysql_select_db("newssys",$con);$sql="select * from news";$res=mysql_query($sql,$con);ob_start();echo "<head><meta http-equiv='content-type' content='text/html;charset=utf-8' /></head>";echo "<h1>新闻列表</h1>";echo "<table>";echo "<tr><td>id</td><td>标题</td><td>查看详情</td><td>修改新闻</td></tr>";//循环的取出新闻列表while($row=mysql_fetch_assoc($res)){echo '<tr><td>'.$row['id'].'</td><td>'.$row['title'].'</td><td><a href="news-id'.$row['id'].'.html">查看详情</a></td><td><a href="#">修改页面</a></td></tr>';}echo "</table>";$str_ob=ob_get_contents();file_put_contents('../index.html',$str_ob);//这里关闭资源.//清空obob_clean();echo "恭喜你,首页面更新成功<a href='../index.html'>点击查看最新新闻列表</a>";mysql_free_result($res);mysql_close($con);

完毕,大家可以进一步深入的完成修改和删除.

真静态的优缺点分析

优点:1.利用SEO2.访问速度快.3.防止sql注入

缺点:1.因为真静态会生成大量的html文件,占用磁盘空间,如果你把所有的静态页,都放在同一文件夹,寻找文件的速度随着文件的增多,速度变慢,因此可以考虑创建子文件夹来放.

在以下情况不建议使用真静态:

1.实时性要求高的网站或者页面.(股票、基金)

2.数据量大,同时查询一次后,以后很少查询(国家学历认证网,电信话费查询系统.)

3.不愿意被seo到的页面或者网站

伪静态技术

在我们实际开发中,有需要,不希望使用真静态.,但是有希望利于SEO,可以考虑使用伪静态.

http://localhost/news.php?type=music&id=100

我们希望这个地址可以用下面的访问url来替换

http://localhost/news-music-id100.html

上面的问题可以使用伪静态

1.实现方式有直接使用正则表达式来完成

2.使用apache自带的rewrite机制来完成

看需求:

http://localhost/content.php/1,122,8912.html

我希望上面的地址

http://localhost/content.php?a=1&b=122&c=8912

实现思路:

1.我们可以使用str函数,来进行分割处理->可行,但是不够灵活

2.使用正则来处理

代码是:

$path_info=$_SERVER['PATH_INFO'];$reg='/(\d+),(\d+),(\d+)\.html$/i';preg_match($reg,$path_info,$res);echo "<pre>";print_r($res);echo "</pre>";

在实际开发中,我们实现伪静态,用的更多的还是rewrite机制,但是他任然是以正则技术为基础的.

我们看看如何实现:

说明:

比如/news.php?type=music&id=100

希望上面的url变成

t/news-music-id100.html

原理图

步骤开始:

(1)启用rewrite模块,在默认情况下,没有启用

修改httpd.conf文件

#启动rewrite模块

LoadModulerewrite_modulemodules/mod_rewrite.so

确认是否启动成功

<?phpphpinfo();?>

(2)配置我们的虚拟主机

httpd.conf打开虚拟主机的配置文件

#Virtualhosts

Includeconf/extra/httpd-vhosts.conf

修改httpd-vhost.conf

<VirtualHost *:80>DocumentRoot "C:/myenv/apache/htdocs/static2"#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限#设置虚拟主机的错误页面,欢迎页面 <Directory "C:/myenv/apache/htdocs/static2"></Directory></VirtualHost>

(1)在hosts文件中,配置ip和主机的对应关系

127.0.0.

(2)这时我们访问http///news.php

我们可以访问到该页面.

☞一个重要的知识点:

在apache服务器中,如果某个文件夹,没有指定访问权限,则以上级目录的权限为准,如果他自己指定了访问权限,则以自己的为准.

请注意,在配置访问权限的时候,顺序很重要:

#Orderallow,deny表示先看allow,在看deny,留下的就是可以访问

Orderdeny,allow

Denyfromall

allowfrom127.0.0.1

(3)关于<Directory>节点配置必须掌握

比较完整的配置文件

第一种配置方式

<VirtualHost*:80>

DocumentRoot"C:/myenv/apache/htdocs/static2"

#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限

#设置虚拟主机的错误页面,欢迎页面

<Directory"C:/myenv/apache/htdocs/static2">

#这里可以指定是否让人访问

#Allowfromall

#是否列出文件目录结构

#如果希望列出indexes不希望none

#Optionsindexes

#如何配置网站的首页面

DirectoryIndexabc.htmlabc2.html

#如何配置404错误页面,引导用户引入新页面

errorDocument404/404.html

#配置我们的rewrite规则

RewriteEngineOn

#rewrite的规则如果aaa.html就跳转到news.php

#$1表示反向引用,第一个子表达式的内容

#说明如果在正则规范中直接引用子表达式的内容,则使用\n

#如果是在后面因为,则使用$n

RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$news.php?type=$1&id=$2

</Directory>

</VirtualHost>

特别说明:容易犯的错误,一定要记住启用rewrite模块.

思考:上面我们配置都要去修改httpd-vhost.文件,但管理员不给你这个权限,怎么办?

思路:可以把配置,写到.htaccess文件.

第二种配置方式:即把一部分配置放在http-vhost.conf文件,把rewrite规则放在.htaccess

<VirtualHost*:80>

DocumentRoot"C:/myenv/apache/htdocs/static2"

#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限

#设置虚拟主机的错误页面,欢迎页面

<Directory"C:/myenv/apache/htdocs/static2">

#这里可以指定是否让人访问

#Allowfromall

#是否列出文件目录结构

#如果希望列出indexes不希望none

#Optionsindexes

#如何配置网站的首页面

DirectoryIndexabc.htmlabc2.html

#如何配置404错误页面,引导用户引入新页面

errorDocument404/404.html

#如果你配置了allowoverrideall这表示到对应的目录的.htaccess去匹配规则

allowoverrideall

</Directory>

</VirtualHost>

在对应的文件下.htaccess文件

<IfModulerewrite_module>

#如果rewrite模块启用

#配置我们的rewrite规则

RewriteEngineOn

#rewrite的规则如果aaa.html就跳转到news.php

#$1表示反向引用,第一个子表达式的内容

#说明如果在正则规范中直接引用子表达式的内容,则使用\n

#如果是在后面因为,则使用$n

RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$news.php?type=$1&id=$2

#RewriteRuleaaa.htmlnews.php

</IfModule>

请注意:项目中的.htaccess文件的配置也是继承管理

第三种配置方法:

http-vhost.conf

<VirtualHost*:80>

DocumentRoot"C:/myenv/apache/htdocs/static2"

#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限

#设置虚拟主机的错误页面,欢迎页面

<Directory"C:/myenv/apache/htdocs/static2">

#如果你配置了allowoverrideall这表示到对应的目录的.htaccess去匹配规则

allowoverrideall

</Directory>

</VirtualHost>

.htacces文件

#这里可以指定是否让人访问

#Allowfromall

#是否列出文件目录结构

#如果希望列出indexes不希望none

#Optionsindexes

#如何配置网站的首页面

DirectoryIndexabc.htmlabc2.html

#如何配置404错误页面,引导用户引入新页面

errorDocument404/404.html

<IfModulerewrite_module>

#如果rewrite模块启用

#配置我们的rewrite规则

RewriteEngineOn

#rewrite的规则如果aaa.html就跳转到news.php

#$1表示反向引用,第一个子表达式的内容

#说明如果在正则规范中直接引用子表达式的内容,则使用\n

#如果是在后面因为,则使用$n

RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$news.php?type=$1&id=$2

#RewriteRuleaaa.htmlnews.php

</IfModule>

伪静态的实际运用

1.在一个项目中有两个文件夹,public和private,public文件夹的图片可以被所有人访问.

private只能自己访问.请问如何实现.

第一个方法是.在public和private下创建.htaccess文件,对于private只让127.0.0.1访问public文件都可以访问

private文件夹下的配置.htaccess

Orderdeny,allow

denyfromall

allowfrom127.0.0.1

这个的缺点是,没有办法去控制,本apahce的另外一个虚拟主机请求.,另外不能精细化控制,于是我们就换了一个思路使用http的referer头信息搞定这个防盗链需求.

第二方法.在private文件夹下.htaccess

<ifModulerewrite_module>

RewriteEngineOn

#你怎么知道,这个请求就是发来的.referer

#如果你请求的是一个jpg图片,就禁止

RewriteCond%{HTTP_REFERER}!

RewriteRule.*\.jpg-[F]

</ifModule>

☞说一下如果你的RewriteCond有多个条件

<ifModulerewrite_module>

RewriteEngineOn

#你怎么知道,这个请求就是发来的.referer

#如果你请求的是一个jpg图片,就禁止

RewriteCond%{HTTP_REFERER}!

#RewriteCond%{REQUEST_FILENAME}!-f

RewriteRule.*\.jpg-[F]

</ifModule>

1.关于404的说明就是对于ie浏览器而言,404页面的内容大小不能低于512b字节

2.如果你在<Directory>节点配置了OptionsIndexes,同时你有启用了rewriteEngineOn你会看到403的禁用提示.,原因是因为我们的父级目录的Options本身就配好,

OptionsIndexesFollowSymLinks,所以,我们要么就不配,要么就一样.

伪静态实际运用案例2

在的主目录下,我们编写了.htaccess文件,并增加规则

#增加规则

[img=http://img./upload/03/07/1394181458_228087.png][/img][img=http://img./upload/03/07/1394181464_304731.png][/img]

伪静态的实际运用3->引出rewriteCond的使用

思考:可能有条件指令.

网上找到方案:

最后的配置在.htaccess

#如果请求的不是一个文件

RewriteCond%{REQUEST_FILENAME}!-f

#并且不是一个目录

RewriteCond%{REQUEST_FILENAME}!-d

RewriteRuleccc.htmlindex.php

伪静态的实际运用案例4:

在TP框架中使用rewrite简化url地址,目的是SEO,步骤

1.在httpd.conf文件中启用rewrite模块

2.在虚拟主机中配置allowoverrideall

3.在tp的配置文件中conf/config文件把URL_MODEL配置2

4.在tp框架的入口目录增加.htaccess文件写入规则

u伪静态的特点

u如何选用伪静态还是真静态,还是不静态?

如果觉得《大型网站架构提速关键技术(页面静态化 memcached Mysql优化)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。