我的 virtualenv 没有考虑到? [阿帕奇、mod_wsgi 和 django]

My virtualenv is not taking into account ? [apache, mod_wsgi and django]

我想使用 Apache 和 mod_wsgi 在我的 Ubuntu VPS 上安装 Django 网站。我使用虚拟环境。但是当我去 mysite.com 我得到一个 500 Internal Server Errorerror.log 告诉我这个:

[Sun Jan 25 18:42:36 2015] [error] [client xx.xx.xx.xx]   File "/usr/local/lib/python2.7/dist-packages/django/core/cache/backends/memcached.py", line 155, in __init__
[Sun Jan 25 18:42:36 2015] [error] [client xx.xx.xx.xx]     import memcache
[Sun Jan 25 18:42:36 2015] [error] [client xx.xx.xx.xx] ImproperlyConfigured: Error importing module django.contrib.sessions.middleware: "No module named memcache"

它告诉我没有安装 memcached,但它似乎看错了 python/site-packages 路径,而不是我的 virtualenv。我已经在我的 virtualenv 中安装了 memcached。

这是我的 "mysite"

虚拟主机
<VirtualHost *:80>

    ServerName www.mysite.com
    ServerAlias mysite.com
    ServerAdmin webmaster@example.com

    Alias /uploads/ /var/www/mysite/uploads/
    Alias /static/ /var/www/mysite/myapp/static/

    WSGIDaemonProcess mysite  python-path=/var/www/mysite:/root/.virtualenvs/mysite_env/lib/python3.2/site-packages
    WSGIProcessGroup mysite
    WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py

    <Directory /var/www/mysite/myapp/static>
      Order allow,deny
      Allow from all
    </Directory>

    <Directory /var/www/mysite/uploads>
      Order allow,deny
      Allow from all
    </Directory>


    <Directory /var/www/mysite/mysite>
      <Files wsgi.py>
      Order allow,deny
      Allow from all
      </Files>
    </Directory>


</VirtualHost>

我不知道这是否有帮助,但我会准确地说,我目前 运行 此 VPS 中的其他 PHP 个网站,并且每个网站都有自己的 VirtualHost 文件。

如有任何帮助,我们将不胜感激!

我通常在我的 wsgi.py 文件中配置 virtualenv 导入并且它有效。只需添加以下行:

site.addsitedir('/home/{my_user}/.virtualenvs/{virtualenv}/local/lib/python2.7/site-packages')
activate_env=os.path.expanduser("/home/{my_user}/.virtualenvs/{virtualenv}/bin/activate_this.py")
try:
    execfile(virtualenv, dict(__file__=virtualenv))
except:
    pass

这就是我的虚拟主机的配置:

<VirtualHost yourhost>
     ServerName server.name.com
     WSGIScriptAlias / /path/to/wsgi.py
     Alias /static/ /path/to/static/
     Alias /media/ /path/to/media/
     DocumentRoot /path/to/project

     ErrorLog /var/log/apache2/project_error.log
</VirtualHost>

更详细的内容here

你的 apache.conf 看起来很合理...这是我的一个作为比较

WSGIScriptAlias / ${SRV}/www/example/wsgi.py
WSGIProcessGroup www.example.no
WSGIDaemonProcess www.example.no \
    display-name=example \
    threads=50 \
    maximum-requests=10000 \
    umask=0002 \
    inactivity-timeout=3600 \
    home=${SRV}/www/example \
    python-path=${SRV}/www:${SRV}/src:${SRV}/venv/dev/lib/python2.7/site-packages \
    python-eggs=${SRV}/.python-eggs

${SRV} 来自我为 Apache 2.2 手动编译的 mod_define,但应该包含在 2.4(?)

您应该按照此处列出的步骤操作:https://code.google.com/p/modwsgi/wiki/VirtualEnvironments。然而,重要的是要注意,即使在使用 virtualenv 时,你 需要 使用与构建 mod_wsgi 相同的 Python 版本(看起来像您正在尝试在 Py2 配置上使用 Py3)。

我修改了 wsgi.py 文件以从 site.ini:

读取配置值
from ConfigParser import ConfigParser
import sys, os

# server variables
SITE_ROOT = os.path.split(__file__)[0]
WWW = os.path.split(SITE_ROOT)[0]

config = ConfigParser()
config.read([os.path.join(DK_SITE_ROOT, 'site.ini')])

# site properties
SITE_NAME = config.get('site', 'sitename')
DNS = config.get('site', 'dns')
SRV = config.get('server', 'srv')
# virtualenv variables
VENV_NAME = "dev"   # only

# derived settings
DJANGO_SETTINGS_MODULE = "%s.settings" % SITE_NAME
VIRTUAL_ENV = "%s/venv/%s" % (SRV, VENV_NAME)

# activate virtualenv
# (warning: https://code.google.com/p/modwsgi/wiki/CheckingYourInstallation)
_activate = "%s/%s/activate_this.py" % (
    VIRTUAL_ENV,
    'Scripts' if sys.platform == 'win32' else 'bin'
)
if sys.version_info >= (3, 0):
    exec(compile(open(_activate, 'rb').read(), _activate, 'exec'))
else:
    execfile(_activate, dict(__file__=_activate))

# make site directory importable
sys.path.insert(0, WWWDIR)

# set all GLOBAL vars as environment variables
for _varname in [k for k in globals().keys() if k == k.upper()]:
    _val = globals()[_varname]
    if type(_val) == str:
        os.environ[_varname] = _val

# This application object is used by the development server
# as well as any WSGI server configured to use this file. 
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

(我用 Py3 测试它已经有一段时间了,但它在 Py2 上运行得很好)。