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

Cze*_*ace 3 python caching nginx uwsgi

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

proxy_no_cache "1";
proxy_cache_bypass "1";
Run Code Online (Sandbox Code Playgroud)

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

这是我的站点文件:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 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
Run Code Online (Sandbox Code Playgroud)

这是加载的python文件:

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

我知道缓存可以提高性能,所以我打算在生产环境中重新打开它,但是在打开它的情况下进行开发是一件痛苦的事情......我做错了什么?

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

Cze*_*ace 5

解决了

好的,多亏了关豪,我才明白。他对具有“自动重新加载”功能的 Web 框架的评论使我走上了确定 web2py 在修改控制器、模型和视图时如何无缝工作的道路。事实证明,我确实必须在我的更改生效之前重新加载 uwsgi,最后我找到了一种方法(尽管不是最好的),它允许我进行开发而无需/etc/init.d/mysiteapp restart每次进行更改时都发出一个 shell 。根据 uWSGI 文档,存在一个--touch-reload您可以在启动 uWSGI 时指定的标志,该标志将在修改/触摸某个文件时重新加载它。

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
Run Code Online (Sandbox Code Playgroud)

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

- - 更新 - -

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

--py-autoreload 1
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我永远无法在谷歌搜索等中找到答案,但现在我有了完美的解决方案,我不在乎了!请注意,任何使用它的人都应该在生产中删除该标志。