如何禁用nginx + uwsgi + python服务器的缓存?

时间:2016-02-25 06:43:36

标签: python caching nginx uwsgi

我正在尝试使用专门的nginx,uwsgi和python来开发一个全新的网站。问题是,如果我更改uwsgi指向的文件并刷新页面,我将获得该文件的先前版本生成的HTML。似乎nginx,uwsgi或两者都在缓存我的网站的代码和/或响应。我一直在阅读uwsgi缓存,但无法使用--cache2标志和--cache_*标志禁用缓存。我找到this other question并尝试使用

proxy_no_cache "1";
proxy_cache_bypass "1";

在服务器的位置字典中(位于/ etc / nginx / sites-available / mysite),但是它仍然缓存页面。我过去使用过net2py和nginx以及uwsgi,当我更新控制器或视图时它似乎没有这个问题。

这是我的网站文件:

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 
    listen 443 ssl default_server; 
    listen [::]:443 ssl default_server; 
    include snippets/snakeoil.conf; 
    server_name _; 
    location / {
        include uwsgi_params; 
        uwsgi_pass 127.0.0.1:3031;
    }
}

这是init.d脚本使用的执行程序:

uwsgi --master --processes 4 --threads 2 --die-on-term -s /tmp/mysock.sock --socket :3031 --uid www-data --gid www-data --vacuum --wsgi-file /path/to/my/python/file.py

这是加载的python文件:

def application(environ, start_response): 
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<h1>Hello World</h1>"]

我知道缓存提高了性能,因此我打算将其重新打开以用于生产环境,但是开启它的开发是一个痛苦的屁股......我做错了什么?

我现在唯一的解决方法是每次进行更改时重启uwsgi服务:(

2 个答案:

答案 0 :(得分:4)

解决

好吧,我知道感谢关浩。他对网络框架的评论有一个&#34;自动重载&#34;功能设置让我了解在修改控制器,模型和视图时如何无缝地工作web2py的路径。事实证明,我必须在我的更改生效之前重新加载uwsgi,最后我找到了一个方法(虽然不是最好的),它允许我进行开发,而不需要shell每次都发出/etc/init.d/mysiteapp restart做出改变。根据uWSGI文档,在启动uWSGI时可以指定--touch-reload标志,当修改/触摸某个文件时,该标志将重新加载它。

touch-reload
argument: required_argument
parser: uwsgi_opt_add_string_list
flags: UWSGI_OPT_MASTER
help: reload uWSGI if the specified file is modified/touched

我只是将标志的参数设置为位于网站根目录中的名为reload的文件,当我上传更改时,我也只是上传该文件(最后)。它完美无瑕!谢谢你的提示!我有两天时间可以接受自己的答案,所以如果有人有比这个更好的方法,请随时发布。

---更新---

事实证明,有一种更好的方法可以做到这一点!我偶然发现this question有一个未经接受的答案,完全解决了这个问题(到目前为止)。使用这种方法,我甚至不必触摸reload文件。在init.d脚本中执行时,我只是将以下标志和参数添加到uwsgi中:

--py-autoreload 1

我不确定为什么我无法在Google搜索中找到答案等等,但是我现在可以不在乎我拥有完美的解决方案!请注意,使用此功能的任何人都应该删除生产中的标志。

答案 1 :(得分:1)

它没有缓存。在对python文件所做的更改生效之前,必须重新启动uwsgi。

您还可以启用Web框架的自动重新加载功能(web2py或其他)。在这种情况下,wsgi应用程序会在检测到文件更改时重新加载,因此您不需要重新启动uwsgi。