1

我有一些小型 django 项目与 apache 和 mod_wsgi 在同一台服务器上工作。我用虚拟环境安装了另一个项目,并在 Apache conf 文件中为其设置了设置:

<VirtualHost XXX.XXX.XXX.XXX:81 >
    ServerName mywebsite.com
    CustomLog /var/www/httpd-logs/mywebsite.com.access.log combined
    DocumentRoot /var/www/empirik/data/www/mywebsite.com
    ErrorLog /var/www/httpd-logs/mywebsite.com.error.log
    ServerAlias www.mywebsite.com
    SuexecUserGroup empirik empirik

    WSGIScriptAlias / /var/www/empirik/data/www/mywebsite.com/myproject/wsgi.py
    WSGIDaemonProcess mywebsite.com python-path=/var/www/empirik/data/www/mywebsite.com/env/lib/python2.7/site-packages

    <Directory /var/www/empirik/data/www/mywebsite.com/myproject>
        Order deny,allow
        Allow from All
    </Directory>

    <Directory /var/www/empirik/data/www/mywebsite.com/myproject/static>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

当我尝试加载网站服务器时,大约 50% 的时间返回 500 错误或另一个网站的内容,并且 apache 日志文件中有一些我无法理解的奇怪错误,因为它试图加载另一个网站的项目设置:

[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] mod_wsgi (pid=32361): Exception occurred processing WSGI script '/var/www/empirik/data/www/mywebsite.com/myproject/wsgi.py'.
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] Traceback (most recent call last):
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self.load_middleware()
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self._setup()
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self._wrapped = Settings(settings_module)
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] ImportError: Could not import settings 'anotherproject.settings' (Is it on sys.path?): No module named anotherproject.settings

另一个问题是为什么它仍然使用默认系统 python 而不是来自 virtualenv?请帮忙!

4

2 回答 2

1

您不能在同一个 apache 下使用不同的 python 可执行文件,因为它WSGIPythonHome是为全局所有虚拟主机设置的(请参阅docs)。如果WSGIPythonHome未设置 - mod_wsgi 将使用系统 python。

看来您没有wsgi.py正确设置。您的目标wsgi.py是正确操作 sys.path 以便您的项目需要的所有内容都可用。当我遇到同样的问题时,这对我有帮助:apache server not using proper virtualenv with WSGI setting

希望有帮助。

于 2013-05-22T14:23:33.330 回答
1

缺少您的配置:

WSGIProcessGroup mywebsite.com

没有它,你的 WSGI 应用程序甚至不会被委托给守护进程组。您可以通过以下方式检查:

一旦正确使用了守护进程模式,只要您使用的是 mod_wsgi 3.4,您就可以使用以下命令为该特定守护进程组设置 Python 主目录:

WSGIDaemonProcess mywebsite.com python-home=/var/www/empirik/data/www/mywebsite.com/env

这样,您只需指向 Python 虚拟环境的根目录,它就会被拾取。

您仍然需要为 Django 项目的父目录指定 python-path 选项,以便可以找到它和设置模块,这就是您遇到的问题。因此,您可能想要:

WSGIDaemonProcess mywebsite.com \
    python-home=/var/www/empirik/data/www/mywebsite.com/env \
    python-path=/var/www/empirik/data/www/mywebsite.com

现在,如果仅在守护进程组中运行该站点,请设置:

WSGIApplicationGroup %{GLOBAL}

以避免在子解释器中不起作用的 C 扩展模块出现问题。

为了更安全,而不是:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject>
    Order deny,allow
    Allow from All
</Directory>

你应该使用:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject>
<Files wsgi.py>
    Order deny,allow
    Allow from All
</Files>
</Directory>

这样,如果搞砸了 Apache 配置,就可以减少有人下载您的代码和设置文件的风险。

你在哪里:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject/static>
    Order deny,allow
    Allow from all
</Directory>

您似乎缺少相应的:

Alias /media /var/www/empirik/data/www/mywebsite.com/myproject/static

如果您没有静态媒体目录的别名,Apache 将不会在那里提供文件。

最后,由于您要强制使用守护程序模式并希望避免嵌入模式,请设置:

WSGIRestrictedEmbedded On

这样,如果你搞砸了配置,并且像现在这样错误地在嵌入式模式下运行,你会得到一个错误。

于 2013-05-22T23:57:34.643 回答