我在CentOS 6.5上使用Apache 2.2.15。我试图使用mod_wsgi设置Django应用程序。我使用的是虚拟环境,mod_wsgi配置为--with-python=/path/to/virtualenv/bin/python3.4
。
我在httpd.conf
中添加了以下内容:
WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>
字符串
在wsgi.py
中,我添加了
sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")
型
问题是当我尝试在浏览器中打开应用程序时,它会无限期地加载。以下是Apache错误日志:
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
型
有趣的是,在Python(2.6)和虚拟环境版本(3.4)的系统安装中,import encodings
都可以正常工作!我尝试使用mod_wsgi CheckingYourInstallation页面中的示例WSGI脚本来确认Apache正在使用哪个版本的Python,但我得到了相同的ImportError。
有没有人对接下来的步骤有什么建议?我已经搜索了文档,但我不知道从哪里开始。
3条答案
按热度按时间h6my8fg21#
在Windows上,我通过将Python安装的Lib目录直接放在PYTHONPATH上来解决这个问题。这是必要的,即使如果你直接在同一个shell中运行Python,它不需要这样来找到编码包:
字符串
另外,请确保使用正确的mod_wsgi版本。我从Unofficial Binaries page下载了我的版本,并选择了它来匹配Python(在上面的示例中为64位3.4)。在对.bat文件进行上述更改后,我的网站可以正常使用Python启动Apache。
注意,我的Python版本WinPython是通过解压安装并将其放置在C:驱动器中来安装的。因此,它不是以通常的Windows方式安装在注册表中,这应该最大限度地减少注册表交互的考虑。
mrzz3bfm2#
所以在我朋友的帮助下(IE:SysAdmins),我们昨晚解决了这个问题。我通过例子学习得最好,所以让我们假设你正在运行Apache和mod_wsgi,作为Linux组apache和用户flipperpa。让我们假设你在/home/my_project中托管wsgi.py在my_project/wsgi.py中。
在顶层(ls -l /):
字符串
在主目录(ls -l /home)中:
型
这是关键。小写的“s”表示apache组的setgid位被设置,执行位被设置。当然,最后的“x”表示任何人都可以执行。
在树下检查您的权限;这对我们来说很有用。
c3frrgcw3#
这个问题是由SELinux引起的。我所做的是:
setsebool -P httpd_enable_homedirs on
将httpd_enable_homedirs
SELinux布尔值设置为on
。CentOS wiki上的SELinux guide非常有用。例如,要进行调试,您可以运行
setenforce Permissive
,这样SELinux就不会强制执行其规则,但仍然写入日志。记住之后再次运行setenforce Enforcing
!