我在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
工作正常!我已经尝试使用the mod_wsgi CheckingYourInstallation page中的示例WSGI脚本来确认Apache正在使用哪个版本的Python,但是我得到了相同的ImportError。
有没有人对后续步骤有什么建议?我已经搜过了文档,但我不知道从哪里开始。
所以在我朋友的帮助下(IE:SysAdmins),我们昨晚得到了这个。我通过示例最好地学习,所以让我们假设您使用mod_wsgi运行Apache作为Linux组apache并使用用户flipperpa。假设您在my_project / wsgi.py中使用wsgi.py托管/ home / my_project。
在顶层(ls -l /):
drwxr-xr-x. 47 root root 4096 Jul 9 09:43 home
在主目录(ls -l / home)中:
drwxrwsr-x 7 flipper apache 4096 Jul 29 10:22 my_project
这是关键。小写“s”表示设置了apache组的setgid位,并设置了执行位。当然,最后的“x”意味着任何人都可以执行。
检查树下的权限;这对我们起了作用。
这个问题是由SELinux引起的。我做的是这样的:
httpd_enable_homedirs
将on
SELinux布尔值设置为setsebool -P httpd_enable_homedirs on
。CentOS维基上的SELinux guide非常有帮助。例如,要调试,您可以运行setenforce Permissive
,以便SELinux不会强制执行其规则,但仍会写入日志。之后再次记住setenforce Enforcing
!
在Windows上,我通过将Python安装的Lib目录直接放在PYTHONPATH上解决了这个问题。这是必要的,即使你在同一个shell中直接运行Python,它也不需要这个来找到编码包:
set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.amd64\Lib;%PYTHONPATH%
c:\apache24\bin\httpd.exe
另外一定要使用正确的mod_wsgi版本。我从Unofficial Binaries page下载了我的,并选择它来匹配Python(上例中的64位3.4)。在上面更改为启动Apache的.bat文件之后,我的网站可以正常使用Python。
注意我的Python版本WinPython是通过解压缩安装并将其放在C:驱动器中来安装的。因此,它没有以通常的Windows方式安装在注册表中,这应该最小化注册表交互注意事项。