概述随着互联网用户的增多,大多数互联网应用对并发量和响应速度的要求都比较高。说到响应速度,就离不开缓存。缓存可以分为客户端缓存和服务器缓存。本文介绍服务器缓存。网上使用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值最后一个字母为一级目录,二级目录-to-last第三个字母是二级目录。上述配置中,key的MD5值为4897858cede04cdd6676d87fd9e9163e,缓存会落在/tmp/nginx/e/63目录下;inactive参数是指缓存内容在没有被黑的情况下多久会被删除,这里如果24小时没有被黑就删除。除了这里提到的参数外,还有其他可选参数,参见官方文档。2.add_headerNginx-Cache"$upstream_cache_status",生产环境不建议加上这行配置。这个配置是为了调试设置一个响应头标志缓存***状态。3.uwsgi_cache_valid20036h,这条命令配置哪些状态码请求缓存,缓存时间。这里只有当响应状态码为200时,缓存才会缓存36小时。4.uwsgi_cache_key$request_method_$request_uri$args,设置缓存的key,这里设置为请求方法+请求uri+参数,可以根据需要使用nginx提供的其他变量。5.uwsgi_cache_use_staletimeouthttp_500http_503,该命令用于配置后端应用使用过期的缓存内容。6.uwsgi_cachemyapp,设置使用的缓存空间名称,对应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来收集日志进行统计。
