如何禁用 nginx+uwsgi+python 服务器的缓存?
How do you disable caching for an nginx+uwsgi+python server?
我正在尝试开发一个完全使用 nginx、uwsgi 和 python 的全新网站。问题是,如果我更改 uwsgi 指向的文件并刷新页面,我会得到文件的先前版本生成的 HTML。似乎 nginx、uwsgi 或两者都在缓存我站点的代码 and/or 响应。我一直在阅读 uwsgi 缓存,但无法使用 --cache2
标志和 --cache_*
标志禁用缓存。我找到 this other question 并尝试使用
proxy_no_cache "1";
proxy_cache_bypass "1";
在服务器的位置字典中(位于 /etc/nginx/sites-available/mysite),但是它仍然缓存页面。我过去曾将 web2py 与 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 服务:(
这不是缓存。在对 python 个文件所做的更改生效之前,您必须重新启动 uwsgi。
您还可以启用网络框架(web2py 或其他)的自动重新加载功能。在这种情况下,wsgi 应用程序会在检测到文件更改时自行重新加载,因此您无需重新启动 uwsgi。
已解决
好的,多亏了管豪,我搞定了。他对具有“自动重新加载”功能的 Web 框架的评论使我走上了确定 web2py 在修改控制器、模型和视图时如何无缝工作的道路。事实证明,我必须在我的更改生效之前重新加载 uwsgi,最后我找到了一种方法(虽然不是最好的)允许我进行开发而不需要 shell 来发出 /etc/init.d/mysiteapp restart
每次我做出改变。根据 uWSGI 文档,存在一个 --touch-reload
标志,您可以在启动 uWSGI 时指定它,当某个文件为 modified/touched.
时将重新加载它
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
的文件,当我上传更改时,我也只是上传该文件(在最后)。它完美无缺!谢谢你的提示!我还有两天时间可以接受我自己的答案,所以如果有人有比这个更好的方法,请随时 post 吧。
---更新---
事实证明,还有更好的方法!我偶然发现 this question 有一个未被接受的答案,它完全解决了这个问题(到目前为止)。使用这种方法,我什至不必触摸 reload
文件。我只是在init.d脚本中执行时给uwsgi添加了以下标志和参数:
--py-autoreload 1
我不确定为什么我在 Google 搜索中找不到答案等等,但现在我有了完美的解决方案,我就不在乎了!请注意,任何使用它的人,您应该在生产中删除该标志。
我正在尝试开发一个完全使用 nginx、uwsgi 和 python 的全新网站。问题是,如果我更改 uwsgi 指向的文件并刷新页面,我会得到文件的先前版本生成的 HTML。似乎 nginx、uwsgi 或两者都在缓存我站点的代码 and/or 响应。我一直在阅读 uwsgi 缓存,但无法使用 --cache2
标志和 --cache_*
标志禁用缓存。我找到 this other question 并尝试使用
proxy_no_cache "1";
proxy_cache_bypass "1";
在服务器的位置字典中(位于 /etc/nginx/sites-available/mysite),但是它仍然缓存页面。我过去曾将 web2py 与 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 服务:(
这不是缓存。在对 python 个文件所做的更改生效之前,您必须重新启动 uwsgi。
您还可以启用网络框架(web2py 或其他)的自动重新加载功能。在这种情况下,wsgi 应用程序会在检测到文件更改时自行重新加载,因此您无需重新启动 uwsgi。
已解决
好的,多亏了管豪,我搞定了。他对具有“自动重新加载”功能的 Web 框架的评论使我走上了确定 web2py 在修改控制器、模型和视图时如何无缝工作的道路。事实证明,我必须在我的更改生效之前重新加载 uwsgi,最后我找到了一种方法(虽然不是最好的)允许我进行开发而不需要 shell 来发出 /etc/init.d/mysiteapp restart
每次我做出改变。根据 uWSGI 文档,存在一个 --touch-reload
标志,您可以在启动 uWSGI 时指定它,当某个文件为 modified/touched.
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
的文件,当我上传更改时,我也只是上传该文件(在最后)。它完美无缺!谢谢你的提示!我还有两天时间可以接受我自己的答案,所以如果有人有比这个更好的方法,请随时 post 吧。
---更新---
事实证明,还有更好的方法!我偶然发现 this question 有一个未被接受的答案,它完全解决了这个问题(到目前为止)。使用这种方法,我什至不必触摸 reload
文件。我只是在init.d脚本中执行时给uwsgi添加了以下标志和参数:
--py-autoreload 1
我不确定为什么我在 Google 搜索中找不到答案等等,但现在我有了完美的解决方案,我就不在乎了!请注意,任何使用它的人,您应该在生产中删除该标志。