【问题标题】:Python code in Django not recompiling in daemon mode with Apache/mod_wsgiDjango 中的 Python 代码未使用 Apache/mod_wsgi 在守护程序模式下重新编译
【发布时间】:2017-05-20 00:58:52
【问题描述】:

我正在使用 Apache2 和 mod_wsgi 在守护进程模式下运行 Django 应用程序:

WSGIApplicationGroup %{GLOBAL}

WSGIDaemonProcess my_app_process
WSGIScriptAlias /my_app /var/www/my_app/wsgi.py process-group=my_app_process
WSGIScriptReloading On

每当我在服务器上更改我的 Python 代码时(我知道这是非常不鼓励的,但我只是将它用于调试)我总是在重新编译代码时遇到问题,但仅限于子目录中。

应用程序根目录中的 Python 文件(即 settings.py)可以很好地重新编译,但不能重新编译位于子目录中的文件(即某些应用程序的 views.py)。

应用程序目录归www-data用户所有,该用户有足够的权限(用777测试)。

重新启动 Apache 或触摸 wsgi 文件只会导致重新编译应用程序根目录中的 Python 文件。

编辑:

我也尝试添加 WSGIProcessGroup 指令但没有效果:

WSGIApplicationGroup %{GLOBAL}

WSGIDaemonProcess my_app_process processes=2 threads=15
WSGIProcessGroup my_app_process
WSGIScriptAlias /my_app /var/www/my_app/wsgi.py
WSGIScriptReloading On

另外,使用here 提供的代码,我已经得出结论,我实际上是在守护进程模式下运行。

编辑#2

添加了重启后的 Apache 日志:

[Fri Jan 06 12:03:06.309060 2017] [wsgi:warn] [pid 28372:tid 139790316758912] mod_wsgi: Compiled for Python/2.7.8.
[Fri Jan 06 12:03:06.309186 2017] [wsgi:warn] [pid 28372:tid 139790316758912] mod_wsgi: Runtime using Python/2.7.9.
[Fri Jan 06 12:03:06.309876 2017] [wsgi:info] [pid 28375:tid 139790316758912] mod_wsgi (pid=28375): Starting process 'my_app' with uid=33, gid=33 and threads=15.
[Fri Jan 06 12:03:06.310193 2017] [wsgi:info] [pid 28375:tid 139790316758912] mod_wsgi (pid=28375): Initializing Python.
[Fri Jan 06 12:03:06.310246 2017] [wsgi:info] [pid 28376:tid 139790316758912] mod_wsgi (pid=28376): Starting process 'my_app_2' with uid=33, gid=33 and threads=15.
[Fri Jan 06 12:03:06.310531 2017] [wsgi:info] [pid 28377:tid 139790316758912] mod_wsgi (pid=28377): Starting process 'my_app_3' with uid=33, gid=33 and threads=15.
[Fri Jan 06 12:03:06.310607 2017] [wsgi:info] [pid 28376:tid 139790316758912] mod_wsgi (pid=28376): Initializing Python.
[Fri Jan 06 12:03:06.310855 2017] [wsgi:info] [pid 28377:tid 139790316758912] mod_wsgi (pid=28377): Initializing Python.
[Fri Jan 06 12:03:06.311029 2017] [mpm_event:notice] [pid 28372:tid 139790316758912] AH00489: Apache/2.4.10 (Debian) mod_wsgi/4.3.0 Python/2.7.9 configured -- resuming normal operations
[Fri Jan 06 12:03:06.311057 2017] [mpm_event:info] [pid 28372:tid 139790316758912] AH00490: Server built: Sep 15 2016 20:44:43
[Fri Jan 06 12:03:06.311071 2017] [core:notice] [pid 28372:tid 139790316758912] AH00094: Command line: '/usr/sbin/apache2'
[Fri Jan 06 12:03:06.311379 2017] [wsgi:info] [pid 28379:tid 139790316758912] mod_wsgi (pid=28379): Initializing Python.
[Fri Jan 06 12:03:06.311507 2017] [wsgi:info] [pid 28378:tid 139790316758912] mod_wsgi (pid=28378): Initializing Python.
[Fri Jan 06 12:03:06.324667 2017] [wsgi:info] [pid 28377:tid 139790316758912] mod_wsgi (pid=28377): Attach interpreter ''.
[Fri Jan 06 12:03:06.324671 2017] [wsgi:info] [pid 28376:tid 139790316758912] mod_wsgi (pid=28376): Attach interpreter ''.
[Fri Jan 06 12:03:06.324843 2017] [wsgi:info] [pid 28377:tid 139790316758912] mod_wsgi (pid=28377): Adding '/var/anaconda2/lib/python2.7/site-packages' to path.
[Fri Jan 06 12:03:06.324864 2017] [wsgi:info] [pid 28376:tid 139790316758912] mod_wsgi (pid=28376): Adding '/var/anaconda2/lib/python2.7/site-packages' to path.
[Fri Jan 06 12:03:06.324988 2017] [wsgi:info] [pid 28378:tid 139790316758912] mod_wsgi (pid=28378): Attach interpreter ''.
[Fri Jan 06 12:03:06.329741 2017] [wsgi:info] [pid 28379:tid 139790316758912] mod_wsgi (pid=28379): Attach interpreter ''.
[Fri Jan 06 12:03:06.335879 2017] [wsgi:info] [pid 28375:tid 139790316758912] mod_wsgi (pid=28375): Attach interpreter ''.
[Fri Jan 06 12:03:06.336042 2017] [wsgi:info] [pid 28375:tid 139790316758912] mod_wsgi (pid=28375): Adding '/var/anaconda2/lib/python2.7/site-packages' to path.
[Fri Jan 06 12:03:13.598083 2017] [wsgi:info] [pid 28375:tid 139790204262144] [remote 10.6.6.58:512] mod_wsgi (pid=28375, process='my_app', application=''): Loading WSGI script '/var/www/my_app/wsgi.py'.

