内容简介:随着互联网用户的增加,绝大部分互联网应用对并发量和响应速度都有比较高的要求。说到响应速度就离不开缓存,缓存又有客户端缓存与服务端缓存之分,本文介绍的是服务端缓存。网上搜索到的使用nginx为uwsgi服务接口进行缓存的资料比较少,搜索到的大部分都是使用nginx为http服务或者是静态资源的缓存,或者在应用代码中加入redis、memcached等实现缓存。这里基于nginx(v1.15.2)+uwsgi+python的实践环境,介绍如何使用nginx作为python后端应用缓存,主要从以下几方面进行讲述:
概述
随着互联网用户的增加,绝大部分互联网应用对并发量和响应速度都有比较高的要求。说到响应速度就离不开缓存,缓存又有客户端缓存与服务端缓存之分,本文介绍的是服务端缓存。网上搜索到的使用nginx为uwsgi服务接口进行缓存的资料比较少,搜索到的大部分都是使用nginx为http服务或者是静态资源的缓存,或者在应用代码中加入 redis 、 memcached 等实现缓存。这里基于nginx(v1.15.2)+uwsgi+python的实践环境,介绍如何使用nginx作为 python 后端应用缓存,主要从以下几方面进行讲述:
1. 为什么使用nginx作为缓存层,而不是在应用层实现缓存?
2. nginx中如何配置
3. 注意事项与实践思考
缓存为什么设置在nginx层
设置缓存是必要的,这里就说说为什么将一些请求的缓存设置在nginx层,而不是服务应用层。理由如下:
一般来说,nginx作为代理服务器的角色,把缓存设置在nginx中,在命中缓存的情况下,可以节约一次请求转发的时间。
nginx本身使用 C语言 实现,比一般的语言尤其是动态语言(python等)的性能要高。因此nginx读取缓存的速度要比后端应用读取的速度快。
历史项目中没有引入缓存,在nginx中加缓存配置比写应用代码来得快。
当然, 需要由应用鉴定用户权限的接口并不适合把缓存设置在nginx层
配置方法
nginx可以代理的服务协议有多种(比如 http, uwsgi, fastcgi), 这里以uwsgi协议的配置作为例子,其他协议的基本是把配置指令中 cache前面的 uwsgi替换为协议对应的文字即可(比如 http 对应 proxy, fastcgi 对应 fastcgi)。这里先上一个基本的配置文件,然后对关键的配置指令逐一讲述它的配置方法及作用。
以上配置文件中,有cache字样的都是与缓存相关的配置指令。它们的作用及配置方法如下:
1.uwsgi_cache_path,配置缓存内容存放的位置、命名以及目录的分配方式。 /tmp/nginx是缓存文件存放的位置; keys_zone对应的值是缓存空间的名字及大小,此处名字是 myapp, 大小是128M; levels参数是设置缓存文件所存放的子目录,这里1:2的意思是取缓存key(下文将要讲到的 uwsgi_cache_key)的MD5值倒数第一个字母为1级目录,倒数第二第三个字母为二级目录,在上述配置中key的MD5值为 4897858cede04cdd6676d87fd9e9163e的缓存会落在 /tmp/nginx/e/63目录上;inactive参数是指多长时间不被命中时,该缓存内容会被删除,这里是24小时没有命中则删除。除了这里提及的参数外,还有其他可选参数,见官方文档 。
2.add_header Nginx-Cache "$upstream_cache_status",不建议在生产环境中加入这一行配置,该配置是设置一个响应头标志缓存命中状态,用于调试。
3.uwsgi_cache_valid 200 36h,该指令配置缓存哪些状态码的请求及缓存时间。这里仅当响应状态码为200时进行缓存, 缓存36小时。
4.uwsgi_cache_key $request_method_$request_uri$args,设置缓存的key,这里设置为请求方法+请求uri+参数,可以根据需要使用nginx提供的其他变量。
5.uwsgi_cache_use_stale timeout http_500 http_503,该指令用于配置后端应用出现哪种情况时,可以使用过期的缓存内容。
6.uwsgi_cache myapp,设置使用的缓存空间名字,与 uwsgi_cache_path中的keyszone相对应。该指令支持的上下文有 http、 server和 location, 写在 location中可以为不同的接口配置不同的空间。
注意事项
说了基本配置,接着说一些值得注意的地方
uwsgi_cache_key的设置key可以使用nginx中的变量满足各种复杂情况,但是建议不要设置得过于复杂,满足业务需求即可,因为越复杂命中率越低。如果加入了用户的cookie作为key,就是基于用户的缓存,只有同一个用户再次发起相同请求时才会命中,命中率很低。
uwsgi_cache_valid的设置这个指令一定要配置合理,否则可能会缓存400等响应内容。除了200状态码之外,也可以根据需要为其他状态码的响应进行缓存,但是缓存时间应该短一点。比如为302的响应内容缓存10s。
实践优化
在生产实践中还可以接口的响应内容、接口的使用频率、接口内容的更新时间等设置更合理的过期时间、缓存空间等。可以将使用频率高、响应内容庞大的接口单独划分缓存空间。
借助日志分析命中率。可以在nginx的请求日志中加入命中状态变量 upstream_cache_status,收集日志进行统计。
以上所述就是小编给大家介绍的《Nginx为uwsgi服务做缓存的配置方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Nginx 内容缓存及常见参数配置
- 深入探索 Android Gradle 插件的缓存配置
- RXThinkCMF_TP6 v2.9.3 旗舰版发布,增强底层缓存功能,可动态配置模块缓存
- gcs v0.1.1 加入接口缓存,Go 配置管理平台
- Spring boot学习(八)Spring boot配置ehcache缓存框架
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Computation and Programming Using Python
John V. Guttag / The MIT Press / 2013-7 / USD 25.00
This book introduces students with little or no prior programming experience to the art of computational problem solving using Python and various Python libraries, including PyLab. It provides student......一起来看看 《Introduction to Computation and Programming Using Python》 这本书的介绍吧!