我正在尝试在这个tutorial之后在Apache VPS上安装一个django站点 我的index.wsgi应该在root中激活virtualenv,它看起来像这样:
import os
import sys
import site
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/.virtualenvs/DBENV/local/lib/python2.7/site-packages')
# Add the app's directory to the PYTHONPATH
sys.path.append('/home/DB2015/')
sys.path.append('/home/DB2015/davidcms/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'davidcms.settings'
# Activate your virtual env
activate_env=os.path.expanduser("~/.virtualenvs/DBENV/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
我收到此错误
[Tue Feb 17 07:13:30.701511 2015] [:error] [pid 16103:tid 140396130674432] [client 217.44.75.146:58169] execfile(activate_env, dict(__file__=activate_env))
[Tue Feb 17 07:13:30.701653 2015] [:error] [pid 16103:tid 140396130674432] [client 217.44.75.146:58169] IOError: [Errno 2] No such file or directory: '/var/www/.virtualenvs/DBENV/bin/activate_this.py'
所以它在var/www/
而不是根目录。当我尝试将os.path.expanduser
更改为根目录中的.virtualenvs路径时:
# Activate your virtual env
activate_env= "~/.virtualenvs/DBENV/bin/activate_this.py"
execfile(activate_env, dict(__file__=activate_env))
它仍然说
[Tue Feb 17 07:17:12.019641 2015] [:error] [pid 16104:tid 140396206208768] [client 217.44.75.146:58200] execfile(activate_env, dict(__file__=activate_env))
[Tue Feb 17 07:17:12.019852 2015] [:error] [pid 16104:tid 140396206208768] [client 217.44.75.146:58200] IOError: [Errno 2] No such file or directory: '~/.virtualenvs/DBENV/bin/activate_this.py'
我缺少什么?!
答案 0 :(得分:0)
可能Apache并没有像你一样运行,而是作为自己的用户运行,所以它不会使用你的主目录。
无论如何,你不应该把你的代码放在主目录中。选择一个标准位置 - 例如/srv
或/var/sites
等新的顶级目录。
答案 1 :(得分:0)
这似乎是一个相对较新的问题或可能是一个错误?除了最近的一些帖子(也许是一两个错误报告)之外,我找不到任何与大卫和我正在经历的问题相关的帖子。
我使用virtualenvwrapper来管理我的VE, 任何熟悉它的人都知道,你可以通过导航到像“〜/ .virtualenvs / whaterver”这样的目录来访问VE。
根据this:〜/(代字号斜杠):代字号是Linux“快捷方式”,表示用户的主目录。
这意味着你也可以通过导航到“/home/username/.virtualenvs/”(这是wsgi正在寻找的绝对路径)来访问VE。
[ WSGI配置]
我能够通过修改我的index.wsgi文件来运行我的Django欢迎页面:
------------
# Changed From:
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages')
# Activate your virtual env
activate_env=os.path.expanduser("~/.virtualenvs/myprojectenv/bin/activate_this.py")
------------
# Changed To:
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('/home/username/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages')
# Activate your virtual env
activate_env=os.path.expanduser('/home/username/.virtualenvs/myprojectenv/bin/activate_this.py')
重要:以与我在此处列出的相同方式进行设置时,您必须不在django项目的settings.py中指定wsgi文件(似乎是从django-admin创建新项目时自动生成的情况)。在我的系统上,当两个文件都被加载时,我无法得到Django的响应,我的浏览器会挂起无限期地“加载”并且没有消息被发布到apache error.log文件,尽管来自django的“一些”错误会使如果debug = true,它到浏览器。所以如果你在settings.py中有这样的一行:
请务必将其评论或删除它(在我发现冲突之前,我花了一两个小时的头发撕裂)
[更新旧示例]
然而,我确实遇到了从我的wsgi文件生成的问题。如果您收到类似于的错误: “AppRegistryNotReady:在应用程序注册表准备好之前,无法初始化转换基础结构。请确保在导入时不要进行非延迟的gettext调用。”这是我在尝试使用此过程为apache配置django时收到的错误:
Deploy Django on Apache with Virtualenv and mod_wsgi
#Make sure you are not doing this
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
#And rather you should be doing this
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
根据此django document(现在)构建wsgi文件的正确方法。
[文件权限]
在django项目目录中设置所有文件的正确组和所有权也是一个好主意。 我更喜欢将所有权和组作为我正在配置的VE的用户。
这可以通过运行命令来完成:
[我的规格]
[我的apache配置]
我已经配置了虚拟主机,因此我可以从本地网络上的端口8080访问我的django应用程序。这也允许我通过配置WSGIPythonHome指令来设置我的VE python的路径。另外,我在守护进程模式下运行wsgi,以使用WSGIDaemonProcess指令指定守护程序线程应该运行的用户。
#My awesome django app's apache config
WSGIPythonHome /home/username/.virtualenvs/myprojectenv #This is important and sets the path that apache/wsgi uses to the virtualenv's python.
<VirtualHost *:8080>
#ServerAdmin [email protected]
ServerName mydomain.com
#ServerAlias www.mydomain.com
#Must run as daemon so the delegated process can inherit the virtualenvs user
WSGIDaemonProcess SomeProcessGroupName user=username group=username processes=2 threads=5 home=/var/www/my-site.com/
WSGIProcessGroup SomeProcessGroupName
WSGIScriptAlias / /var/www/my-site.com/index.wsgi
Alias /static /var/www/my-site.com/static/
<Location "/static/">
#Options -Indexes
</Location>
</VirtualHost>
[我的目录结构]
|
|_var
| |_www
| |_my-site.com
| |_index.wsgi
| |_static
| |_css
| |_js
|_home
| |_django_projects
| | |_projectbase
| | |_myproject
| | | |_myproject
| | | |_settings.py
| | |
| | |_templates
| |
| |_username
| |_.virtualenvs
| |_myprojectenv
| |_bin
| |_activate_this.py
|_etc
|_apache2
|_apache2.conf
[我的python路径]
# Printed from python console in my virtual environment
/home/username/.virtualenvs/myprojectenv/lib/python2.7
/home/username/.virtualenvs/myprojectenv/lib/python2.7/plat-x86_64-linux-gnu
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-tk
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-old
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-dynload
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/home/username/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages
/home/username/.virtualenvs/myprojectenv/lib/python2.7/site-packages
# printed to the apache log from within settings.py
/home/username/.virtualenvs/myprojectenv/lib/python2.7',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/plat-x86_64-linux-gnu',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-tk',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-old',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-dynload',
/usr/lib/python2.7',
/usr/lib/python2.7/plat-x86_64-linux-gnu',
/usr/lib/python2.7/lib-tk',
/home/username/.virtualenvs/Horizon_Server_Env/local/lib/python2.7/site-packages',
/home/django-projects/projectbase/myproject',
/home/django-projects/projectbase/myproject/myproject'
[<强>综述强>
我已经记录了我根据David和我正在使用的教程配置Django的经验中所采取的一些步骤。正如我之前所说,我的应用程序在本地网络上运行(在端口8080上)并且无法访问互联网。所以这个配置是我的需求,可能不符合你的安全要求(虽然我很想得到其他人对该主题的意见!)。如前所述,Daniel R.您可能需要考虑将您的虚拟环境定位在顶级目录中。但是我觉得上面提到的是一个运行该教程的好方法,而不必对他们的示例做很多改动。 希望这会有所帮助!