通过触摸 WSGI 脚本添加了 Apache 日志:

[Fri Jan 06 12:12:28.348075 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Shutdown requested 'my_app'.
[Fri Jan 06 12:12:28.348217 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Stopping process 'my_app'.
[Fri Jan 06 12:12:28.348237 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Destroying interpreters.
[Fri Jan 06 12:12:28.348244 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Cleanup interpreter ''.
[Fri Jan 06 12:12:28.348954 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Terminating Python.
[Fri Jan 06 12:12:28.469333 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Python has shutdown.
[Fri Jan 06 12:12:28.469366 2017] [wsgi:info] [pid 28835:tid 139790316758912] mod_wsgi (pid=28835): Exiting process 'my_app'.
[Fri Jan 06 12:12:29.129042 2017] [wsgi:info] [pid 28372:tid 139790316758912] mod_wsgi (pid=28835): Process 'my_app' has died, deregister and restart it.
[Fri Jan 06 12:12:29.129094 2017] [wsgi:info] [pid 28372:tid 139790316758912] mod_wsgi (pid=28835): Process 'my_app' terminated normally, exit code 0
[Fri Jan 06 12:12:29.129099 2017] [wsgi:info] [pid 28372:tid 139790316758912] mod_wsgi (pid=28835): Process 'my_app' has been deregistered and will no longer be monitored.
[Fri Jan 06 12:12:29.129764 2017] [wsgi:info] [pid 28917:tid 139790316758912] mod_wsgi (pid=28917): Starting process 'my_app' with uid=33, gid=33 and threads=15.
[Fri Jan 06 12:12:29.130173 2017] [wsgi:info] [pid 28917:tid 139790316758912] mod_wsgi (pid=28917): Initializing Python.
[Fri Jan 06 12:12:29.144492 2017] [wsgi:info] [pid 28917:tid 139790316758912] mod_wsgi (pid=28917): Attach interpreter ''.
[Fri Jan 06 12:12:29.144687 2017] [wsgi:info] [pid 28917:tid 139790316758912] mod_wsgi (pid=28917): Adding '/var/anaconda2/lib/python2.7/site-packages' to path.
[Fri Jan 06 12:12:29.147279 2017] [wsgi:info] [pid 28917:tid 139790204262144] [remote 10.6.6.58:512] mod_wsgi (pid=28917, process='my_app', application=''): Loading WSGI script '/var/www/my_app/wsgi.py'.

【问题讨论】:

  • 您能否真正阐明“重新编译”的含义,以便我们知道我们在谈论同一件事。人们通常不会谈论重新编译 Python 代码。您只是在谈论正在重新启动的进程,并且当这种情况发生时它们会加载最新的 Python 代码?或者您是否真的想查看是否从.py 文件生成了更新的.pyc 文件?您是否尝试过删除所有 .pyc 文件?
  • 是的,我说的是实际的 .pyc 文件,当我更改 .py 文件时不会重新生成这些文件。 .pyc 文件即使在删除旧文件后也不会重新生成。这样做甚至不会破坏应用程序,而是在没有 .pyc 文件的情况下顺利运行。似乎旧代码的编译版本仍然缓存在某个地方。
  • 通常在 Apache/mod_wsgi 下,.pyc 文件不会被重新生成,因为用户 Apache 运行您的代码,因为无论如何都没有对目录/文件的写入权限。这很好,因为它们通常是长期存在的进程,所以你从拥有它们中得到的很少,因为它们并不经常加载代码。
  • 从另一个系统复制文件的地方可能会搞砸。如果更新了时间戳,使 .pyc 文件比 .py 文件更新,则 .pyc 文件中的旧代码将始终使用新的时间戳。
  • 简而言之,无论如何,您都不需要 .pyc 文件,因为 Python 只会读取 .py 文件并将其编译为字节码并将其缓存在进程中,直至进程的生命周期。它不像 PHP 在每次请求后都会有效地丢弃代码。由于缓存在进程中,如果进行实时编辑并且您没有强制正确重新加载代码,多进程配置可以看到旧代码仍在某些进程中使用。

标签: python django apache2 mod-wsgi


【解决方案1】:

您似乎缺少WSGIProcessGroup 指令:

https://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html#delegation-to-daemon-process

为托管在 特定站点,WSGIDaemonProcess 和 WSGIProcessGroup 指令 将需要定义。例如,设置一个守护进程组 包含两个可以使用的多线程进程:WSGIDaemonProcess example.com 进程=2 线程=15 WSGIProcessGroup example.com

话虽如此,除非您需要调试的问题特定于您的部署配置,否则您最好在本地使用 builtin dev server

【讨论】:

  • 尝试添加指令但没有效果(见编辑)。
  • Duh...我的 mod_wsgi fu 可能不是最新的,但 应该 可以工作。
  • 您是否尝试将日志级别设置为 info 并查看日志(包括 vhost 日志和主 apache 日志)?
  • 添加了 Apache 日志。我确实有多个应用程序在一个虚拟主机下运行,但根据日志,这应该不是问题,因为每个应用程序都有自己的进程。
【解决方案2】:

由于在嵌入式模式下错误运行,您可能会看到更改,这可能意味着如果使用 prefork MPM,新进程会收到请求。

除了正确设置嵌入模式,这是首选,阅读有关源代码重新加载的文档:

【讨论】:

  • 所有事情都表明我在守护程序模式下正确运行(尝试使用文档中的 WSGI 脚本)。我还使用了blog.dscpl.com.au/2012/10/… 的 WSGI 脚本来确定我很可能在 worker MPM 上运行。 Apache 二进制文件没有提供 MPM 信息。不过,我将进一步阅读有关配置嵌入式模式的信息。
  • 想在嵌入式模式下运行,肯定
猜你喜欢
  • 2012-03-20
  • 2012-10-12
  • 1970-01-01
  • 2013-02-04
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多