实战ASP.NET大规模网站架构:Web加速器

  大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题。文章将针对基于ASP.NET开发的网站交互性非实时部分进行讨论。

  一、WEB加速通常有如下方案:

  1、基于ASP.NET技术的页面缓存

  基于ASP.NET技术的页面缓存,通常有如下两种应用方式:

  一、基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提供的解决方案目前仅支持SQL Server,如果是ORACLE需要自己实现触发接口)。

  二、基于文件依赖的策略(可以设置缓存依赖于文件中的具体键值,当数据更新时,更新文件键值迫使缓存失效)。

  优点:实现比较简单  

  缺点:粒度太粗,对IIS、.NET Framework依赖太强,策略还不太完善,跨机器、集群访问方面存在瓶颈。

  2、页面静态化

  页面静态化有可分为全部静态化、局部静态化、伪静态化等。

  优点:页面静态化后,减轻了数据访问的负担,同时由于静态页面不需要复杂处理过程(如ASP.NET页面生命周期),从而提高网站的性能。

  缺点:页面静态化增加了维护管理的复杂度,可能同一页面在多个页面之间被引用,需要进行触发级连更新。当大量并发时,更新静态页面会发生LOCK,导致页面访问超时。

  3、基于squid for windows下的反向代理

  为了佐证本方案是经过实践考验的,并且是通用的行业方案,以下是一些大规模网站实际应用:

  --网易

  Server nginx
  Date Wed, 10 Mar 2010 02:25:39 GMT
  Content-Type text/html; charset=GBK
  Last-Modified Wed, 10 Mar 2010 02:24:45 GMT
  Vary Accept-Encoding
  Expires Wed, 10 Mar 2010 02:27:39 GMT
  Cache-Control max-age=120
  Content-Encoding gzip
  Age 49
  X-Cache HIT from cache.163.com
  Via 192.168.51.39.nginx, 1.0 cache.163.com (squid/3.0.STABLE23)
  Connection close

  --腾讯

  Server nginx/0.6.39
  Date Wed, 10 Mar 2010 02:26:48 GMT
  Content-Type text/html; charset=GB2312
  Vary Accept-Encoding, Accept-Encoding
  Expires Wed, 10 Mar 2010 02:41:48 GMT
  Cache-Control max-age=900
  Content-Encoding gzip
  Age 313
  X-Cache HIT from rainny.qq.com
  Via 1.0 rainny.qq.com:80 (squid/2.6.STABLE5)
  Connection close

  ----搜狐

  Date Wed, 10 Mar 2010 02:41:40 GMT
  Server Apache/1.3.39 (Unix) mod_gzip/1.3.26.1a
  Vary Accept-Encoding,X-Up-Calling-Line-id,X-Source-ID,X-Up-Bearer-Type
  Cache-Control max-age=70
  Expires Wed, 10 Mar 2010 02:42:50 GMT
  Last-Modified Wed, 10 Mar 2010 02:41:39 GMT
  Content-Type text/html
  Age 9
  X-Cache HIT from 17376722.22226606.29245568.sohu.com
  Via 1.0 17376722.22226606.29245568.sohu.com:80 (squid)
  Connection close

  4、其它

  二、SQUID简介

  SQUID简单说来是基于UNIX下开发的为WEB应用加速的一个开源软件。SQUID已经普遍在基于nix系统下的WEB应用中使用,例如:新浪、网易都使用该软件,其中SQUID FORWINDOWS是在WINDOWS下使用。SQUID通过哈希算法在磁盘上建立目录,将第一次请求的信息,存在指定的目录下,供其下次存取,此外SQUID也会将请求的页面信息缓存在内存中,当客户端访问某一页面时,如果内存中存在,则直接命中CACHE;如果内存中不存在,则到CACHE目录下获取,否则到后端的WEB SERVER获取。

  SQUID 特点:

  1、SQUID沿继了nix下配置的风格,可能用惯了WINDOWS的用户初次使用会有些不适。

  2、SQUID包括了一系列的配置策略,认证、访问控制、缓存设置、URL抓取、日志管理、磁盘管理、群集等。

  3、SQUID可以通过refresh_pattern策略设置请求的URL可缓存的内容,失效时间(详见文档)。

  4、缓存策略说明

  SQUID使用了LM算法,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。refresh_pattern 的语法是:refresh_pattern [-i]regexp min percent max [options],min,max的单位是分钟,percent就是百分比。refresh_pattern 的算法如下:(当前时间定义为CURRENT_DATE)

  1) If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的

  2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的

  3) else cache是过期的,cache过期就需要从后面server取新鲜内容。

  常用的几个参数的意思

  override-expire

  该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。

  override-lastmod

  改选项导致squid在检查LM-factor百分比之前先检查min值。

  reload-into-ims

  该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified-Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。

  一般情况可以使用reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。关于SQUID FORWINDOWS介绍已经很多,本文就不在赘述,详见SQUID权威手册这本书。在使用SQUID之前,首先要规划或确定你现有布署环境,如果你是Single Web Server 建议你在Web Server前增加一台机器做为SQUID服务器。

  三、SQUID FOR WINDOWS配置

  本文中SQUID放在172.20.65.201的机器上,应用WEB ServerIP为172.20.65.203,其中SQUID在201上的80端口侦听,测试客户端机器为172.20.65.231,在squid.conf中#代表注释,所以开启某项设置,需去掉前面的#。TAG标签代表每一功能项的设置。

  1、下载

  下载SQUID FOR WINDOWS(文章所用的版本是Squid 2.7.STABLE6,各个版本的配置可能略有不同,大家请注意)。

  2、安装

  将SQUID解压到c:\squid(当然也可解压在其它盘符下)

  3、建立磁盘缓存和日志目录

  默认情况是在安装磁盘下建立,为确保性能大幅度提升,建立选择磁盘空间容量较大的盘符,如:建立d:\squid\var目录,在var目录下建立logs和cache目录,其中logs目录用 于存放日志,cache目录用于存放硬盘缓存数据。

  4、建立缓存目操作权限

  为了使抓取的数据,能够存放在缓存目录下,建立系统账户如squidApp,将其属于普通用户组应可,将d:\squid授予该用户读写权限即可。

  5、文件更改

  c:\squid\etc是SQUID的配置信息的存放处,为确保安全,在你修改配置文件前,请将其备份,然后将squid.conf.default修改为squid.conf,mime.conf.default修改为 mime.conf,cachemgr.conf.default 修改为cachemgr.conf。

  6、配置SQUID

  针对于SQUID来讲大部分配都在squid.conf中,本文中所使用环境如下:

  开启如下访问控制

  acl all src all
  acl manager proto cache_object
  acl localhost src 127.0.0.1/32
  acl to_localhost dst 127.0.0.0/8
  acl localnet src 172.16.65.231/255.255.0.0 指定本地网络及掩码

  开启访问端口

  acl SSL_ports port 443
  acl Safe_ports port 80 # http
  acl Safe_ports port 21 # ftp
  acl Safe_ports port 443 # https
  acl Safe_ports port 70 # gopher
  acl Safe_ports port 210 # wais
  acl Safe_ports port 1025-65535 # unregistered ports
  acl Safe_ports port 280 # http-mgmt
  acl Safe_ports port 488 # gss-http
  acl Safe_ports port 591 # filemaker
  acl Safe_ports port 777 # multiling http
  acl CONNECT method CONNECT

  开启访问控制,请一定要注意顺序

  http_access allow manager localhost
  http_access deny manager
  http_access deny !Safe_ports
  http_access deny CONNECT !SSL_ports
  http_access allow all
  http_access allow localnet
  http_access deny all

  指定SQUID在80端口侦听, vhost 指定使用加速模式。

  http_port 80 vhost

  203后台WEB SERVER, parent指父节点, 80 指后台网站的端口, 0 ICP 服务端口,no-query originserver 获取缓存时的选项。

  cache_peer 172.20.65.203 parent 80 0 no-query originserver

  缓存设置

  maximum_object_size_in_memory 1024 KB
  cache_dir ufs d:/squid/var/cache 1024 16 256 注意路径
  maximum_object_size 4096 KB
  cache_swap_low 90
  cache_swap_high 95

  日志设置

  access_log d:/squid/var/logs/access.log squid 访问日志
  cache_log d:/squid/var/logs/cache.log
  cache_store_log d:/squid/var/logs/store.log
  emulate_httpd_log on

  控制页面缓存内容

  refresh_pattern ^ftp: 1440 20% 10080
  refresh_pattern ^gopher: 1440 0% 1440
  refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
  refresh_pattern . 0 20% 4320
  refresh_pattern -i \.css$ 20 50% 120 reload-into-ims
  refresh_pattern -i \.xml$ 20 50% 120 reload-into-ims
  refresh_pattern -i \.html$ 20 90% 120 reload-into-ims
  refresh_pattern -i \.jpg$ 20 90% 120 reload-into-ims
  refresh_pattern -i \.png$ 20 90% 120 reload-into-ims
  refresh_pattern -i \.gif$ 20 90% 120 ignore-reload
  refresh_pattern -i \.js$ 20 90% 120 reload-into-ims
  refresh_pattern -i \.htm$ 20 90% 120 reload-into-ims

  设置邮箱

  cache_mgr webmaster_breeze

  设置本地主机文件

  hosts_file c:/windows/system32/drivers/etc/hosts

  7、安装服务

  将squid安装为服务,命令格式:squid -i [-f configfile] [-n servicename],如c:\squid\sbin\squid -i -n Squid_Proxy

  8、初始化缓存目录

  c:\squid\sbin\squid -z

  9、启动Squid_Proxy服务

  运行services.msc打开服务窗口,选择Squid_Proxy服务 ,如果启动过程出错90%是配置文件出现问题。

  10、squid命令

  squid -k reconfigure //启用新的配置文件
  squid -k rotate //截断日志
  squid -k shutdown //stop squid
  squid -dx //当服务不能启动时,进行调试

  四、SQUID测试

  找一台机器进行测试,并查看access.log日志,如果出现 TCP_DENY的信息,多为配置不正确。如出现如下信息TCP_MEM_HIT/200 表示,SQUID已经起作用,该请求是从 SQUID运行机器的内存中响应的。

  五、性能

  用LR跑了一下,1000个并发,内存命中率在100%。

