nginx为uwsgi服务做缓存的配置方法

Posted 404沙盒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx为uwsgi服务做缓存的配置方法相关的知识,希望对你有一定的参考价值。

概述

随着互联网用户的增加,绝大部分互联网应用对并发量和响应速度都有比较高的要求。说到响应速度就离不开缓存,缓存又有客户端缓存与服务端缓存之分,本文介绍的是服务端缓存。网上搜索到的使用nginx为uwsgi服务接口进行缓存的资料比较少,搜索到的大部分都是使用nginx为http服务或者是静态资源的缓存,或者在应用代码中加入redis、memcached等实现缓存。这里基于nginx(v1.15.2)+uwsgi+python的实践环境,介绍如何使用nginx作为python后端应用缓存,主要从以下几方面进行讲述:

1. 为什么使用nginx作为缓存层,而不是在应用层实现缓存? 2. nginx中如何配置 3. 注意事项与实践思考

缓存为什么设置在nginx层

设置缓存是必要的,这里就说说为什么将一些请求的缓存设置在nginx层,而不是服务应用层。理由如下:

  1. 一般来说,nginx作为代理服务器的角色,把缓存设置在nginx中,在命中缓存的情况下,可以节约一次请求转发的时间。

  2. nginx本身使用C语言实现,比一般的语言尤其是动态语言(python等)的性能要高。因此nginx读取缓存的速度要比后端应用读取的速度快。

  3. 历史项目中没有引入缓存,在nginx中加缓存配置比写应用代码来得快。

当然, 需要由应用鉴定用户权限的接口并不适合把缓存设置在nginx层

配置方法

nginx可以代理的服务协议有多种(比如 httpuwsgifastcgi), 这里以uwsgi协议的配置作为例子,其他协议的基本是把配置指令中 cache前面的 uwsgi替换为协议对应的文字即可(比如 http 对应 proxy, fastcgi 对应 fastcgi)。 这里先上一个基本的配置文件,然后对关键的配置指令逐一讲述它的配置方法及作用。

 
   
   
 
  1. http {

  2.    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

  3.                      '$status $body_bytes_sent "$http_referer" '

  4.                      '"$http_user_agent" "$http_x_forwarded_for" "$http_x_forwarded_for" "$request_time" "$upstream_response_time"';


  5.    access_log  /var/log/nginx/access.log  main;


  6.    # 缓存相关

  7.    uwsgi_cache_path /tmp/nginx keys_zone=myapp:128m levels=1:2 inactive=24h;



  8.    # HTTPS server

  9.    server {

  10.        listen       80;

  11.        server_name  www.example.com;


  12.        location ~* /cache_api/ {

  13.            uwsgi_pass  unix:/sock/myapp.sock;


  14.            # 以下指令与缓存相关

  15.            add_header  Nginx-Cache "$upstream_cache_status";

  16.            uwsgi_cache_valid 200 36h;

  17.            uwsgi_cache_key $request_method$request_uri$args;

  18.            uwsgi_cache_use_stale timeout http_500 http_503;

  19.            uwsgi_cache myapp;


  20.            uwsgi_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

  21.            uwsgi_ignore_client_abort on;

  22.        }

  23.    }

  24. }

以上配置文件中,有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中可以为不同的接口配置不同的空间。

由于nginx的灵活与强大,且本人水平有限,这里只提及了nginx最基本的缓存配置方法,更为具体全面的请参阅官方文档 。

注意事项

说了基本配置,接着说一些值得注意的地方

uwsgi_cache_key的设置key可以使用nginx中的变量满足各种复杂情况,但是建议不要设置得过于复杂,满足业务需求即可,因为越复杂命中率越低。如果加入了用户的cookie作为key,就是基于用户的缓存,只有同一个用户再次发起相同请求时才会命中,命中率很低。

uwsgi_cache_valid的设置这个指令一定要配置合理,否则可能会缓存400等响应内容。除了200状态码之外,也可以根据需要为其他状态码的响应进行缓存,但是缓存时间应该短一点。比如为302的响应内容缓存10s。

实践优化

  1. 在生产实践中还可以接口的响应内容、接口的使用频率、接口内容的更新时间等设置更合理的过期时间、缓存空间等。可以将使用频率高、响应内容庞大的接口单独划分缓存空间。

  2. 借助日志分析命中率。可以在nginx的请求日志中加入命中状态变量 upstream_cache_status,收集日志进行统计。


以上是关于nginx为uwsgi服务做缓存的配置方法的主要内容,如果未能解决你的问题,请参考以下文章

uwsgi服务静态文件的Nginx缓存

Django和uwsgi,配合nginx做静态缓存

nginx 与 uWsgi 详解

nginx django 升级代码不重启服务的方法

python+宝塔nginx+uwsgi的搭建方法

64. Django 2 生产环境部署 uwsgi nginx