Nginx-uwsgi服务器缓存无法清除问题的研究和解决办法

4246 人浏览 | 时间: 2018-05-18 10:59:51 | 作者: codexia

    在用python的webpy写web应用时,为了加速后台的数据的渲染,开发了一个缓存库。但是上线测试的效果却不尽如人意,表现是:接口返回的结果在几个不同的数据里轮流切换。
    之前一直以为是Nginx的缓存。研究了很久,发现并不是nginx的缓存。因为nginx上并没有配置缓存选项。今天怀疑到uwsgi头上了。然后尝试让uwsgi独立监控端口再进行访问,发现并不能访问,可能我装的uwsgi只是nginx的插件,并不能直接运作吧。
    我继续跟踪uwsgi的日志,看看日志的访问情况如何。试着刷新了一个页面几次,把访问日志导出来对比一看,发现缓存确实是有作用的,几次的数据没有变化,达到了效果。但是当第四次刷页面的时候,数据变化了。没有变化的时候,响应速度很快,而变化了的时候响应速度降低了10倍。
    看着4次请求,3次缓存起作用了,1次没有起作用,让我想起了uwsgi里面有一个配置工作进程的参数,我配置了4个。我尝试着将uwsgi的工作进程配置为1个,再尝试刷新,此时不管怎么刷新,数据都是一样的,我在代码里设置缓存有效期是一天,自然是不会变化的。最终找到了根本问题。
    uwsgi的配置了4个工作进,如果请求太频繁,以至于当前工作进程一下子处理不过来就会启用第2个进程。而第2个进程并没有缓存内容,所以就重新渲染了一下,所以数据就变了。为什么第2个进程没有缓存内容呢?
    我们在设置缓存的时候,都是内存缓存。内存缓存都是相对于进程来讲的。也就是说,在当前进程添加的缓存内容,只有当前进程可以看到,对于其他进程就看不到了。所以第2个进程自然是没有缓存内容的,此时就需要重新渲染来输出了。
    而此前在调试时经常发现4种数据结果轮流上阵,让人摸不着头脑。开始以为是Nginx缓存,所以没次重启一下nginx和uwsgi就解决了。而这次发现问题,还以为是python写的缓存库有问题,不过在本地上测试时缓存是正常有效的,而放在服务器里就不正常。所以才怀疑配置问题。Nginx对于动态请求,我都转发给了uwsgi处理,nginx也没有做缓存设置,那么所有问题都指向了uwsgi。查了很多资料,发现uwsgi并没有关闭缓存的资料,只看到设置缓存的资料。那么很可能是不设置缓存应该就是没有启用缓存。然后问题一直还存在,刚好就是4次请求让我想到了uwsgi的4个工作进程,这才找到了根本问题。不仅如此,连带之前的各种假缓存问题,都找到了根本原因。简单来说就是,uwsgi的多进程的缓存不一致的问题。只需要将uwsgi的工作进程设置为1个就可以消除问题了。

请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

相关阅读