Python – Make mod_wsgi use python2.7.2 instead of python2.6

djangomod-wsgipython

i am running Ubuntu 10.04.1 LTS and it came pre-packed with python2.6 but i need to replace it with python2.7.2.

(The reason is simple, 2.7 has a lot of features backported from 3 )

i had installed python2.7.2 using

./configure
make
make altinstall

the altinstall option installed it, without touching the system default version, to /usr/local/lib/python2.7 and placed the interpreter in /usr/local/bin/python2.7

Then to help mod_wsgi find python2.7 i added the following to /etc/apache2/sites-available/wsgisite

WSGIPythonHome /usr/local

i start apache and run a test wsgi app BUT i am greeted by python 2.6.5 and not Python2.7

Later i replaced the default python simlink to point to python 2.7

ln -f /usr/local/bin/python2.7 /usr/bin/python

Now typing 'python' on the console opens python2.7 but somehow mod_wsgi still picks up python2.6

Next i tried,

PATH=/usr/local/bin:$PATH
export PATH

then do a quick restart apache, but yet again its python2.6 !!


Here is my $PATH

/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

contents of /etc/apache2/sites-available/wsgisite

WSGIPythonHome /usr/local


<VirtualHost *:80>

    ServerName wsgitest.local
    DocumentRoot /home/wwwhost/pydocs/wsgi
    <Directory /home/wwwhost/pydocs/wsgi>
        Order allow,deny
        Allow from all
    </Directory>

    WSGIScriptAlias / /home/wwwhost/pydocs/wsgi/app.wsgi

</VirtualHost>

app.wsgi

import sys

def application(environ, start_response):
    status = '200 OK'
    output = sys.version

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Apache error.log

'import site' failed; use -v for traceback
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23235): Initializing Python.
[Sun Jun 19 00:27:21 2011] [notice] Apache/2.2.14 (Ubuntu) mod_wsgi/2.8 Python/2.6.5 configured -- resuming normal operations
[Sun Jun 19 00:27:21 2011] [info] Server built: Nov 18 2010 21:20:56
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23238): Attach interpreter ''.
[Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23239): Attach interpreter ''.
[Sun Jun 19 00:27:31 2011] [info] mod_wsgi (pid=23238): Create interpreter 'wsgitest.local|'.
[Sun Jun 19 00:27:31 2011] [info] [client 192.168.1.205] mod_wsgi (pid=23238, process='', application='wsgitest.local|'): Loading WSGI script '/home/wwwhost/pydocs/$
[Sun Jun 19 00:27:50 2011] [info] mod_wsgi (pid=23239): Create interpreter 'wsgitest.local|'.

Has anybody ever managed to make mod_wsgi run on a non-system default version of python ?

Best Answer

compiling python 2.7

./configure \
   --prefix=/usr/local \
   --enable-unicode=ucs4 \
   --enable-shared \
   LDFLAGS="-Wl,-rpath /usr/local/lib"

make && make altinstall

don't forget --enable-shared or you may have problems later on.

compiling mod_wsgi for python 2.7

https://code.google.com/p/modwsgi/wiki/InstallationIssues

since you did a make altinstall to install python2.7 you won't have a python-devel package to install; so you would need the mod_wsgi to refer to proper python.

./configure --with-python=/usr/local/bin/python2.7 
# then edit Makefile if you want to change DESTDIR
make && make install

... try to start httpd ...

Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 2 of /etc/httpd/conf.d/wsgi.conf: Cannot load /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so into server: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

Because we are not using the same python and we didn't link the module with any particular option to make it look in the correct place, it cannot find libpython2.7.so.1.0, we can change that by making libtool check the correct place.

# use LDFLAGS to tell libtool resulting lib needs to
# look for shared libs in /usr/local/lib too.
./configure \
   --with-python=/usr/local/bin/python2.7 \
   LDFLAGS="-R/usr/local/lib"
# then edit Makefile if you want to change DESTDIR
# e.g. DESTDIR = /opt/mod_wsgi2.7
make && make install

... try to start http again ...

Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 2 of /etc/httpd/conf.d/wsgi.conf: Cannot load /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so into server: /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so: cannot open shared object file: Permission denied

That last error is because my system is running selinux and the file has the default context. A quick look at stackoverflow tells me it is an selinux issue.

fixing selinux context

# ls -Z /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 
-rwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so

The fix is to use the correct context, which can be found on the original mod_wsgi module.

chcon --reference /etc/httpd/modules/mod_wsgi.so /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 
Related Topic