写点什么

Linux 下玩转 nginx 系列(六)---nginx 实现 cache(缓存)服务

作者:anyRTC开发者
  • 2022 年 6 月 21 日
  • 本文字数:3081 字

    阅读完需:约 10 分钟

Ngnix 缓存

缓存的使用在各种项目中非常普遍,nginx 作为一款高效的代理服务器,也提供了强大的缓存机制,试想在一些大型网站中,静态的 html,js,css 文件等数量非常庞大的情况下,加载页面的时候,如果没有缓存的话,页面将会非常慢,在这种情况下,就可以考虑使用 nginx 提供的缓存功能的配置。

Nginx 的 web 缓存

  • Nginx 从 0.7.48 版提供缓存功能。

  • Nginx 是基于 Proxy Store 来实现的,其原理是把 URL 及相关组合当做 Key,在使用 MD5 算法对 Key 进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中。

  • 它可以支持任意 URL 连接,同时也支持 404/301/302 这样的非 200 状态码。Nginx 即可以支持对指定 URL 或者状态码设置过期时间,也可以使用 purge 命令来手动清除指定 URL 的缓存。

Nginx 缓存设置相关指令

Nginx 的 web 缓存服务主要是使用 ngx_http_proxy_module 模块相关指令集来完成,接下来把常用的指令做一下总结:proxy_cache_path


该指定用于设置缓存文件的存放路径


语法格式


proxy_cache_path path [levels=number]keys_zone=zone_name:zone_size [inactive=time][max_size=size];
复制代码


参数说明 path 缓存路径地址


/usr/local/proxy_cache
复制代码


levels 指定该缓存空间对应的目录,最多可以设置 3 层,每层取值为 1|2 如 :


levels=1:2 缓存空间有两层目录,第一次是 1 个字母,第二次是 2 个 字母


举例说明:


zcy[key]通过 MD5 加密以后的值为 : 43c8233266edce38c2c9af0694e2107d


最终生成的缓存目录含义为:


  • levels=1:2 最终的存储路径为/usr/local/proxy_cache/d/07;

  • levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21;

  • levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2


keys_zone 用来为这个缓存区设置名称和指定大小


举例说明:


keys_zone=zcy:200m 缓存区的名称是 zcy,大小为 200M,1M 大概能存储 8000 个 keys


inactive 指定缓存的数据多次时间未被访问就将被删除


举例说明:


inactive=1d 缓存数据在 1 天内没有被访问就会被删除


max_size 设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:max_size=2g


配置文件 nginx.conf 主配置文件


worker_processes  1;events {    worker_connections  65536;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;#CDN Include include proxy.conf; include upstrem.conf; include test.example.com.conf; server { listen 80; server_name localhost; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
cat proxy.conf #test cacheproxy_temp_path /data/cdn_cache/proxy_temp_dir;proxy_cache_path /data/cdn_cache/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=1g;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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
[root@centos-1 conf]# cat upstrem.conf upstream test.example.com{ server 192.168.1.102:80 weight=10 max_fails=3;}
[root@centos-1 conf]#mkdir /data/cdn_cache -p
[root@centos-1 conf]# cat test.example.com.conf server{ listen 80; server_name test.example.com; access_log logs/test.example.com-access.log main; location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)$ { #Proxy proxy_redirect off; proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://test.example.com;
#Use Proxy Cache proxy_cache cache_one; proxy_cache_key "$host$request_uri"; add_header Cache "$upstream_cache_status"; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; } location / { proxy_redirect off; proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://test.example.com; client_max_body_size 40m; client_body_buffer_size 128k; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; }}
[root@centos-1 nginx]# ps -ef |grep nginx root 5620 1 0 21:31 ? 00:00:00 nginx: master process sbin/nginxnginx 5621 5620 0 21:31 ? 00:00:00 nginx: worker processnginx 5622 5620 0 21:31 ? 00:00:00 nginx: cache manager processnginx 5623 5620 0 21:31 ? 00:00:00 nginx: cache loader process
复制代码


查看进程发现多了两个 cache 进程。


通过上面的配置,运行后可得到如下结论 1.访问 html 的时候,不走缓存。2.第一次访问图片的时候,cache 是 miss 的状态。3.第二次访问图片的时候,cache 是 hit 的状态。

登录缓存服务器查看

分析 nginx 缓存过程第一步:访问了两个 URL:


http://192.168.1.102/index.htmlhttp://192.168.1.102/test.jpg


第二步:查看缓存目录:


[root@centos-1 cdn_cache]# tree -A /data/cdn_cache//data/cdn_cache/+-- proxy_cache_dir|   +-- 9|   |   +-- a8|   |       +-- f28e02e3877f3826567907bcb0ebea89|   +-- e|       +-- 88|           +-- 114250cf63938b2f9c60b2fb3e4bd88e+-- proxy_temp_dir
6 directories, 2 files
复制代码


第三步:缓存配置参数:


proxy_cache_path /data/cdn_cache/proxy_cache_dir levels=1:2
复制代码


第四步:查看缓存内容


第五步:分析过程通过对 key 加密


echo -n '192.168.1.102/index.html' |md5sum |awk '{print $1}'114250cf63938b2f9c60b2fb3e4bd88e
echo -n '192.168.1.102/test.jpg' |md5sum |awk '{print $1}'f28e02e3877f3826567907bcb0ebea89
复制代码


分析结果:1.nginx 根据配置 levels=1:2 进行缓存。2.其中 1 表示 MD5 的最后一位。3.其中 2 表示 MD5 的倒数第三位和第三位。4.一个冒号表示一层。

参考文档

nginx-proxy_pass官网NGINX缓存使用官方指南Full Example Configuration

发布于: 刚刚阅读数: 4
用户头像

实时交互,万物互联! 2020.08.10 加入

实时交互,万物互联,全球实时互动云服务商领跑者!

评论

发布
暂无评论
Linux下玩转nginx系列(六)---nginx实现cache(缓存)服务_nginx_anyRTC开发者_InfoQ写作社区