nginx+uwsgi+django,uwsgi中似乎存在一些奇怪的缓存,请帮助我。

4
这是uwsgi配置文件的内容:
[uwsgi]  
uid = 500
listen=200
master = true  
profiler = true 
processes = 8 
logdate = true  
socket = 127.0.0.1:8000  
module = www.wsgi  
pythonpath = /root/www/
pythonpath = /root/www/www 
pidfile = /root/www/www.pid  
daemonize = /root/www/www.log  
enable-threads = true
memory-report = true
limit-as = 6048

这是Nginx配置:

server{  
    listen 80;  
    server_name 119.254.35.221;      
    location / {  
        uwsgi_pass 127.0.0.1:8000;  
        include uwsgi_params;  
    }  
}

django工作正常,但修改后的页面除非我重启uwsgi才能看到。(此外,由于我配置了8个工作进程,当我按下ctrl+f5一段时间后,就可以看到修改后的页面,似乎只有某些工作进程能读取并响应修改后的页面,而其他进程则只显示旧页面。谁缓存了旧页面?我没有配置任何关于缓存的内容。)
我没有配置django,在使用“python manager runserver…”时运行良好,但在与nginx+uwsgi配合使用时出现问题。
(nginx和uwsgi都是新安装的,我确定这里没有进行其他配置。)

这是期望的行为,Apache(例如在嵌入式模式下)行为类似。 - Tadeck
2个回答

5
  • uwsgi不会自动重新加载您的代码,只有开发服务器才会
  • runserver用于调试目的,uwsgi和nginx用于生产环境
  • 在生产环境中,您可以通过service uwsgi restart或通过init.d脚本重新启动uwsgi
  • 甚至可以通过使用touch-reload来更好地重新加载uwsgi

通常情况下不需要清理.pyc文件,这只会在文件时间戳错误时发生(在我整个职业生涯中只看到过几次)


我使用的是uwsgi-emperor而不是uwsgi守护进程,因此我必须发出sudo service uwsgi-emperor reload命令。不过,我选择只在开发环境中使用manage.py runserver,因为它是专门为这种用途构建的。 - ThorSummoner

1

这是正常的行为。uwsgi不会重新读取您的代码,除非您重新启动它(它不像runserver在您有DEBUG=True时工作)。

如果在您更新了代码、重启了uwsgi、清除了浏览器缓存后,仍然没有反映您的更改,则应从源目录中删除*.pyc文件。

我通常使用以下命令:

find . -name "*.pyc" -exec rm {} \;

粗略地说,.pyc 是您的代码的“编译”版本。如果 Python 没有检测到源文件发生更改,它将加载此优化版本。如果您删除这些文件,则它将重新读取您的源文件。

非常感谢您的帮助!在开发和调试项目时,我应该使用manager.py吗? - liangdong from baidu
请仅使用uwsgi+nginx进行部署,runserver仅用于开发。 - Burhan Khalid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接