我的 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 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>
更详细的内容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 上运行得很好)。
我想使用 Apache 和 mod_wsgi 在我的 Ubuntu VPS 上安装 Django 网站。我使用虚拟环境。但是当我去 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>
更详细的内容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 上运行得很好)。