天天看点

构建高性能WEB站点(二)

第五章   动态脚本加速

   5.1 opcode缓存(缓存脚本语言可以直接运行的中间代码=)操作码)避免中间代码生成开销 PHP中的opcode缓冲区扩展 APC eAccelertor XCache

   1)APC  php.ini中打开opcode cahe开关 apc.cache_by_default = on 同样可以修改apcfilters 让APC只对特定范围的动态程序进行opcode缓存 可以使用Cacti等监控系统来定时获取opcode的缓存状态(默认情况下,缓存opcode的程序在每次请求是都会检查程序是否有变化,有的话会重新编译 =)检查可以关闭,但是关闭后程序发生变化 只能重新web服务器使其生效)

   2)减少cpu和内存占用

   5.2解释器扩展模块 需要充分考虑扩展模块可能对性能代理的副作用

   5.3脚本分析和跟踪 XDebug

第六章 浏览器缓存

   6.1利用浏览器(HTTP协议缓存部分)

   6.2缓存协商 浏览器只缓存Get类型请求,对浏览器动态内容与静态内容缓存无任何区别

1)Last-Modified  =》为HTTP响应头消息增加最后修改时间标示=》浏览器询问If-Modified-Since =》服务器响应 Not modified

      2)使用ETag进行缓存协商 HTTP响应头增加ETag-》浏览器询问If-None_match=>服务区回答304状态码/最新的内容

基于时间缓存的缺点:缺点:内容没有变化,但是修改时间变化的文件也会被全部重新获取,导致每次连接如果连接到不同的服务器(分布式服务器很难保证文件修改时间完全相同),都全部重新获取,使用ETag可以避免此问题

3)让动态内容与浏览器交流 动态判断是否返回新的内容

4)SSI和Last-Modified  Apache必须手动开启SSI的Last-Modified支持,会导致SSI文档吞吐率降低1/3;Lighttpd会自动将子页面时间设置为整个页面的Last-Modified时间

  6.3彻底消灭请求

     HTTP标记 Expires 直接告诉浏览器该内容在何时过期,在该内容过期前不需要询问服务器,直接使用本地缓存即可

     三中HTTP请求 a:Ctrl+f5 强制刷新,不考虑浏览器缓存机制 b:F5 允许浏览器进行缓存协商,但是不允许浏览器使用本地缓存 c:超链接或者转到跳到此页:允许浏览器以最少的请求获得网页数据

     适应本地过期时间(用户本地时间与服务器时间不一致导致过期检查时间失效)使用Cache-Control 用max-age指定缓存过期时间(单位:秒)

第七章   Web服务器缓存

  7.1 URL映射 使用URL Rewrite(地址重写技术) 改写映射的文件、目录、甚至映射到网络

  7.2缓存响应内容 很多时候,一个URL在一段较长的时间内对应一个唯一的响应内容,可以将最终内容缓存后直接返回(Web服务器一般都支持 Apache mod_cache)

     Apache 推荐使用mod_disk_cache(mod_mem_cache停止使用)=》需要修改编译选项和增加配置

     编译时 configure 追加 --enable-cache=share –enable-disk-cached-shared –enable-so

     增加配置 LoadModule cache_module modules/mod_cache.so

              LoadMoudule disk_cache_module modules/mod_disk_cache.so

             CacheRoot /date/apache_cache

             CacheEnable disk /

             CacheDirLevels 5

             CacheDirLenght 3

             CacheRoot 为缓存内容存储目录 CacheEnable指定缓存引擎(磁盘),如果只缓存某个目录,可以使用CacheEnable disk /images;CacheDirLevels, CacheDirLenght 为缓存的目录分级结构。

     Lighttpd mode_trigger_b4_dl模块

     缓存静态内容:对于SSL的shtml页面,缓存性能提高很大,html有一定程度的提升

     缓存动态内容:速度明显快于开启了APC内存缓存和APC opcode cache缓存(引入新问题 缓存过期)。

有效期控制:使用Expires标记(过期时间),Last-Modified标记(过期时间与最后修改时间对比),mod_cache配置CacheIgnoreNoLastMod(开启不缓存,关闭 使用当前时间作为Last-Modified 并且使用默认最大缓存时间)mode_cache 配置CacheignoreHeaders Set-Cookie(设置跳过缓冲区的动态内容)

     动态程序自身一般不需要实现缓存机制(Web服务器缓存,浏览器缓存、反向代理缓存等可以替代)

 7.3 缓存文件描述符 对于大量小文件,web服务器可能花费大量时间在打开文件上,可以缓存文件描述符来减少响应时间(大文件时间主要花费在传输上 没有缓存必要)

     Apache mod_file_cahce 扩展

     CacheFile /data/www/htdocs/test.html Apache在启动时打开文件,持续到关闭位置

