同一虚拟主机上的两个 django 应用程序的间歇性问题
Posted
技术标签:
【中文标题】同一虚拟主机上的两个 django 应用程序的间歇性问题【英文标题】:intermittent problem with two django apps on the same virtual host 【发布时间】:2011-11-20 23:50:02 【问题描述】:我有两个 Django 应用程序(appsystem 和 testapp)在不同的文件夹中运行,它们在同一个 apache 虚拟主机设置中启用(请参阅最后的 conf 文件)。
一个应用程序在域的根目录上显示一个页面,并且该页面似乎总是可以正常工作,但是当我转到应该转到第二个应用程序的 URL 时,它第一次失败并抱怨它找不到尽管我可以在加载正确设置的调试页面中看到数据库表。
如果我刷新页面,那么它 (testapp) 可以正常工作并继续运行,直到我从 appsytem 返回页面。如果我这样做并返回 testapp,我必须刷新页面。
两个应用程序都使用 sqlite 进行身份验证,但从 appsystem 的设置文件中删除身份验证和 sqlite 引用似乎并没有什么不同。
我这样做的原因是因为这个想法是显示根页面(以及一些具有唯一 URL 的管理页面)的应用程序将列出已安装的其他 django 应用程序并显示链接以单击。
我还怀疑它可能与会话相关,因为我可以在另一个浏览器中直接进入 testapp,即使在第一个实例上它也可以正常工作。因此,我确实为每个 django 应用程序赋予了自己的 SESSION_COOKIE_NAME 值,但这似乎没有帮助。
有人知道问题可能是什么吗?
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /app_www_root
RewriteEngine On
# the root of the box should show the system index - a list of installed apps
RewriteRule ^/$ /appsystem/system_index/ [PT]
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /app_www_root/>
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Include /etc/apache2/installed-apps/
## this is what gets pulled in by the include ##
Alias /testapp/static /testapp/static
Alias /testapp/logs /var/log/testapp
WSGIScriptAliasMatch ^/testapp /testapp/django.wsgi
<Directory "/testapp">
Order allow,deny
Allow from all
</Directory>
<Directory "/var/log/testapp">
Order allow,deny
Allow from all
</Directory>
<Location "/testapp/logs">
SetHandler none
Options +Indexes
</Location>
<Location "/testappl/static">
SetHandler none
Options -Indexes
Options +Includes
AddOutputFilter INCLUDES .html
</Location>
## end of included file ##
# wsgi docs advise against trailing slash below
WSGIScriptAlias /appsystem /app_sys/django.wsgi
</VirtualHost>
【问题讨论】:
【参考方案1】:FWIW,你的配置有很多问题。
你为什么要使用 WSGIScriptAliasMatch 指令?您应该将其替换为 WSGIScriptAlias。不要正确使用 WSGIScriptAliasMatch,它会填充反向 URL 解析。
不需要使用“SetHandler none”。这是你可能需要为 mod_python 而不是 mod_wsgi 做的事情。
使用 Location 指令块将指令应用于静态文件资源是不好的做法。您应该使用 Directory 指令将它们应用到特定目录。
正如其他人所指出的,您最好使用守护程序模式。如果这样做有效,但是您将两个应用程序委托给同一个守护程序模式进程,那么您可能会遇到多进程问题,即您的应用程序无法处理同时在多个进程中运行。如果您将每个都委派给自己的守护进程组,那么即使在单独的子解释器中运行它们,您也可能会遇到在同一进程中运行它们的问题。
【讨论】:
【参考方案2】:尝试使用 modwsgi 在 virtualenv 中运行它们。
【讨论】:
【参考方案3】:你读过http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango吗?
我怀疑如果您在守护程序模式下使用 mod_wsgi(即通过 WSGIDaemonProcess),您的问题会得到解决。
【讨论】:
我已经尝试过了,它使得只有第一个应用程序可以有效地看到你只有 appsystem。我可能会尝试给他们自己的虚拟主机 conf 文件,而不是将它们全部包含在一个文件中,看看是否会有所不同。我也不确定这是否可行。 我的错 - 我犯了一个错误。我已经纠正了它,是的,守护进程模式似乎已经修复了它。谢谢!以上是关于同一虚拟主机上的两个 django 应用程序的间歇性问题的主要内容,如果未能解决你的问题,请参考以下文章
如何设置虚拟主机以将同一 IP 上的两个端口指向不同的服务器名称?
django 和 postgres 的间歇性数据库错误:django 有时会尝试查询我几周前删除的数据库
同一 Windows 服务主机上的两个 WCF 服务库之间的通信