簡體   English   中英

我的virtualenv不考慮在內嗎? [Apache,mod_wsgi和django]

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

我想使用Apache和mod_wsgi在Ubuntu VPS上安裝Django網站。 我使用了virtualenv。 但是當我訪問mysite.com時,出現500 Internal Server Error ,並且error.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>

這里有更詳細的內容。

您的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版本相同的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上效果很好)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM