• 让网站飞起来02服务器缓存技术


    前提提要:

    第一个介绍的是《让网站飞起来01---浏览器缓存技术

    介绍服务器,肯定要先支持服务器在网站架构中的位置和作用,然后在介绍几种常见的服务器缓存配置。

    正文

    对服务器在网站中位置作用有个大概了解:lamp架构图

    LAMP网站架构方案分析

    上图主要介绍了三种服务器,也是比较常用的服务器,下面就介绍这三种服务器的缓存配置。

    apache是作为正向代理服务器缓存,nginx和squid主要作为反向代理服务器缓存.

    服务器缓存工作原理

    上面是一个简单的流程图:我先描述一下:

    1. 用户1访问A页面,服务器解析A页面返回给用户1,同时在服务器内存上做一定映射,把A页面缓存在硬盘上面
    2. 用户2访问A页面,服务器直接根据内存上的映射找到对应的页面缓存,直接返回给用户2,这样就减少了服务器对同一页面的重复解析

    服务器缓存和浏览器缓存的区别:

    • 服务器缓存是把页面缓存到服务器上的硬盘里,而浏览器缓存是把页面缓存到用户自己的电脑里

    服务器缓存技术

    1. apche缓存配置:

    apache2.2支持mod_cache 和 mod_file_cache两个模块,官方手册的说明:

    mod_cache实现了一个RFC 2616兼容的HTTP本地缓存(web服务器)或HTTP代理缓存(代理服务器)。mod_cache需要一个或多个存储管理模块提供的服务才能正常工作。目前官方发布的存储管理模块有两个:

    mod_disk_cache
    一个基于磁盘的存储管理模块。
    mod_mem_cache
    一个基于内存的存储管理模块。mod_mem_cache可以被配置为两种不同的操作模式:①缓存打开的文件描述符;②在堆(heap)上缓存对象。mod_mem_cache既可以用于缓存本地生成的内容,也可以用于为反向代理模式下的mod_proxy(参见ProxyPass)缓存后端服务器输出的内容。

    使用方法:

    • 编译mod_cache,mod_mem_cache,mod_disk_cache 模块

    Cd /root/httpd-2.2.3/modules/cache

    /usr/local/apache/bin/apxs -i -a -c mod_cache.c cache_util.c cache_cache.c cache_storage.c cache_pqueue.c cache_hash.c //编译

    /usr/local/apache/bin/apxs -i -a -c mod_mem_cache.c //编译

    /usr/local/apache/bin/apxs -i -a -c mod_disk_cache.c //编译

    • 编辑httpd.conf文件

    添加:

    <IfModule mod_cache.c> 
    
    #内存缓存
    
    <IfModule mod_mem_cache.c> 
    
    CacheEnable mem /images
    
    MCacheSize 4096 
    
    MCacheRemovalAlgorithm LRU 
    
    MCacheMaxObjectCount 100 
    
    MCacheMinObjectSize 1 
    
    MCacheMaxObjectSize 2048 
    
    CacheMaxExpire 864000 
    
    CacheDefaultExpire 86400 
    
    #CacheDisable /php 
    
    </IfModule> 
    
    #硬盘缓存
    
    <IfModule mod_disk_cache.c> 
    
    CacheRoot /home/cache
    
    #CacheSize 256 
    
    CacheEnable disk / 
    
    CacheDirLevels 4 
    
    #CacheMaxFileSize 64000 
    
    #CacheMinFileSize 1 
    
    #CacheGcDaily 23:59 
    
    CacheDirLength 3 
    
    </IfModule> 
    
    </IfModule> 
    

      

    /usr/local/apache/bin/apachectl restart  //重启apche

    • 内存缓存参数说明:

    1,CacheEnable mem /images 缓存images下面的内容,这里的 mem只是一个缓存类型,指示mod_cache使用内存的存储管理器通过实施mod_mem_cache 。缓存类型disk指示mod_cache使用基于磁盘的存储管理的实施mod_disk_cache 。缓存类型,fd指示mod_cache使用文件描述符缓存实施mod_mem_cache

    2,MCacheSize最大内存使用量,插入在缓存和对象大小的对象是大于剩余内存,将被删除,直到新的对象可以被缓存。 被删除的对象选择使用指定的算法MCacheRemovalAlgorithm

    3,MCacheRemovalAlgorithm缓存算法:

    LRU (最近最少使用)
    LRU删除文件,没有时间最长的被访问的。
    GDSF(GreadyDual尺寸)
    GDSF分配一个优先的文件缓存文件的费用的基础上,缓存大小和怀念。以最低的优先权文件被删除第一次。

    4,MCacheMaxObjectCount最大缓存对像个数

    5,MCacheMaxObjectCount最大缓存对像字节数

    6,MCacheMinObjectSize最小缓存对像字节数

    7,CacheMaxExpire 最大缓存结止时间

    8,CacheDefaultExpire  默认缓存结止时间

    9,CacheDisable /php       不缓存php下面的内容

    硬盘缓存参数说明;

    1,cacheroot /cache  缓存存放的目录

    2,#CacheSize 256         缓存空间大小单位KB

    3,CacheEnable disk /    设置缓存方式

    4,#CacheMaxFileSize 64000    最大缓存文件大小

    5,#CacheMinFileSize 1      最小缓存文件大小

    6,#CacheGcDaily 23:59     缓存清理时间

    7,CacheDirLength 3        缓存文件夹名子字符长度

    8,CacheDirLevels 4        缓存目录,子目录层次

    关于参数说明和更多的学习参考:http://blog.51yip.com/apachenginx/898.html

    http://apache.jz123.cn/mod/mod_cache.html

    nginx缓存配置

    nginx是一个很好的静态服务器,很适合存放静态文件如css,图片,视频文件等等,可以很好的减去服务器的鸭梨!

    nginx的缓存配置主要使用 proxy_cache模块实现,工作原理就是就用户请求缓存到本地的某个目录下,当再次请求时候,直接读取缓存,从而减轻服务器鸭梨

    配置nginx.conf,下面是一个经典的缓存配置

    user  www www;
    worker_processes 2;
    error_log  /var/log/nginx_error.log  crit;
    worker_rlimit_nofile 65535;
    events
    {
      use epoll;
      worker_connections 65535;
    }
    
    http
    {
      include       mime.types;
      default_type  application/octet-stream;
    
      server_names_hash_bucket_size 128;
      client_header_buffer_size 32k;
      large_client_header_buffers 4 32k;
      client_max_body_size 8m;
    
      sendfile on;
      tcp_nopush     on;
      keepalive_timeout 0;
      tcp_nodelay on;
    
      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      fastcgi_buffer_size 64k;
      fastcgi_buffers 4 64k;
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_write_size 128k;
      ##cache##
      proxy_connect_timeout 5;
      proxy_read_timeout 60;
      proxy_send_timeout 5;
      proxy_buffer_size 16k;
      proxy_buffers 4 64k;
      proxy_busy_buffers_size 128k;
      proxy_temp_file_write_size 128k;
      proxy_temp_path /home/temp_dir;
      proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
      ##end##
    
      gzip    on;
      gzip_min_length   1k;
      gzip_buffers   4 8k;
      gzip_http_version  1.1;
      gzip_types   text/plain application/x-javascript text/css  application/xml;
      gzip_disable "MSIE [1-6]\.";
    
      log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" $http_x_forwarded_for';
      upstream appserver { 
            server 192.168.1.251;
      }
      server {
            listen       80 default;
            server_name www.gangpao.com;
            location ~ .*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
                  proxy_pass http://appserver;
                  proxy_redirect off;
                  proxy_set_header Host $host;
                  proxy_cache cache_one;
                  proxy_cache_valid 200 302 1h;
                  proxy_cache_valid 301 1d;
                  proxy_cache_valid any 1m;
                  expires 30d;
            }
            location ~ .*\.(php)(.*){
                 proxy_pass http://appserver;
                 proxy_set_header        Host $host;
                 proxy_set_header        X-Real-IP $remote_addr;
                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            access_log /usr/local/nginx/logs/www.gangpao.com.log;
      }
    }

    1、http段设置。 
    proxy_temp_path /home/temp_dir;设置临时目录 
    proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。 
    2、server段设置 
    请求静态文件设置。 
    proxy_cache cache_one;设置缓存共享内存区块,也就是keys_zone名称。 
    proxy_cache_valid 200 302 1h;设置http状态码为200,302缓存时间为1小时。 
    expires 30d;设置失期时间,为30天 
    请求动态文件设置。 
    proxy_pass http://appserver;不进行缓存,直接转到后端服务器

    测试:当客户端发起http请求时在服务器上会产一个缓存文件如

    /home/cache/0/b9/8bd841b1c44ee5b91457eb561e44eb90

    更详细的参数说明:

    http://wiki.nginx.org/NginxChsHttpProxyModule#proxy_cache_valid

    http://linux008.blog.51cto.com/2837805/547236

    squid的缓存配置

    之前没有接触过squid,这些都是现学的,下面介绍一下squid:

    Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTP、gopher、SSL和WAIS等协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

    Squid将数据元缓存在内存中,同时也缓存DNS查寻的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP,Squid能够实现重叠的代理阵列,从而最大限度的节约带宽。

    Squid能够增强访问控制,提高安全性。可以针对特定的的网站、用户、网络、数据类型实施访问控制等

    安装squid---安装是最新的版本

    下载:wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.15.tar.gz

    tar xzvf squid-3.1.15.tar.gz

    cd squid-3.1.15

    ./configure --prefix=/usr/local/squid

    make && make install

    ******************************安装ok

    配置文件:

    vi /usr/local/etc/squid.conf

    visible_hostname raymond-linux
    
    # cache服务器的名称 
    # 缓存管理员 
    cache_mgr webmaster@example.com
    
    # 如果不能访问,需要 http_access deny !Safe_ports 改为allow或将 3128加入 safe_ports 
    # 也可配置监听80端口,并配置为加速模式 
    http_port 3128  vhost vport
    
    # cache服务器之间通信的端口UDP 
    icp_port 3130
    
    # 当然cache_peer还可以设置兄弟节点、上级cache服务器等等,这里这设置了源服务器地址 
    # 设置上级根服务器的地址,也就是电信源服务器地址 
    cache_peer 172.20.35.251 parent 82 0 no-query originserver name=myAccel 
    # cache目录和大小的设置,1GB硬盘空间和256M内存 
    #前面已经设置  cache _dir /var/spool/squid 
    #cache_dir ufs /usr/squid/var/cache 256 16 256 
    cache_mem 16 MB
    
    cache_peer_access myAccel allow all
    
    #最大缓存文件大小,超过这个值则不缓存,这个值因人而异 
    cache_swap_low 90 
    cache_swap_high 95 
    maximum_object_size 20000 KB 
    #装入内存缓存的文件大小,这个值对Squid的性能影响比较大,因为默认值是8K,超过8K的文件都不装入内存,而实际应用中很多网页和图片等都超过8KB, 个人认为如果缓存不装入内存而存在磁盘上,性能和apache直接读取磁盘文件没什么区别,甚至不如直接访问apache,现在设置成小于4兆的文件通通装入内存缓存.
    
    maximum_object_size_in_memory 4096 KB
    
    # 主机文件路径 
    hosts_file /etc/hosts
    
    # 设置日志目录和日志格式#squid 
    pid_filename /var/log/squid/squid.pid 
    #已在前面配置 access_log /var/log/squid/access.log squid 
    #已在前面配置 cache_log /var/log/squid/cache.log 
    #已在前面配置 cache_store_log /var/log/squid/store.log 
    #模拟apache 日志格式 
    emulate_httpd_log on
    
    #设置不想缓存的目录或者文件类型,动态文件,大文件不缓存。不过一般最好缓存 
    #已在前面配置 acl all src 0.0.0.0/0.0.0.0 
    acl QUERY urlpath_regex cgi-bin .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe 
    cache deny QUERY
    
    # 允许所有用户访问 , 要打开 
    http_access allow all
    
    #apache ip 
    acl apache_server dst 127.0.0.1 
    http_access allow apache_server
    
    #正向代理,这里不需要 
    #acl our_sites dstdomain sohu.com 
    #http_access allow our_sites
    

      

    生成cache目录

    /usr/local/squid/sbin/squid –z

    自动生成

    启动squid

    ./squid

    参考资料:http://blog.51yip.com/server/638.html

    Squid中文权威指南http://home.arcor.de/pangj/squid/

  • 相关阅读:
    《大道至简》读后有感
    关于jQuery放置位置的问题01
    javascript基础
    层叠样式表与css3基础
    经典sql语句
    java开发中的23种设计模式
    struts2漏洞以及测试
    离开贴吧大概会写下博客吧
    Set介绍
    小知识点
  • 原文地址:https://www.cnblogs.com/phphuaibei/p/2193548.html
Copyright © 2020-2023  润新知