centos mod_wsgi:ImportError:没有名为'encodings'的模块

yeotifhr  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(93)

我在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。
有没有人对接下来的步骤有什么建议?我已经搜索了文档,但我不知道从哪里开始。

h6my8fg2

h6my8fg21#

在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)。在对.bat文件进行上述更改后,我的网站可以正常使用Python启动Apache。
注意,我的Python版本WinPython是通过解压安装并将其放置在C:驱动器中来安装的。因此,它不是以通常的Windows方式安装在注册表中,这应该最大限度地减少注册表交互的考虑。

mrzz3bfm

mrzz3bfm2#

所以在我朋友的帮助下(IE:SysAdmins),我们昨晚解决了这个问题。我通过例子学习得最好,所以让我们假设你正在运行Apache和mod_wsgi,作为Linux组apache和用户flipperpa。让我们假设你在/home/my_project中托管wsgi.py在my_project/wsgi.py中。
在顶层(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”表示任何人都可以执行。
在树下检查您的权限;这对我们来说很有用。

c3frrgcw

c3frrgcw3#

这个问题是由SELinux引起的。我所做的是:

  • 已将项目文件移动到/home/admin/myproject
  • 在FlipperPA的回答中更改了权限
  • 我认为最重要的是,使用setsebool -P httpd_enable_homedirs onhttpd_enable_homedirs SELinux布尔值设置为on

CentOS wiki上的SELinux guide非常有用。例如,要进行调试,您可以运行setenforce Permissive,这样SELinux就不会强制执行其规则,但仍然写入日志。记住之后再次运行setenforce Enforcing

相关问题