百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

nanshan 2024-11-19 07:48 13 浏览 0 评论

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 cache
proxy_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/nginx
nginx      5621   5620  0 21:31 ?        00:00:00 nginx: worker process
nginx      5622   5620  0 21:31 ?        00:00:00 nginx: cache manager process
nginx      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.html
http://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

相关推荐

如何为MySQL服务器和客户机启用SSL?

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...

Mysql5.7 出现大量 unauthenticated user

线上环境mysql5.7突然出现大量unauthenticateduser,进mysql,showprocesslist;解决办法有:在/etc/hosts中添加客户端ip,如192.16...

MySQL 在 Windows 系统下的安装(mysql安装教程windows)

更多技术文章MySQL在Windows系统下的安装1.下载mysql和Framework链接链接:百度网盘请输入提取码提取码:6w3p双击mysql-installer-communit...

MySql5.7.21.zip绿色版安装(mysql数据库绿色版安装)

1、去网上下载满足系统要求的版本(mysql-5.7.21-winx64.zip)2、直接解压3、mysql的初始化(1)以管理员身份运行cmd,在mysql中的bin目录下shift+右键-在...

MySQL(8.0)中文全文检索 (亲测有效)

在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:SELECT*FROM<表名>WHERE<字段名>like‘%ABC%’但是它的效率太低,是全盘扫描。...

新手教程,Linux系统下MySQL的安装

看了两三个教程。终于在哔哩哔哩找到一个简单高效的教程,成功安装,up主名叫bili逍遥bili,感兴趣可以去看看。下面这个是我总结的安装方法环境:CentOS764位1.下载安装包,个人觉得在...

麒麟服务器操作系统安装 MySQL 8 实战指南

原文连接:「链接」Hello,大家好啊,今天给大家带来一篇麒麟服务器操作系统上安装MySQL8的文章,欢迎大家分享点赞,点个在看和关注吧!MySQL作为主流开源数据库之一,被广泛应用于各种业务...

用Python玩转MySQL的全攻略,从环境搭建到项目实战全解析

这是一篇关于“MySQL数据库入门实战-Python版”的教程,结合了案例实战分析,帮助初学者快速掌握如何使用Python操作MySQL数据库。一、环境准备1.安装Python访问Pytho...

安装MySQL(中标麒麟 安装mysql)

安装MySQL注意:一定要用root用户操作如下步骤;先卸载MySQL再安装1.安装包准备(1)查看MySQL是否安装rpm-qa|grepmysql(2)如果安装了MySQL,就先卸载rpm-...

Mysql最全笔记,快速入门,干货满满,爆肝

目录一、MySQL的重要性二、MySQL介绍三、软件的服务架构四、MySQL的安装五、SQL语句六、数据库相关(DDL)七、表相关八、DML相关(表中数据)九、DQL(重点)十、数据完...

MAC电脑安装MySQL操作步骤(mac安装mysqldb)

1、在官网下载MySQL:https://dev.mysql.com/downloads/mysql/根据自己的macOS版本,选择适配的MySQL版本根据自己需求选择相应的安装包,我这里选择macO...

mysql主从(mysql主从切换)

1、本章面试题什么是mysql主从,主从有什么好处什么是读写分离,有什么好处,使用mycat如何实现2、知识点2.1、课程回顾dubboORM->MVC->RPC->SOApro...

【linux学习】以MySQL为例,带你了解数据库

做运维的小伙伴在日常工作中难免需要接触到数据库,不管是MySQL,mariadb,达梦还是瀚高等其实命令都差不多,下面我就以MySQL为例带大家一起来了解下数据库。有兴趣的小伙伴不妨评论区一起交流下...

玩玩WordPress - 环境简介(0)(玩玩网络科技有限公司)

简介提到开源博客系统,一般都会直接想到WordPress!WordPress是使用PHP开发的,数据库使用的是MySQL,一般会在Linux上运行,Nginx作为前端。这时候就需要有一套LNMP(Li...

服务器常用端口都有哪些?(服务器端使用的端口号范围)

下面为大家介绍一下,服务器常用的一些默认端口,以及他们的作用:  21:FTP服务所开放的端口,用于上传、下载文件。  22:SSH端口,用于通过命令行模式远程连接Linux服务器或vps。  23:...

取消回复欢迎 发表评论: