【问题标题】:How do you disable caching for an nginx+uwsgi+python server?如何禁用 nginx+uwsgi+python 服务器的缓存?
【发布时间】:2016-06-07 19:23:17
【问题描述】:

我正在尝试专门使用 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),但是它仍然缓存页面。我过去在 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;
    }
}

这是 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 服务:(

【问题讨论】:

    标签: python caching nginx uwsgi


    【解决方案1】:

    已解决

    好的,多亏了关浩,我才弄明白了。他对具有“自动重新加载”功能的 Web 框架的评论使我走上了确定 web2py 在修改控制器、模型和视图时如何无缝工作的道路上。事实证明,我确实必须在我的更改生效之前重新加载 uwsgi,最后我找到了一种方法(虽然不是最好的),它允许我进行开发而不需要 shell 每次我进行更改时发出 /etc/init.d/mysiteapp restart .根据 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
    

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

    --- 更新 ---

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

    --py-autoreload 1
    

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

    【讨论】:

    • web2py 确实具有自动重新加载功能,请在the-core 上搜索auto-reload 并查看实现here。自动重载可以在没有 uwsgi 的帮助下在纯 python 中实现,因此它也可以在其他 wsgi 堆栈中工作,如 gunicorn 等。恕我直言,自动重新加载应仅在开发环境中启用,因此在重新加载期间丢失一些请求是可以的。
    • 我没有使用框架。我只使用 nginx、uwsgi 和(来自示例)单个 3 行 python 文件。不使用框架然后拥有框架的自动重新加载逻辑似乎违反直觉。我想要的解决方案是需要最少的维护和软件膨胀的解决方案。在这种情况下,只需将--py-autoreload 1 添加到执行的命令即可解决。我赞成你的回答...
    【解决方案2】:

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

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

    【讨论】:

    • 我根本没有使用 Web 框架。那么,您的意思是我实际上必须设置类似 incron 作业来监视文件系统的更改并重新启动 uwsgi 吗?这是不可行的,因为请求可能会在服务停止然后再次启动之间到达。我觉得这个答案是错误的,但我没有足够的证据表明事实如此。如果我将更改上传到 web2py 设置,当我刷新页面而无需我进行任何额外操作时,该代码是如何立即反映的?它的“自动重载”功能在哪里?
    • 感谢您的回答,因为它使我朝着正确的方向前进,从而获得了更好的开发方法。详情请看我的回答。
    猜你喜欢
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2013-09-14
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多