第八章    反响代理缓存

  8.1反向代理:与代理服务器工作原理类似,web服务器在反向代理服务器后

  8.2在反向代理服务器上创建缓存

     1)nginx反向代理服务器: 打开mod_proxy模块 设置proxy_pass指令 使用方式:将web服务器和动态内容服务器分类,web服务器处理静态内容,并作为反向代理,将动态内容的请求转发到后端的应用服务器

     Nginx中的配置 locatioc ~ \.php${proxy_pass localhost:80;}

     2) 引入缓存 推荐使用:Varnish (Nginx缓存机制不完善,且反向代理仅为一个扩展模块),Squid 过于庞大 Varnish的使用参考手册 =》吞吐率有很大提高,且与后端服务器处理能力关系不大

     3)修改缓存规则 VCL配置语言

     4)缓存清除 varnishadm –T 清除某个url的缓存  也可以使用HTTP方式清除PURGE\

     5) 监控缓存命中率 varnishstat命令行工具 Varnsih Web监控页面,Cacti监控平台

     6)缓存命中率和后端吞吐率的理想计算模型

        缓存命中率 = 1-(活跃内容数/(实际吞吐率*平均缓存有效期))*100%

        后端吞吐率 = 活跃内容数/平均缓存有效期

4)  针对网页的各部分内容更新频率各不相同ESI 一种标准,类似于SSI(Web服务器端组装内容),在HTTP服务器上组装内容,包括反向代理

也可以使用 AJAX 将需要频繁更新的局部内容采用异步请求的方式(需要注意AJAX的跨域问题,局部内容与父页面保持相同的顶级域名)

5)  和动态缓存一起工作

多级缓存 发现问题之前降低影响范围

   暴露后端 反向代理主要用于跨地域加速时 反向代理服务器和后端服务器可以基于DNS策略的负责均衡分别服务不同地域的用户

   首次加载 最先访问的用户无法命中代理服务器缓存

   多台反向代理服务器 多台方向代理服务器指向同一台后端服务器,造成多次首次加载

  8.4 小心穿越代理 代理服务器只转发HTTP请求到后端服务器,后端服务器无网络数据(IP地址 端口号等) 后端服务器可以用这些数据进行性能优化时使用

  8.5 流量分配

第九章   Web组件分离

  9.1 Web组件的差异:文件大小,文件数量,内容更新频率,预计并发用户数,是否需要脚本解释器,是否涉及大量CPU计算,是否访问数据库,访问数据库主要操作时读还是写,是否包含远程调用(RPC)

     优化方案:使用epoll模型,使用sendfile()系统调用,使用异步I/O 支持HTTP持久连接,使用opcode缓存 使用动态内容缓存(缓存有效期),使用web服务器缓存(有效期),使用浏览器缓存(有效期),使用反向代理缓存(有效期),使用负载均衡策略

 9.2 使用不同域名,使用二级域名作为组件服务器地址

     带来问题:将站点的cookies作用域设置为顶级域名是,每次浏览器访问会在HTTP请求头信息中添加本地cookies

     解决办法:缩小 cokkies作用域

               使用新的顶级域名

9.3 浏览器并发数文本组件分离是浏览器可以多线程下载web组件

9.4 各种web组件的处理策略

    动态内容:1)开启opcode缓存 2)更快的cpu 3)足够大的内存4)多进程5)与数据库保持高速连接6)可靠的数据中心

    静态网页:1)支持epoll 2)非阻塞I/O 3)异步I/O 4)使用sendfile系统调用 5)单进程 6)使用高速磁盘 7)使用RAID分区 8)购买足够的带宽

    图片:HTTP持久连接 设置Expires过期时间

    样式表:CSS样式表更新并不频繁 Google的日历服务器CSS样式表有效期设置为1年

    脚本:尽量缓存在浏览器本地(漫长的过期时间)

    视频:用户请求通常指向不同文件,磁盘位置读操作过于随机(磁盘负载能力), 默认开启sendfile

    下载服务器:无下载速度限制 自行规划

第十章   分布式缓存

页面缓存(整体缓存)的缺点

1.               一个网页中不同区域的内容,自身更新频率和呈现及时度要求各不相同,如果为迁就频繁更新的区域,使整个页面频繁重建缓存,影响整体吞吐率

2.               使用局部动态缓存,如果局部区域过多,会使页面结果过于复杂,整合各个局部页面开销巨大

3.               部分计算无法作为页面缓存(用户登录状态相关、用户相关)

4.               所有的页面缓存只能改善写的速度 不能改善读的速度

   10.1 数据库的前端缓冲区

   10.2 使用memcached

       1)memcached 使用key_value方式存储数据 数据查询时间复杂度为O(1)

       2)数据项过期时间(LRU算法)

       3)网络并发模型 memcached可以运行在独立的服务器上,通过libevent实现网络并发模型

       4)对象序列化

  10.3 读操作缓存

       1)重复的身份验证

  10.4写缓存操作

  10.5监控状态 空间使用率、缓存命中率、I/O流量

  10.6 缓存扩展 调整缓存分区

继续阅读