我正在尝试使用专门的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服务:(
答案 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。