我使用Django 1.10和SQLite作为我的数据库后端。 我有一个运行nginx / uwsgi的站点和上面的配置,我不断用新代码更新。
每次我想更新网站代码时,我都会关闭uwsgi,nginx,git pull
来自我的repo的新版本,然后重新启动uwsgi和nginx。
虽然这是有效的,但是在我的代码的新版本更新网站的意义上,副作用是,如果用户当前登录网站并处理某些事情(通常会产生结果)在修改数据库时,用户的工作将被中断。
更糟糕的是,我的代码的新版本包含迁移,这将改变数据库结构,对用户正在进行的工作产生(不可预测的?)后果。
所以问题是:在决定关闭uwsgi和nginx之前,有没有办法像命令行脚本一样检查db.sqlite3
并查看用户当前是否已登录?
答案 0 :(得分:1)
我会说否。有机会喜欢
我们可以登录未在django_session
表中注销的用户。
答案 1 :(得分:1)
更好的方法是尽量减少停机时间。首先,当您更新代码或uwsgi时,没有理由重新启动nginx,并且git pull
可以$ git pull # pull in new code while the old process is still running
$ python manage.py migrate # run your migrations, and possibly `collectstatic` etc.
$ kill -HUP `cat <pidfile>` # gracefully reload the uwsgi process
而不影响当前运行的代码,因此您不需要在拉动之前停止uwsgi在新的代码中。
在迁移方面,请尽量避免任何会破坏当前正在运行的代码的迁移。例如,不要删除当前代码仍在使用的字段/模型,但要等到下次更新(这些字段/模型不再使用时)。这样,您可以在仍然运行旧代码的同时运行迁移,而不会产生任何错误。
接下来,你应该reload uwsgi进程,而不是手动停止和启动它。这将在重新加载进程之前完成处理任何打开的请求。它还将继续监听新请求,以便在重新加载进程后立即处理这些请求。用户可能会遇到速度减慢,但这不会丢弃任何请求,除非在重新加载进程之前队列已填满。对于小规模的网站,这绝不应该发生。
因此,为了避免停机,您可以使用它来更新您的网站:
NULL