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

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

  大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题。文章将针对基于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 FOR WINDOWS是在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 FOR WINDOWS介绍已经很多,本文就不在赘述,详见SQUID权威手册这本书。在使用SQUID之前,首先要规划或确定你现有布署环境,如果你是Single Web Server 建议你在Web Server前增加一台机器做为SQUID服务器。

  三、SQUID FOR WINDOWS配置

  本文中SQUID放在172.20.65.201的机器上,应用WEB Server IP为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%。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
存储 缓存 API
探索后端技术:构建高效、可扩展的系统架构
在当今数字化时代,后端技术是构建任何成功应用程序的关键。它不仅涉及数据存储和处理,还包括确保系统的高效性、可靠性和可扩展性。本文将深入探讨后端开发的核心概念,包括数据库设计、服务器端编程、API 开发以及云服务等。我们将从基础开始,逐步深入到更高级的主题,如微服务架构和容器化技术。通过实际案例分析,本文旨在为读者提供一个全面的后端开发指南,帮助大家构建出既高效又具有高度可扩展性的系统架构。
|
10天前
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
33 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
11天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
8天前
|
Kubernetes Cloud Native 安全
云原生技术:构建高效、灵活的现代应用架构
本文深入探讨了云原生技术的核心概念、主要特点及其在现代应用开发中的重要性。通过分析云原生技术的实际应用案例,揭示了其如何帮助企业实现应用的快速迭代、弹性扩展和高可用性。同时,文章还讨论了采用云原生技术时面临的挑战及相应的解决策略,为读者提供了一套完整的云原生技术实践指南。
|
14天前
|
Kubernetes Cloud Native Serverless
探索云原生技术:从基础架构到应用实践
本文深入探讨了云原生技术的各个方面,包括其定义、核心原则、关键技术组件以及在现代企业中的应用。通过分析云原生如何推动数字化转型和提高业务敏捷性,文章旨在为读者提供对这一领域的全面了解和实际应用的指导。
42 7
|
9天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
9天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
12天前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
21天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
27 3
下一篇
无影云桌面