专栏首页运维录Nginx 缓存服务器(上)

Nginx 缓存服务器(上)

应用场景

1. 如果你的 web应用支持使用动态CDN(全站)直接加速,那么你可能不需要 Nginx Cache功能。 2. 如果你的 web应用有专用的静态服务器(CDN源站)承担静态文件请求,并配合域名实现动静态分离,那么你可能不需要 Nginx Cache功能。 无论是动态CDN还是静态CDN加速,核心思想都是将静态文件请求压力前置到CDN服务商,减少静态请求压力从而集中火力支撑业务逻辑请求,所谓的术业有专攻如此。 回到Nginx Cache功能上来,如果你的web应用,既不能直接引入动态CDN加速,当前规模也不适合静态CDN加速,但还有一定规模的静态请求压力,那么项目初期 Nginx Cache功能是比较适合的动静态分离方案。

举个例子

以当前非常火python的语言为例(Java Spring Boot框架笑了),开发项目真的非常快捷,使用 pip安装必要的包,引入需要的web框架,最后 python manage.py runserver 项目就上线了(开发同学别激动、请坐下、放下手里的机械键盘,不是针对你而是说好多项目初期就是这么干的,追求简单粗暴有效),开发效率看似上升了但是问题也就随之而来了。

问题

1. 由于框架自带的 web服务器是为了方便开发的而设计的,并不能很好的处理(大量)静态请求,(单页面100+静态请求的项目笑而不语)。

2. 为了方便,而不设置 HTTP Expire过期时间,或者 Cache-Control: max-age最大缓存时间等头部信息,这可能会导致浏览器(没有缓存)频繁发送请求,无形中增加了服务器压力。

目标

1. 配置 nginx 的 cache缓存功能,实现业务系统的动静态分离。 2. 如果上游服务器没有输出 Expires header 则为静态文件设置一个 Expires过期时间 http头。

环境

1. 原有方案

2. 动静分离的方案

配置文件

1. http 字段配置项

http { # ....其它省略 # cache_status log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for $upstream_cache_status $request_time'; access_log /var/log/nginx/access.log access; # cache proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=proxyCache:10m max_size=1g inactive=3d; }

参数 proxy_cache_path 缓存文件路径。 levels 设置缓存文件目录层次;levels=1:2 表示两级目录。 keys_zone 设置缓存名字和 keys_zone 内存大小。 inactive 在指定时间内没有访问则被删除缓存(只是删除key)。 max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

2. server 字段配置项

server { listen 80; server_name localhost; location / { proxy_pass http://demo-web:8080; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_cache proxyCache; proxy_cache_valid 200 206 304 302 1d; proxy_cache_key $uri; # expires 7d; #注意这个选项仅在上游服务器没有设置 Expires头时设置。 } }

# 参数 Proxy_cache proxyCache; 使用名为 proxyCache的对应缓存配置。 proxy_cache_valid 200 206 304 302 7d; 对http状态码为200等 强制缓存1天。 proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取。 proxy_set_header 自定义http header头,用于发送给后端真实服务器。 proxy_pass 代理后端服务器地址(注意是否需要指定路径如 / )。

验证

1. 配置完成后重启nginx,如果不报错则 nginx cache 配置成功。

nginx -t && nginx -s reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 2019/06/13 10:04:51 [notice] 48#48: signal process started

2. 访问的 uri 匹配到 location, 则 nginx cache 生效。 可以通过日志查看缓存状态,自定日志格式中使用了 $upstream_cache_status变量,该变量代表缓存的状态,即命中为HIT、相反则为MISS 。

比如首次访问某个图片 日志中为 MISS状态。

10.42.248.154 - - [13/Jun/2019:09:41:27 +0800] "HEAD /images/a5.png HTTP/1.1" 200 0 "-" "curl/7.52.1" - MISS 0.004

但是 cache 目录已经保存这张图片的副本了。

du -sh /var/cache/nginx/cache/a/02/b29eb500ec85b92fac974af3eb01f02a 28.0K /var/cache/nginx/cache/a/02/b29eb500ec85b92fac974af3eb01f02a

再次访问则命中缓存。

10.42.248.154 - - [13/Jun/2019:09:41:45 +0800] "HEAD /images/a5.png HTTP/1.1" 200 0 "-" "curl/7.52.1" - HIT 0.000

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx 缓存服务器(下)

    上一节讲解了在那些场景下使用 Nginx Cache服务器,以及如何配置、调试 Nginx Cache功能,需要的可以看这里,这一节讲一讲 Nginx Cach...

    用户1560186
  • 如何为 Nginx 添加一个模块?

    这篇文章发布于2013年,介绍如何为nginx添加模块,由于时间久远可能有些内容已经过时,不过"静态添加模块"方法仍然可以使用(从1.9.11版本开始支持loa...

    用户1560186
  • Nginx Porxy反向代理

    我这里有个例子,早期的WEB服务器使用的是HTTP/1.0协议,是不支持keep-alive功能的,为了解决这个问题当时主流的解决方案是使用nginx做反向代理...

    用户1560186
  • Python-并发下载-queue模块

    由于外部网络不稳定,在使用单线程爬取网页数据时,如果有一个网页响应速度慢或者卡住,整个程序都要等待下去。因此,可以使用多线程、多进程、协程技术实现并发下载网页。...

    小团子
  • Nginx 缓存服务器(下)

    上一节讲解了在那些场景下使用 Nginx Cache服务器,以及如何配置、调试 Nginx Cache功能,需要的可以看这里,这一节讲一讲 Nginx Cach...

    用户1560186
  • 浅谈移动支付的安全问题

    移动支付技术真的很安全么?像Google、Apple和Venmo这样的公司,往往都向客户保证“你们的数据绝对是安全完整的”。然而客户们似乎并不买单。 谈谈移动支...

    FB客服
  • 如何查看 Linux 服务器性能参数指标?

    这里只是一些简单的工具查看系统的相关参数,当然很多工具也是通过分析加工 /proc、/sys 下的数据来工作的,而那些更加细致、专业的性能监测和调优,可能还需要...

    lyb-geek
  • Linux 服务器性能出问题,排查下这些参数指标

    一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息。通常来说运维人员、系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十...

    马哥linux运维
  • 服务器病了吗? Linux 服务器的那些性能参数指标

    小小科
  • Linux 服务器性能出问题,排查下这些参数指标

    一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息。通常来说运维人员、系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十...

    小小科

扫码关注云+社区

领取腾讯云代金券