【发布时间】:2015-07-14 23:22:59
【问题描述】:
问题总结
我正在尝试在运行它的服务器上更新 Django 应用程序代码。我已经上传了更新的代码(.py 文件),但更新的代码没有显示在应用程序的行为中。我已经尝试了几次尝试来解决这个问题。我将在下面介绍这些尝试,希望这将有助于诊断我需要做什么。
以下是有关应用程序的一些其他详细信息,可帮助您了解问题的背景。
我不是编写应用程序的开发人员,我受雇负责维护和更新。遗憾的是,没有给出任何文档,也很少有代码注释。
说到 Django,我还是有点青涩。
此问题发生在生产服务器上,因此必须注意尽量减少停机时间。由于上述两个原因,我不完全相信如果服务器出现故障我可以重新启动服务器。
Django 版本:1.7
正在使用的服务器:gunicorn + nginx
应用程序的工作方式很简单。用户下订单,这会触发要发送的电子邮件。我改的代码也很简单。一个额外的 html 段落被添加到包含电子邮件内容的字符串中。测试应用程序时,不会添加此新字符串。代码没有更新。
应用程序的目录结构
我将应用程序名称替换为 appname
根文件夹
appname
py2_appname
staticfiles
py2_appname
这包含包含的包和二进制文件
bin
include
lib
local
应用名称文件夹
这包含应用程序代码
├── accounts
│ └── migrations
├── admin_keys
├── emails
├── errors
│ └── migrations
├── main_site
│ └── migrations
├── appname
│ └── __pycache__
├── appname_admin
│ └── migrations
├── promotions
│ └── migrations
├── signaling
│ ├── migrations
│ └── templates
│ └── signal_email
├── static
│ ├── css
│ ├── fonts
│ ├── images
│ │ ├── email
│ │ ├── main
│ │ └── thumbnails
│ └── js
│ └── locales
├── templates
│ ├── accounts
│ ├── errors
│ ├── _layouts
│ ├── mainsite
│ ├── appname_admin
│ └── test
└── testing
└── migrations
我已经做了一些尝试来解决这个问题。
-
删除原来的编译文件。当执行生成电子邮件的脚本时,这将强制生成一个新的。这没有发生。未创建新的 .pyc 文件。该应用程序仍然像往常一样运行。这似乎暗示它缓存在某处的执行代码。
Here are the original files: -rw-r--r-- 1 ubuntu ubuntu 47872 Jul 13 04:39 admin_email.py -rw-r--r-- 1 root root 48212 Feb 10 03:12 admin_email.pyc 另一个建议是通过执行以下命令来修改应用程序 wsgi 文件的最后修改元字段: touch 。这会将上次修改时间更新为当前时间,但文件内容保持不变。这不起作用,但也许我没有更新正确的文件。我正在更新的文件名为:wsgi.py。它位于 appname 文件夹中(见上文)
这里是wsgi.py的内容
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "appname.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
在同样位于appname文件夹的settings.py文件中,只有一行代码提到了wsgi:
WSGI_APPLICATION = 'appname.wsgi.application'
这是应用触摸以便我的服务器应用代码更改的正确文件吗?
- 重新启动服务器。这还没有尝试过。如上所述,这是一个生产服务器。如果应用程序出现故障,我不确定是否可以正确启动应用程序。也许有人可以就此提供建议。以下是有关服务器和应用程序的更多信息:
服务器上运行的进程(来自 ps -aux,命令列)
/path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
/path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
/path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
/path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
nginx: master process /usr/sbin/nginx
nginx: worker process
nginx: worker process
nginx: worker process
nginx: worker process
请注意 gunicorn 是从 py2_appname 运行的。这是一个比 appname 高一级的文件夹,其中包含应用程序中使用的二进制文件。
【问题讨论】:
-
通过重新启动服务器...您是否重新启动了 gunicorn?我在 uwsgi 上工作,更新代码后,我需要重新启动服务器。
-
是的,如果有任何关于如何重新启动
gunicorn的建议,我将不胜感激。我希望这将更新应用程序的工作方式。请注意上面显示的gunicorn进程。如果我需要重新启动,我希望能够运行相同的进程。由于这是一个 prod 服务器,我希望 100% 确定我能够正确重启。 -
另外,检查主管supervisord.org/configuration.html 你应该可以从那里重新启动进程
-
好吧,也许这个命令正是
ps: /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3显示的内容