nginx图片缓存服务器配置实例

发布时间:2020-03-04编辑:脚本学堂
本文介绍了nginx图片缓存服务器的配置方法,nginx 有好几个参数控制缓存,以nginx缓存图片文件作为例子,缓存池,缓存生命周期等,有需要的朋友参考下。

例子,nginx图片缓存服务器 配置文件。
 

复制代码 代码示例:
#需要建立www用户和www用户组 
user  www www; 
worker_processes  8; 
 
error_log  /usr/local/nginx-0.8.32/logs/error.log crit;
pid  /usr/local/nginx-0.8.32/nginx.pid; 
 
events { 
    use epoll; 
    worker_connections  65535; 

 
http { 
    include       mime.types; 
    default_type  application/octet-stream; 
 
    charset  utf-8;           
    server_names_hash_bucket_size 128;    
    client_header_buffer_size 32k;    
    large_client_header_buffers 4 32k;    
    client_max_body_size 300m;           
    sendfile on;    
    tcp_nopush     on; 
 
    keepalive_timeout 60; 
    tcp_nodelay on;     
    client_body_buffer_size  512k;    
    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;     
     
    gzip on;    
    gzip_min_length  1k;    
    gzip_buffers 4 16k;    
    gzip_http_version 1.1;    
    gzip_comp_level 2;    
    gzip_types text/plain application/x-javascript text/css application/xml;    
    gzip_vary on; 
 
    #注:images_temp和images_cache指定的路径必须在同一分区 
    proxy_temp_path   :/usr/local/nginx-0.8.32/html/SD/images_temp; 
    #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。 
    Proxy_cache_path  :/usr/local/nginx-0.8.32/html/SD/images_cache  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g; 
 
    server { 
        listen       80; 
        server_name  192.168.0.146; 
        location / { 
                proxy_cache cache_one; 
                #对不同的HTTP状态码设置不同的缓存时间 
                proxy_cache_valid  200 304 12h; 
                #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内 
                proxy_cache_key $host$uri$is_args$args; 
                proxy_set_header Host  $host; 
                proxy_set_header X-Forwarded-For  $remote_addr; 
                proxy_pass http://192.168.0.146:8080; 
            log_format cache '***$time_local '  '***$upstream_cache_status '  '***Cache-Control: $upstream_http_cache_control ' '***Expires: $upstream_http_expires ' '***"$request" ($status) ' '***"$http_user_agent" '; 
            access_log  /usr/local/nginx-0.8.32/logs/cache.log cache; 
                expires      1d; 
                } 
 
            #用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。 
    location ~ /purge(/.*) { 
            #设置只允许指定的IP或IP段才可以清除URL缓存。 
            allow       127.0.0.1; 
            allow       192.168.0.0/16; 
            deny    all; 
            proxy_cache_purge    cache_one   $host$1$is_args$args; 
    }  
 
            #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。 
    location ~ .*.(php|jsp|cgi)?$ { 
                proxy_set_header Host  $host; 
                proxy_set_header X-Forwarded-For  $remote_addr; 
                proxy_pass http://192.168.0.146:8080; 
        } 
        access_log  off; 
    } 
 
    server{ 
    listen 8080;  
            server_name 192.168.33.243;  
         
    location / {  
        root /usr/local/webapp;  
    }  
        access_log off; 
     } 

nginx 有好几个参数控制缓存,以nginx缓存图片文件作为例子。

第一,缓存池
proxy_cache_path  /var/cache/nginx/proxy_cache levels=1:2 keys_zone=static:50m max_size=10g inactive=3d;

这个参数控制缓存池的规模,以及与源服务器的交互频率。缓存淘汰是非常被动的,仅仅是为了维护缓存池的规模。

本例使用50M共享内存维护缓存文件列表,如果一个文件3天内不活跃,即没被人二次访问,则在缓存池中淘汰掉,在硬盘上缓存的文件总量最高为10G 。如果缓存池里的文件都是3天内的文件,且总量已经达到10G,那么此时缓存池的淘汰规则是 LRU –Last Recent Used(访问频率最低的被淘汰)。

第二,缓存的生命周期
proxy_cache_valid  200 302 3d;

这个参数直接控制缓存的生命周期,
本例中,如果图片在3天内再次被访问,则直接命中缓存池,返回HIT,
超过3天时间就主动跳过缓存池,直接从源服务器再取一遍,再跟缓存池进行比较。
如果缓存池里有,则更新缓存的时间戳,并返回EXPIRE,
如果缓存池里没有,则重新生成缓存,并返回MISS,
这个值应该 <= 缓存池的文件失效时间才能提高命中率。

第三,浏览器缓存的生命周期
expires 7d
这个参数控制浏览器保存图片多久,分为几个阶段:
(不同的浏览器行为稍有不同,以chrome为例)

1、客户使用浏览器第一次打开网页,服务器返回200,图片进入浏览器缓存,生命周期是7天
2、第二天,客户用浏览器再次打开网页时,返回代码依然是200,但是命中的是本地缓存
3、客户使用F5刷新了浏览器,强制与服务器发生通信,在与服务器比较后发现,文件跟浏览器缓存是一样的,于是得到了304,如果不一样,则是200 。

这三个参数,对于缓存服务器影响较大的是第一二个参数。

首先,我们应该维护一个尽可能大的缓存池,把面做广;
其次,我们要提高缓存命中率,减少缓存与源服务器的交互频率。

最后,如果是小范围的缓存,为了节省昂贵的磁盘IO,我们可以选择将缓存放在共享内存中。