Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mod_wsgi: ImportError: No module named 'encodings'

Tags:

I'm using Apache 2.2.15 on CentOS 6.5. I'm trying to set up a Django app using mod_wsgi. I'm using a virtual environment, and mod_wsgi was configured with --with-python=/path/to/virtualenv/bin/python3.4.

I've added this to my 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> 

In wsgi.py, I added

sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages") 

The problem is that when I try to open the app in my browser, it loads indefinitely. Here's the Apache error log:

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' 

What's interesting is that in both the system installation of Python (2.6) and the virtual environment version (3.4), import encodings works fine! I've tried using the example WSGI script from the mod_wsgi CheckingYourInstallation page to confirm which version of Python is being used by Apache, but I get the same ImportError.

Does anyone have a suggestion for next steps? I've scoured the docs but I don't know where to go from here.

like image 872
tao_oat Avatar asked Jun 30 '14 17:06

tao_oat


2 Answers

So with some help with my friends (IE: SysAdmins), we got this figured out last night. I learn best by example, so let's assume you're running Apache with mod_wsgi as Linux group apache with user flipperpa. Let's assume you're hosting in /home/my_project with wsgi.py in my_project/wsgi.py.

At the top level (ls -l /):

drwxr-xr-x.  47 root root  4096 Jul  9 09:43 home 

In the home directory (ls -l /home):

drwxrwsr-x   7 flipper        apache 4096 Jul 29 10:22 my_project 

This was the key. The lower case "s" means the apache group's setgid bit is set, and the execute bit is set. The final "x", of course, means anyone can execute.

Check your permissions down the tree; this did the trick for us.

like image 133
FlipperPA Avatar answered Sep 19 '22 09:09

FlipperPA


The issue was caused by SELinux. What I did was this:

  • moved the project files into /home/admin/myproject
  • changed permissions as in FlipperPA's answer
  • and, crucially I think, set the httpd_enable_homedirs SELinux boolean to on using setsebool -P httpd_enable_homedirs on.

The SELinux guide on the CentOS wiki was very helpful. For example, to debug you can run setenforce Permissive so SELinux won't enforce its rules, but still write to the log. Just remember to setenforce Enforcing again afterwards!

like image 42
tao_oat Avatar answered Sep 22 '22 09:09

tao_oat