【发布时间】: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