Nginx HTTP缓存设置

本文介绍了Nginx的浏览器缓存控制指令及代理层缓存配置,包括expires、etag、if-modified-since指令的应用,以及proxy_cache_path、proxy_cache、proxy_cache_valid等关键配置项。

Nginx提供了expires、etag、if-modified-since指令来实现浏览器缓存控制。

  expires

  如果我们使用Nginx作为静态资源服务器,那么可以使用expires进行缓存控制。

  location /img {

  alias /export/img/;

  expires 1d;

  }

  当我们访问静态资源时,如,将得到类似如下的响应头。

  

  对于静态资源会自动添加ETag,可以通过添加etag off指令禁止生成ETag。如果是静态文件,那么Last-Modified值为文件的最后修改时间。Expires是根据当前服务器系统时间算出来的。如上Nginx配置的计算逻辑(实际计算逻辑比这个多,具体参考官方文档)。

  if (expires == NGX_HTTP_EXPIRES_ACCESS||r->headers_out.last_modified_ time == -1) {

  max_age = expires_time;

  expires_time += now;

  }

  if-modified-since

  此指令用于指定Nginx如何拿服务端的Last-Modified和浏览器端的if-modified- since时间进行比较,默认“if_modified_since exact”表示精确匹配,也可以使用“if_modified_since _before”表示只要文件的最后修改时间早于或等于浏览器端的if-modified-since时间,就返回304。

  nginx proxy_pass

  使用Nginx作为反向代理时,请求会先进入Nginx,然后Nginx将请求转发给后端应用,如下图所示。

  

  首先配置upstream。

  upstream backend_tomcat {

  server 192.168.61.1:9080max_fails=10 fail_timeout=10s weight=5;

  }

  接着配置location

  location = /cache {

  proxy_pass http://backend_tomcat/cache$is_args$args;

  }

  接下来,我们可以通过如http://192.168.61.129/cache?millis=1471349916709访问Nginx,Nginx会将请求转发给后端Java应用。也就是说Nginx只是做了相关的转发(负载均衡),并没有对请求和响应做什么处理。

  假设对后端返回的过期时间需要调整,可以添加Expires指令到location。

  location = /cache {

  proxy_pass http://backend_tomcat/cache$is_args$args;

  expires 5s;

  }

  然后再请求相关的URL,将得到如下响应。

  

  过期时间相关的响应头被Expires指令更改了,但是last-modified是没有变的。

  即使我们更改了缓存过期头,但Nginx自己没有对这些内容做代理层缓存,每次请求还是要到后端验证的,假设在过期时间内,这些验证在Nginx这一层验证就可以了,不需要到后端验证,这样可以减少后端很大的压力。即整体流程如下。

  1.浏览器发起请求,首先到Nginx,Nginx根据URL在Nginx本地查找是否有代理层本地缓存。

  2.Nginx没有找到本地缓存,则访问后端获取最新的文档,并放入到Nginx本地缓存中,返回200状态码和最新的文档给浏览器。

  3.Nginx找到本地缓存,首先验证文档是否过期(Cache-Control:max-age=5),如果过期,则访问后端获取最新的文档,并放入Nginx本地缓存中,返回200状态码和最新的文档给浏览器;如果文档没有过期,即if-modified-since与缓存文档的last-modified匹配,则返回304状态码给浏览器。

  内容不需要访问后端,即不需要后端动态计算/渲染等,直接Nginx代理层就把内容返回了,速度更快,内容越接近于用户速度越快。像ApacheTraffic Server、Squid、Varnish、Nginx等技术都可以用来进行内容缓存。还有CDN技术就是用来加速用户访问的。

  

  即用户首先访问到全国各地的CDN节点(使用如ATS、Squid实现),如果CDN没命中,则会回源到中央Nginx集群,该集群做二级缓存,如果没有命中缓存(该集群的缓存不是必须的,要根据实际命中情况等决定),则最后回源到后端应用集群。

  像我们商品详情页的一些服务就大量使用了Nginx缓存减少回源到后端的请求量,从而提升访问速度。可以参考“第11章 多级缓存”、“第16章 构建需求响应式亿级商品详情页”和“第17章 京东商品详情页服务闭环实践”。

  Nginx代理层缓存

  Nginx代理层缓存配置

  HTTP模块配置

  proxy_buffering on;

  proxy_buffer_size 4k;

  proxy_buffers 5124k;

  proxy_busy_buffers_size 64k;

  proxy_cache_path /export/cache/proxy_cachelevels=1:2 keys_zone=cache:512m inactive=5m max_size=8g use_temp_path=off;

  #proxy timeout

  proxy_connect_timeout 3s;

  proxy_read_timeout 5s;

  proxy_send_timeout 5s;

  proxy_cache_path指令配置:

  levels=1:2:表示创建两级目录结构,缓存目录的第一级目录是1个字符,第二级目录是2个字符,比如/export/cache/proxy_cache/7/3c/,如果将所有文件放在一级目录下的话,文件量很大,会导致文件访问慢。

  keys_zone=cache:512m :设置存储所有缓存key和相关信息的共享内存区,1M大约能存储8000个key。

  inactive=5m :inactive指定被缓存的内容多久不被访问将从缓存中移除,以保证内容的新鲜,默认为10分钟。

  max_size=8g :最大缓存阀值,“cache manager”进程会监控最大缓存大小,当缓存达到该阀值时,该进程将从缓存中移除最近最少访问的内容。

  use_temp_path:如果为on,则内容首先被写入临时文件(proxy_temp_path ),然后重命名到proxy_cache_path指定的目录;如果设置为off,则内容直接被写入到proxy_cache_path指定的目录,如果需要cache建议off,则该特性是1.7.10提供的。

  1.location配置

  location = /cache {

  proxy_cache cache;

  proxy_cache_key$scheme$proxy_host$request_uri;

  proxy_cache_valid 200 5s;

  proxy_passhttp://backend_tomcat/cache$is_args$args;

  add_header cache-status$upstream_cache_status;

  }

  2.缓存相关配置

  proxy_cache:指定使用哪个共享内存区存储缓存信息。

  proxy_cache_key :设置缓存使用的key,默认为完整的访问URL,根据实际情况设置缓存key。

  proxy_cache_valid :为不同的响应状态码设置缓存时间。如果是proxy_cache_valid5s,则200、301、302响应都将被缓存。

  3.proxy_cache_valid不是唯一设置缓存时间的,还可以通过如下方式(优先级从上到下)。

  1.以秒为单位的“X-Accel-Expires”响应头来设置响应缓存时间。

  2.如果没有“X-Accel-Expires”,则可以根据“Cache-Control”、“Expires”来设置响应缓存时间。

  3.否则,使用proxy_cache_valid设置缓存时间。

  如果响应头包含Cache-Control:private/no-cache/no-store、Set-Cookie或者只有一个Vary响应头且其值为*,则响应内容将不会被缓存。可以使用proxy_ignore_headers来忽略这些响应头。

  add_header cache-status $upstream_cache_status在响应头中添加缓存命中的状态。

  HIT:缓存命中,直接返回缓存中内容,不回源到后端。

  MISS:缓存未命中,回源到后端获取最新的内容。

  EXPIRED:缓存命中但过期了,回源到后端获取最新的内容。

  UPDATING:缓存已过期但正在被别的Nginx Worker进程更新,配置了proxy_cache_use_stale updating指令时会存在该状态。

  STALE:缓存已过期,但因后端服务出现了问题(比如后端服务挂了)返回过期的响应,配置了如proxy_cache_use_stale error timeout指令后会出现该状态。

  REVALIDATED:启用proxy_cache_revalidate指令后,当缓存内容过期时,Nginx通过一次if-modified-since的请求头去验证缓存内容是否过期,此时会返回该状态。

  BYPASS:proxy_cache_bypass指令有效时,强制回源到后端获取内容,即使已经缓存了。

  4.proxy_cache_min_uses

  用于控制请求多少次后响应才被缓存。默认“proxy_cache_min_uses1;”,如果缓存热点比较集中、存储有限,则可以通过修改该参数来来减少缓存数量和写磁盘次数。

  5.proxy_no_cache

  用于控制什么情况下响应不被缓存。比如配置“proxy_no_cache$args_nocache”,如果带的nocache参数值至少有一个不为空或者为0,则响应将不被缓存。

  6.proxy_cache_bypass

  类似于proxy_no_cache,但是,其控制什么情况不使用缓存的内容,而是直接到后端获取最新的内容。如果命中,则$upstream_cache_status为BYPASS。

  7.proxy_cache_use_stale

  当对缓存内容的过期时间不敏感,或者后端服务出问题时,即使缓存的内容不新鲜也总比返回错误给用户强(类似于托底),此时可以配置该参数,如“proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504”,即如果出现超时、后端连接出错、500、502、503等错误时,则即使缓存内容已过期也先返回给用户,此时$upstream_cache_status为STALE。还有一个updating表示缓存已过期但正在被别的Nginx Worker进程更新,但先返回了过期内容,此时$upstream_cache_status为UPDATING。

  8.proxy_cache_revalidate

  当缓存过期后,如果开启了proxy_cache_revalidate,则会发出一次if-modified-since或if-none-match条件请求,如果后端返回304,则此时$upstream_cache_status为REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。

  9.proxy_cache_lock

  当多个客户端同时请求同一份内容时,如果开启proxy_cache_lock(默认off),则只有一个请求被发送至后端。其他请求将等待该请求的返回。当第一个请求返回后,其他相同请求将从缓存中获取内容返回。当第一个请求超过了proxy_cache_lock_timeout超时时间(默认为5s),则其他请求将同时请求到后端来获取响应,且响应不会被缓存(在1.7.8版本之前是被缓存的)。启用proxy_cache_lock可以应对Dog-pile effect(当某个缓存失效时,同时有大量相同的请求没命中缓存,而同时请求到后端,从而导致后端压力太大,此时限制一个请求去拿即可)。

  proxy_cache_lock_age是1.7.8新添加的,如果在proxy_cache_lock_age指定的时间内(默认为5s),最后一个发送到后端进行新缓存构建的请求还没有完成,则下一个请求将被发送到后端来构建缓存(因为1.7.8版本之后,proxy_cache_lock_timeout超时之后返回的内容是不缓存的,需要下一次请求来构建响应缓存)。

  清理缓存

  有时缓存的内容是错误的,需要手工清理,Nginx企业版提供了purger功能,对于社区版Nginx可以考虑使用ngx_cache_purge(https://github.com/FRiCKLE/ngx_cache_purge)模块进行清理缓存。

  location ~ /purge(/.*) {

  allow 127.0.0.1;

  deny all;

  proxy_cache_purge cache$1$is_args$args;

  }

  该方法要限制其访问权限,如只允许内网可以访问或者需要密码才能访问。

  到此代理层缓存就介绍完了,通过代理层缓存可以解决很多问题,可以参考“第17章 京东商品详情页服务闭环实践”。

<think>首先,用户的问题是:“我想查找在nginx设置缓存大小的方法 请问如何在nginx设置缓存大小”。用户明确要求设置缓存大小的方法。 从系统级指令中,我需要遵循规则:使用行内数学表达式时用$...$,独立公式用$$...$$,使用中文回答,生成相关问题,并在引用的段落末尾添加引用标识如[^1]。同时,回答结构要清晰,帮助用户逐步解决问题。 用户提供了引用内容: - 引用[1]:解释了nginx缓存配置,包括proxy_cache_path指令的参数,其中有proxy_cache_max_size 10g;设置缓存的最大大小。 - 引用[2]:详细描述了fastcgi_cache_path指令的参数,包括max_size定义了缓存的最大大小。 - 引用[3]:提到缓存策略和优化,但没有具体设置大小的细节。 - 引用[4]:讨论了缓存状态,但没有直接设置大小的信息。 用户的问题焦点是设置缓存大小,所以我应该主要参考引用[1]和[2],因为它们直接提到了设置大小的参数。 总结关键点: - 在nginx配置文件中,使用proxy_cache_max_size来设置缓存的最大大小。 - 例如,在引用[1]中:proxy_cache_max_size 10g; 这表示设置缓存最大大小为10GB。 - 在引用[2]中:max_size参数指定缓存的最大大小。 回答结构: 1. **介绍**:简要解释nginx设置缓存大小的概念。 2. **步骤**:逐步指导如何在nginx配置文件中设置缓存大小。 3. **示例**:提供一个配置示例。 4. **注意事项**:提到一些重要点。 5. **验证**:如何验证设置是否生效。 6. **相关问题**:生成相关问题。 使用中文回答。 在引用段落末尾添加引用标识。 生成相关问题。 逐步回答: - 首先,确认用户需求:设置缓存大小。 - 核心指令:在nginx配置中,使用proxy_cache_path指令的max_size参数。 - 配置文件位置:通常在/etc/nginx/nginx.conf或/etc/nginx/conf.d/*.conf。 - 设置步骤: 1. 打开nginx配置文件。 2. 在http块中添加或修改proxy_cache_path指令。 3. 设置max_size参数,如max_size 1g; 表示1GB。 - 示例:基于引用[1]和[2],提供一个代码块示例。 - 注意事项:单位可以是k, m, g;设置时需要重启nginx生效。 - 验证:使用引用[4]中提到的方法,添加header来查看缓存状态。 生成相关问题: - 类似于示例中的格式,生成2-3个相关问题。 完整回答结构: 1. 回答用户问题:如何在nginx设置缓存大小。 2. 提供步骤和示例。 3. 添加引用标识。 4. 最后,列出相关问题。 </think>以下是针对如何在 Nginx设置缓存大小的详细指南,基于您提供的引用内容。我会逐步解释设置方法、关键指令和注意事项,确保回答真实可靠。Nginx 缓存大小主要通过 `proxy_cache_path` 指令的 `max_size` 参数定义(或在某些场景下用 `fastcgi_cache_path`),它指定了缓存目录的最大磁盘占用空间(单位包括 `k`、`m`、`g`)[^1][^2]。 ### 设置 Nginx 缓存大小的步骤 1. **打开 Nginx 配置文件** - Nginx 的主配置文件通常位于 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/` 目录下的自定义文件(如 `cache.conf`)。 - 使用文本编辑器(如 `vim` 或 `nano`)打开文件: ```bash sudo nano /etc/nginx/nginx.conf ``` 2. **在配置文件中定义缓存大小** - 在 `http {}` 块内添加或修改 `proxy_cache_path` 指令,并通过 `max_size` 参数设置缓存最大大小。 - **关键参数说明**: - `levels`:定义缓存目录的层级结构(如 `levels=1:2` 表示一级子目录下包含两级子目录)。 - `keys_zone`:指定共享内存区域(用于存储缓存键的元数据)。 - `inactive`:设置未访问缓存的自动删除时间(如 `inactive=60m` 表示 60 分钟后删除)。 - `max_size`:**核心参数**,定义缓存的最大磁盘大小(例如 `max_size=10g` 表示最大 10GB)。 **配置示例**(基于引用[1]和[2]): ```nginx http { # 设置缓存路径和缓存大小 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=2g; # 其他缓存相关指令... proxy_cache my_cache; proxy_cache_valid 200 304 1h; proxy_cache_lock on; } ``` - **解释**: - `max_size=2g` 将缓存上限设为 2GB。Nginx 会在缓存达到此大小时自动清理老旧文件[^1][^2]。 - 如果需要为 FastCGI 缓存(如 PHP 应用),可用 `fastcgi_cache_path` 代替 `proxy_cache_path`,语法类似[^2]。 3. **保存并重启 Nginx** - 保存配置文件后,测试语法是否正确: ```bash sudo nginx -t ``` - 如果测试通过,重启 Nginx 使配置生效: ```bash sudo systemctl restart nginx ``` ### 注意事项 - **单位选择**:`max_size` 支持 `k`(千字节)、`m`(兆字节)、`g`(吉字节),务必指定单位(如 `max_size=500m`)[^1]。 - **性能影响**:设置过大的 `max_size` 可能导致磁盘空间不足;过小则缓存命中率低。建议根据服务器磁盘容量和应用需求调整(例如,高流量站点可使用 `10g`)[^1][^3]。 - **验证缓存大小设置**: - 添加响应头以检查缓存状态(引用[4]): ```nginx add_header Nginx-Cache $upstream_cache_status; ``` - 访问网站后,查看浏览器开发者工具的“Network”标签,如果 `Nginx-Cache` 显示 `HIT`,表示缓存生效且大小限制被遵守[^4]。 ### 相关问题 如果您需要进一步探索 Nginx 缓存优化,以下是相关问题: 1. 如何监控 Nginx 缓存的使用情况和命中率? 2. Nginx 缓存失效策略有哪些?(例如基于时间或手动清理) 3. 在高并发场景下,如何优化 Nginx 缓存以减少服务器负载? 以上回答基于您提供的引用内容,确保配置准确可靠。如果有具体场景(如静态文件或动态内容),可进一步细化设置方法。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值