3

我在让 Django 使用我的 Apache 配置时遇到了重大问题。我没有创建服务器,所以我对服务器的工作方式没有太多的余地。本质上存在三个虚拟主机:

board.site.org、students.site.org 和 Insider.site.org

Insider.site.org 是我关心的主要网站。我负责它下面的一个小站点(最好是 insider.site.org/tech)。我决定将我的文件与原始目录分开,以免弄乱那里的东西(因为已经有一个非 python 站点)。无论如何,我的虚拟主机是在 /etc/apache2/vhosts.d/ 的单独文件中定义的

这是 insider.site.org 的配置的样子

Insider.conf

LoadModule python_module /usr/lib64/apache2/mod_python.so

<VirtualHost 10.10.1.1:80>
ServerName insider.site.org
DocumentRoot /media/nss/VWEB/docs
   <Directory /media/nss/VWEB/docs>
      Options Indexes Multiviews
      AllowOverride None
      Order Allow,Deny
      #Allow from 10.11.0.78
      Allow from all
   </Directory>

Alias /tech  /srv/www/Tech

   <Directory /srv/www/Tech>
      SetHandler python-program
      PythonPath "['/srv/www/Tech'] + sys.path"
      PythonHandler django.core.handlers.modpython
      SetEnv DJANGO_SETTINGS_MODULE Tech.settings
      PythonDebug On
   </Directory>


Alias /media /srv/www/Media

   <Directory /srv/www/Media>
      SetHandler None
   </Directory>

</VirtualHost>
  • 请注意,当说 site.org 时,我指的是我的网站,而不是实际的“site.org”网址。

现在,这似乎对我来说应该是正确的,但由于某种原因,访问http://insider.site.org/tech/给了我这个错误:

Mod_python 错误:“PythonHandler mod_python.publisher”

回溯(最近一次通话最后):

文件“/usr/lib64/python2.4/site-packages/mod_python/apache.py”,第 299 行,在 HandlerDispatch 结果 = object(req)

文件“/usr/lib64/python2.4/site-packages/mod_python/publisher.py”,第 98 行,在处理程序路径 = [路径])

文件“/usr/lib64/python2.4/site-packages/mod_python/apache.py”,第 454 行,在 import_module f, p, d = imp.find_module(parts[i], path)

ImportError:没有名为索引的模块

http://insider.site.org/tech(没有尾部正斜杠)会导致 403 错误。我在这个目录中确实有 Django,但它根本没有被执行(我在 tech 文件夹下的所有目录中都有 _ init _.py,这是我自己的个人计算机的副本(它从 django 中运行)测试服务器))所以我认为这不是问题。这根本行不通:-(

任何帮助表示赞赏,谢谢。

4

3 回答 3

2

对于您的第一个问题,您确定在您指定的 PythonPath 中有 Django 吗?在我的服务器上,我的 PythonPath 中的列表包括包含顶级 django 目录的目录,该目录本身包含 bin、contrib、admin、core 等目录,此外还有 __init__.py。(还要确保您的 Apache 用户对这些文件和目录具有读取和执行权限,尽管我确信这很明显。)这是我的设置:

<Location "/myapp">
   SetHandler python-program
   PythonHandler django.core.handlers.modpython
   SetEnv DJANGO_SETTINGS_MODULE LogFileAnalyzer.settings
   PythonDebug on
   PythonPath "['/srv/www/dir_containing_django_dir', '/srv/www/myapp_dir'] + sys.path"
</Location>

请注意,我在这里使用位置而不是目录,因此您的里程可能会有所不同。

对于您的第二个问题,这听起来像是 mod_rewrite 的问题。见这里。您可以通过定义重写规则让服务器自动附加您需要的斜线:

RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo$  foo/  [R]

希望有帮助。

于 2009-02-24T18:43:01.353 回答
1

Alias /tech /srv/www/Tech 应删除,并 <Directory /srv/www/Tech>应转换为位置。

请记住,您并不是要让 Apache 提供您的 Python 文件,而是告诉它在到达特定位置时启动某个 Python 进程。

另外,我是否可以建议您使用子域,而不是将 Django 应用程序放在主域的“文件夹”中。在我看来,它倾向于简化事情。

也供您考虑的是mod_wsgi。我最近开始将它用于我的 Django 应用程序,它们在性能和稳定性方面取得了巨大的飞跃:)

于 2009-03-05T08:31:06.633 回答
0

可能对 mod_python 问题没有帮助,但实际上,mod_python 是部署 Django 的最差方式(实际上是部署任何类型 Python 的最差方式)。

请考虑至少使用 mod_wsgi,它对性能和其他一些原因更好。此外,您将在 freenode 上的#django 上获得该 mod 开发人员的出色支持。

Spawning/FastCGI 甚至更好,因为您根本不用 Apache。

于 2009-03-05T13:21:07.137 回答