时间: 2024-10-26 21:50:32

实战ASP.NET大规模网站架构:Web加速器的相关文章

一起谈.NET技术,实战ASP.NET大规模网站架构:Web加速器

大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题.文章将针对基于ASP.NET开发的网站交互性非实时部分进行讨论. 一.WEB加速通常有如下方案: 1.基于ASP.NET技术的页面缓存 基于ASP.NET技术的页面缓存,通常有如下两种应用方式: 一.基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提供的解决方案目前仅支持SQL Server,如果是ORACLE需要自己实现触发接口). 二.基于文件依赖的策略(可以设置

ASP.NET多频道网站架构实现方法

各频道分别位于不同的Web Project(具有独立的二级域名),并将所有的业务逻辑以及数据访问功能封装成Class Library,所有频道共用这个Class Library. 下面详细介绍实现方法. 假设网站有三个频道,新闻.论坛以及博客,对应的二级域名为"news"."forum"."blog".除此之外,还需要另外定义两个域名,分别用于网站首页以及用户注册.登陆功能(基于Passport机制,本文后面将作详细介绍),对应域名为"

浅谈web网站架构演变过程

原文:浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理    阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.

ASP.NET MVC5网站开发之展示层架构(五)_实用技巧

展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域. Member区域实现网站内容的管理,Control区域实现网站系统管理.结构.功能图如下:  一.Member区域 1.添加Member区域 Ninesky.Web[右键]-> 添加->区域 . 在弹出的添加区域对话框输入区域名称:Member,完成区域添加. 2.添加Home控制器 Ninesky.Web->Areas->Member->Controllers[右键]

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性

原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[八]--Web Api的安全性 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这一篇文章我们主要来探讨一下Web Api的安全性,到目前为止所有的请求都是走的Http协议(http://),因此客户端与服务器之间的通信是没有加密的.在本篇中,我们将在"StudentController"中添加身份验证功能--通过验证用户名与密码来判断是否是合法用

web应用程序-asp.net做网站新建项目web空应用程序还是新建网站

问题描述 asp.net做网站新建项目web空应用程序还是新建网站 小弟刚出来工作,第一个项目是建的asp.net空网站,但是在发布网站的时候会把每个bin文件里的每个cs类文件生成一个随机命名的dll文件,网站上线后,如果有些功能要修改cs文件的话,就很麻烦,要重新上传所有的内容,听说新建web应用程序就不会有这个问题,web应用程序会把cs文件封装在一个dll里面,是这样吗?这些我都还不是很懂,做网站的话是新建哪个好点,各自有什么优缺点?希望前辈们指教一下,万分感谢. 解决方案 http:/

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门

原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[三]--Web Api入门 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开始之前,再一次回顾一下Web Api的应用场景:Web Api可以与 MVC,WebForm结合使用,也可以作为一个单独的Web服务.在正式讨论Web Api的配置以及如何构造我们的URI来消

ASP.NET MVC5网站开发咨询管理的架构(十一)_实用技巧

一.总体说明 1.实现功能 2.类图 由于文章部分把大部分类都是实现了,这里仅多了一个Consultation类. 二.创建咨询模型类 在Ninesky.Models项目添加类Consultation(咨询模型),该模型跟Article类似都是CommonModel的扩展.1.添加Consultation类. using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.Models { /// <sum

百度网易搜狐的架构师齐聚首 布道高性能大规模网站设计

中介交易 SEO诊断 淘宝客 云主机 技术大厅 中国的互联网产业一直在快速发展,但各家公司在核心技术领域一直并没有深入的技术交流.而最近记者从即将在11月29-30日举办的软件开发2.0大会组委会上了解到,这一状况将成为历史.因为,曾经担任百度首席架构师的雷鸣,以及原搜狐资深互联网社区架构师钱宏武将带来精彩的讲座,同时大学时代便开发的游戏图象引擎"风魂",<大话西游>.<梦幻西游>.<网易泡泡游戏>等网络游戏的主力开发人员,网易公司技术研发经理云风也