Discuz!NT静态文件缓存(SQUID)解决方案

       在目前最新版本的产品中,咱们提供了缓存静态文件的解决方案,就是使用SQUID作静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP连接 上,其中能够外链的静态文件包括:     javascript

 

     1.Discuz.web/Javascript/ 下全部以‘template_’打头的JS文件以及该文件夹下的部分js文件。
     2. 模版文件夹下的全部CSS或IMAGE文件(空间相册文件夹除外)
     3.前台Image文件夹下的Medal(勋 章),Topicidentify(主题鉴定图标)下的全部文件。

 

       同时在最新的产品中,咱们新增了一个entlib.config文 件(位于discuz.web\config\文件夹下),用于配置全部与Discuz!NT企业版相关的配置信息,上面所说的HTTP外链地址,就在这 个文件中有相应配置,咱们只要编辑其中的相应节点信息,就能够启用这个功能了,好比下面的这个配置:css

 

<? xml version="1.0" ?>
< EntLibConfigInfo  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
 
< Medaldir > http://10.0.8.12:81/myp_w_picpath/medals/ </ Medaldir >   <!-- 勋章 -->
 
< Topicidentifydir > http://10.0.8.12:81/myp_w_picpath/identify/ </ Topicidentifydir >   <!-- 主题鉴定图标 -->  
    
