Nginx 静态压缩/缓存 https://my.oschina.net/QAAQ/blog/761482
对静态压缩的一些配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量, # 建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache max=204800 inactive=20s; # open_file_cache 指令中的inactive 参数时间内文件的最少使用次数, # 如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个 # 文件在inactive 时间内一次没被使用,它将被移除。 open_file_cache_min_uses 1; # 这个是指多长时间检查一次缓存的有效信息 open_file_cache_valid 30s; # 默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不 # 少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 , # 如果要对html之外的内容进行压缩传输,我们需要手动来设置。 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml;//手动设置 |
实验如下:当没有设置压缩类型时的情况,只会对text/html类型的文件进行压缩。
配置文件nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
http { server { listen 80; gzip on; location /welcome{ default_type text/html; content_by_lua ' ngx.say("<p>welcome,here!</p>") '; } location /index.html{ root /usr/local/work/yidaren.top/html; } location /{ proxy_pass http://127.0.0.1/index.html; } location ~*\.js$ { root /usr/local/work/yidaren.top; } } } |
请求welcome和js对比():
配置缓存文件,例如一些基本不变html页面本身,js文件,css文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
1 proxy_cache 语法:proxy_cache zone_name; 默认值:None 使用字段:http, server, location 设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。 在0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”以及其他等。然而,目前nginx会忽略一些缓存控制指令,如:”private”和”no-store”,同样,nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置 “no-cache”或者”max-age=0″头,或者proxy_cache_key包含用户指定的数据如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止缓存私有数据,所以可以分别指定location以便分开私有数据和公有数据。 缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。 2 proxy_cache_key 语法:proxy_cache_key line; 默认值:$scheme$proxy_host$request_uri; 使用字段:http, server, location 指令指定了包含在缓存中的缓存关键字。 proxy_cache_key "$host$request_uri$cookie_user"; proxy_cache_key "$scheme$host$request_uri"; 3 proxy_cache_path 语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]; 默认值:None 使用字段:http 指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5 码。levels参数指定缓存的子目录数,例如: proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; 文件名类似于: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c 所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。 cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。 区域的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节,当区域满了以后key将按照LRU(最近最少使用算法)进行处理。 proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。 4 proxy_cache_methods 语法:proxy_cache_methods [GET HEAD POST]; 默认值:proxy_cache_methods GET HEAD; 使用字段:http, server, location GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置: proxy_cache_methods POST; 5 proxy_cache_min_uses 语法:proxy_cache_min_uses the_number; 默认值:proxy_cache_min_uses 1; 使用字段:http, server, location 多少次的查询后应答将被缓存,默认1。 6 proxy_cache_valid 语法:proxy_cache_valid reply_code [reply_code ...] time; 默认值:None 使用字段:http, server, location 为不同的应答设置不同的缓存时间,例如: proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 5m; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; 7 proxy_cache_use_stale 为了防止缓存失效(在多个线程同时更新本地缓存时),你可以指定’updating’参数,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。 代码及configure配置: 在ngx_http_proxy_module.c里面定义了每个指令的钩子(即callback),它们在读取配置文件时会被调用。在configure的时候只需要把“HTTP_CACHE”设置为YES(可以找到auto/options里面HTTP_CACHE那行)。“proxy_cache_purge”指令需要下载nginx add-ons里面的“Cache Purge”模块,并在configure的时候用"--add-module="来加载代码。 |
配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
http { proxy_cache_path /usr/local/work/cache levels=1:2 keys_zone=my_cache:10m max_size=100m inactive=60m use_temp_path=off; server { listen 80; gzip on; location /welcome{ default_type text/html; content_by_lua ' ngx.say("<p>welcome,here!</p>") '; } location /index.html{ root /usr/local/work/yidaren.top/html; } location /{ proxy_pass http://127.0.0.1/index.html; } location ~*\.js$ { proxy_cache my_cache; proxy_cache_key $host$uri; proxy_cache_valid 200 304 30m; root /usr/local/work/yidaren.top; } } } |
验证如下:
网页加载效果如下:
开源中国图片服务器出了点点问题,后面补上。
如何验证,我们可以进入我设置cache的页面使用 ll命令就可以查看结果
1 2 3 4 |
[root@iZm5eg3u73g9nvjmiwu3opZ caches]# ll 总用量 8 drwx------ 3 nobody nobody 4096 10月 20 22:56 3 drwx------ 3 nobody root 4096 10月 20 22:56 temp |
证明对反向代理的数据进行了缓存,这种技术对于反向代理是动态生成数据的情况下有和强大的效果,例如php,当然lua应该也是可以的。
如果你要清除某一个url的缓存文件,就比较悲催了。但也不是不能做到。因为nginx生成url文件的时候,存放的目录以及生成的哈希文件名都是固定的,你也可以使用proxy_cache_key来指定生成的key的字段内容。
如果你掌握它的生成规则,你就可以写一个管理器来快速清空单个url缓存。最烂的方法也可以把缓存目录清空,接着访问你要需要单独清空的url,然后再到缓存目录里看看生成的缓存目录与文件名,再你需要单独清空这个url的缓存时直接把文件干掉就好。
参考好文章:http://www.qttc.net/201307355.html
:http://xuewb.com/ngx/static_file.html
:http://www.cnblogs.com/dudu/p/4597351.html
纸上得来终觉浅,觉知此事要躬行