< Jsdir > http://10.0.8.12:81/javascript/ </ Jsdir >    <!-- javascript/目录下的 js路径勋章 -->
</ EntLibConfigInfo >

  

       经过上面的文件配置,就能够将前面所说的1和3这两大类静态文件的外链指到别的地址上了。固然若是要设置模板文件夹下的那些CSS,IMAGE文件,咱们 还要在管理后台中的模板列表中进行相关设置。这里为了方便起见,我直接在数据库中的dnt_templates表(默认)将相应的模板静态文件外链信息直 接写上,以下图:
   html

            

 

      咱们的产品目前能够支持为不一样的模板设置不一样的静态文件外链地址,如上图。 前端

      这样,当咱们设置完成上面的内容以后,就能够在IE页面源码中看到当前的静态文件已被连接新的地址上去了,以下图(showforum.aspx页):java


      

 

        固然,目前完成了程序的开发和配置,下面着重介绍以下若是配置SQUID,以架构启用静态前端服务。web

 

       目前在SQUID上有两个平台版本,分别是LINUX和WINDOWS,咱们的产品支持这个平台上的SQUID程序。这里为了方便布署,只介绍 WINDOW平台上的安装步聚(网上LINUX下安装SQUID的资料很是丰富)。算法

 

       首先,从下面地址上下载相应的SQUID windows版本到本地。数据库

       http://squid.acmeconsulting.it/windows

 

       而后将解压该文件到C盘目录下,在squid\etc目录下把:    浏览器

    1.squid.conf.default 拷贝一份从新命名为squid.conf 
    2.cachemgr.conf.default拷贝一份从新命名为 cachemgr.conf 
    3.mime.conf.default拷贝一份从新命名为mime.conf 

  

      接着配置squid.conf,设置相关节点。下面作一下介绍:     

   #启用当前主机的81端口为 squid服务端口
    http_port 81 vhost 


   #浏览器上显示的主机名称
    visible_hostname cache.discuznt

 

      由于squid支持集群布署,因此它提供了相应的配置节点,即cache_peer,详细说明参 见该连接。 这里我把布署环境作一下说明,在本部门的服务器环境中,单拿出两台机器互相作为sibling(姊妹)邻居。    
   

  SQUID运做模式:
    1. 当Squid Server 没有资料 时,会先向Sibling 的Squid Server 要资料,若是Sibling没资料,就跳过它直接向Parent 要。
    2. 向 Parent 要资料,然後一直等,直到Parent 给它资料为止(Parent 本身有的资料或上Internet 去拿)。
    3. 没 有Parent 时,就本身上Internet 去get。
    4. 若是这三者都拿不到资料,才向用户端回报拿不到资料。

  

      这里我将相应的产品静态文件布署到10.0.8.12机器上,并配置了一个端口为7001的IIS站点(注:实际环境下能够省略这一步,将squid缓 存的站点信息配置到其squid.conf文件中)。这样,其结点信息以下所示:    

    #配置缓存节点
    cache_peer 10.0.8.12 parent  7001 0 no-query no-digest originserver name=a
    #10.0.8.13 为(姊妹)邻居
    cache_peer 10.0.8.13 sibling 81 3130 proxy-only name=b

 

       一样将上面的设置复制到10.0.8.14这台机器上的81端口上运行的squid的相应节点。   
 
       下面接着介绍10.0.8.12上的squid.conf配置信息    
   

    hierarchy_stoplist cgi-bin ? \.aspx \.html
    acl QUERY urlpath_regex cgi-bin \? \.aspx \.html   
    cache deny QUERY
    via on

 

     上面的配置信息说明:
     Squid内在的将每一个客户端请求标记为层叠或不可层叠。不可层叠的请求看起来不会致使cache命中。例如,POST请求的响应几乎从不会被 cache。在squid能简单的链接到原始服务器时,转发不可cache目标的请求到邻居cache,纯粹是浪费资源。某些区分层叠和不可层叠请求的规 则,在squid里难于编码。例如,POST和PUT方式老是不可层叠的。然而,hierarchy_stoplist指令容许你定制这种算法。它包含一 个字符串列表,当在URI里发现它们时,squid将请求标记为不可层叠。默认的该列表是:
      hierarchy_stoplist ? cgi-bin这样,任何包含问号或cgi-bin字符串的请求匹配该列表,变成不可层叠。
      默认的,squid直接发送不可层叠的请求到原始服务器。

      能够把其理解为对指定扩展名和连接串用包括特定字符的请求不予缓存和查询。即aspx.html这类请求页面直接转发到原始服务器 (originserver )。

 

      下面注释的信息曾用于在生产环境下进行配置    

    #cache_peer_domain a parent ***.com http://www.***.com/ bbs.***.com home.***.com pma.***.com
    #cache_peer_domain b parent .com .net .org .cc .tv .cn .biz .name

  
     注:cache_peer_domain指令是cache_peer_access指令的早期形式。相对于使用完整的访问控制特性,它仅使用URI里的域 名。它经常使用于经过域名区分一组父cache。例如,假如你有一个遍及全球的内部网,你也许想发送请求到位于各自大陆的cache:

    

    #设定不一样域名转发到不一样的 cache_peer上,若是没有这项.不一样的域名请求可能被分发到同一台服务器上.
    acl all src 0.0.0.0/0.0.0.0

   

     #缓存文件全部的目录以及目录的格式:
     cache_dir ufs c:/squid/var/cache 256 16 256 

     #ICP 是轻量级的目标定位协议,它做为Harvest项目的一部分而被发明。ICP客户发送查询消息到一个或多个ICP服务器,询问它们是否缓存了某个URI。 每一个服务器响应一个ICP_HIT(ICP命中),ICP_MISS(ICP丢失),或其余类型的ICP消息。ICP客户使用ICP响应里的信息来作转发 决定。除了指示cache命中,ICP也用于提供关于squid和邻居cache之间网络条件的线索。当使用icp_port指令时,squid自动成为 ICP服务器。
     icp_port 3130
    icp_access allow all
    http_access allow all

 

       定义对邻居cache的访问列表。也就是说,它决定哪一个请求容许或不容许发送到邻居cache。参见该 连接。       

     cache_peer_access a allow all

       

     #下面注释代码为错误信息保存路径
     #error_directory c:/squid/usr/local/squid/share/errors/Simplify_Chinese

     # 由于如今的IE都是多线程,考虑到服务器带宽等网络资源消耗,因此长连接关闭
      client_persistent_connections off 

     # 服务端长连接是用于在服务器端传递消息时使用已打开的socket连接以节省资源而设置的。
      server_persistent_connections on
   
     # 开启内存池并配置大小
     memory_pools on
     memory_pools_limit 768 MB

    # 显示客户端内网IP
     forwarded_for on  

    #关闭client端的统计功能
     client_db off  

    # 访问日志,在生产环境下这个文件须要被拆分
     access_log c:/squid/var/logs/squid/access.log

    # 缓存日志,在生产环境下这个文件须要被拆分
    cache_log c:/squid/var/logs/squid/cache.log

    

      注:C:\squid\sbin\squid.exe.log文件也很重要,它 是squid启动日志,当应用程序出现问题时,可从其中找到一些问题。 

      配置完这些信息以后,在命令行窗口下cd 到c:\squid\sbin目录下执行,执行    

     c:\squid \sbin\>squid -i -n dnt_squid  (注:命名新名称,可以使用squid -r -n dnt_squid,删除指定名 称的服务)
     c:\squid\sbin\>squid -z 

    

     这样就在机器上安装的squid的服务。下面就启动该服务:    

     c:\squid\sbin\>net start dnt_squid (上面定义的服务名称)  注:中止服 务 net stop dnt_squid

 

     这时在IE上访问squid服务器:

     http://10.0.8.12:81/(你 的squid服务器IP地址),这时squid会将请求转到http://10.0.8.12:7001/(以前IIS中建立的web服务器地址)

   

      一样在10.0.8.14上也安装并配置 squid,不过要在cache_peer节点上作上面所说的那个配置,就完成了SQUID的配置工做。

      固然,squid缓存的文件基本上都是1:1的,即一个js文件会生成一个缓存文件,大小尺寸没什么变化,只不过若是是图片这类文件的话,squid生 成的缓存文件是没法用看图软件打开的,而文本文件就没这个问题了。
   
      注:squid官方站点有详细的配置资料信息,本文介绍的配置内容可做为入门参考使用。

      最终配置文件下载连接,点击这里(压缩包中的squid.conf文件)。另外我还在本地用LoadRunner作了并发用户 1000(v_user)的测试,效果不错,报告下载地址点击这里


       同时,squid还提供了一个叫squidclient(位于C:\squid\bin)的客户端工具颇有用,好比获取squid运行时的一些系统信息信 息: 

   squidclient -p 81 mgr:info  #squid 运行状态信息
   squidclient -p 81 mgr:mem   #squid内存使用状况
   squidclient -p 81 mgr:objects  #quid 已经缓存的列表
   squidclient -p 80 mgr:diskd #squid的磁盘使用状况

      

       固然用的最多的仍是PURGE指令,它会强制更新某一url缓存信息,形如     

   squidclient -p 81 -m PURGE http://10.0.8.12/:81/css/dnt.css

       

      更多的信息可使用帮助命令: 

   squidclient -h

 

       好的,今天的内容就先到这里的。