views:

608

answers:

1

I'm running CentOS 5, and am trying to get a django application working with mod_wsgi. I'm using .wsgi settings I got working on Ubuntu. I'm also using an alternate installation of python (/opt/python2.6/) since my django application needs >2.5 and the OS uses 2.3

Here is the error:

[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Target WSGI script '/data/hosting/cubedev/apache/django.wsgi' cannot be loaded as Python module.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Exception occurred processing WSGI script '/data/hosting/cubedev/apache/django.wsgi'.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] Traceback (most recent call last):
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/data/hosting/cubedev/apache/django.wsgi", line 8, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    import django.core.handlers.wsgi
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 1, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from threading import Lock
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/threading.py", line 13, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from functools import wraps
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/functools.py", line 10, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from _functools import partial, reduce
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly

And here is my .wsgi file

import os
import sys
os.environ['PYTHON_EGG_CACHE'] = '/tmp/django/' # This line was added for CentOS.
os.environ['DJANGO_SETTINGS_MODULE'] = 'cube.settings'

sys.path.append('/data/hosting/cubedev')

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

output of ldd /usr/lib/httpd/modules/mod_wsgi.so

linux-gate.so.1 =>  (0x00250000)
libpython2.6.so.1.0 => /opt/python2.6/lib/libpython2.6.so.1.0 (0x00be6000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00110000)
libdl.so.2 => /lib/libdl.so.2 (0x00557000)
libutil.so.1 => /lib/libutil.so.1 (0x00128000)
libm.so.6 => /lib/libm.so.6 (0x0012c000)
libc.so.6 => /lib/libc.so.6 (0x00251000)
/lib/ld-linux.so.2 (0x0039a000)

vhost config

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerAlias cube-dev.example.com
    ServerName  cube-dev.example.com
    ErrorLog logs/cube-dev.example.com.error_log
    CustomLog logs/cube-dev.example.com.access_log common
    Alias /phpMyAdmin /var/www/phpMyAdmin/
   # DocumentRoot /data/hosting/cubedev

    WSGIScriptAlias / /data/hosting/cubedev/apache/django.wsgi

    WSGIProcessGroup cubedev.example.com
    WSGIDaemonProcess cubedev.example.com

    Alias /media/ /data/hosting/cubedev/media/
    Alias /adminmedia/  /opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media/
    Alias /media /data/hosting/cubedev/media

   <Directory "/data/hosting/cubedev/media">
     Order deny,allow
     Allow from all
    </Directory>
</VirtualHost>
+3  A: 

SystemError: dynamic module not initialized properly is the exception that is thrown when a dll (or .so) that is being loaded cannot be properly initialized. In function _PyImport_LoadDynamicModule of Python/importdl.c in case anyone is interested.

Now, the dll/so in question (the dynamic module in Python parliance) is _functools.so which is part of Python standard library. I see that it is being loaded from /opt/python2.6 so we know that this is not the system python. My guess is that this is not the python against which mod_wsgi was compiled. To check whether this is the case run ldd mod_wsgi.so and look at what libpython is returned.

Therefore my suggestion is either to recompile mod_wsgi againast the interpreter in /opt/python2.6 by running in the wsgi_mod source directory

./configure --with-python=/opt/python2.6/bin/python2.6

or make sure that sys.prefix points to the python installation that mod_wsgi expects by setting its value with the WSGIPythonHome directory.

UPDATE after ldd output

The second line in the ldd output shows that mod_wsgi loads the pythonlib in /usr/lib instead of /opt/python2.6. To instruct mod_wsgi to load that in /opt/python2.6 you should probably prepend it to the LD_LIBRARY_PATH envirnoment variable.

Try it first on the command line:

LD_LIBRARY_PATH=/opt/python2.6/lib:$LD_LIBRARY_PATH ldd mod_wsgi.so

and then make sure that the correct LD_LIBRARY_PATH is specified in the script that starts Apache.

Yet another update

You'll have to debug your mod_wsgi configuration. Just try with the following .wsgi file in place of yours and tell us what you get:

def application(environ, start_response):
    status = '200 OK'
    start_response(status, [('Content-type', 'text/plain')])

    try:
        import sys
        return ['\n'.join([sys.prefix, sys.executable])]
    except:
        import traceback as tb
        return [tb.format_exc()]

If what you get is not `/opt/python2.6', try with the option

WSGIPythonHome /opt/python2.6

See also http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

krawyoti
Also DO NOT go manually mixing Python installation module paths by listing them in WSGIPythonPath, python-path option to WSGIDaemonProcess or by manual changes to sys.path in WSGI script. Mixing modules from different Python installations can lead to unexpected results.
Graham Dumpleton
mod_wsgi was compiled with /opt/python2.6 already. I added the output of ldd above.Would there be any other reason why the SystemError is getting thrown?
David
I updaded my answer in response to the ldd output.
krawyoti
Or when building mod_wsgi, build it as 'LD_RUN_PATH=/opt/python2.6/lib make'. This saves having to set LD_LIBRARY_PATH at run time.
Graham Dumpleton
Even better, Graham.
krawyoti
recompiled mod_wsgi as per advice but I still get the exact same error... I updated the output of ldd above.
David
Probably it's still loading the wrong python: try with my latest update.
krawyoti
The value of sys.executable is not relevant and normally would be the path of the Apache httpd executable.
Graham Dumpleton
Graham, I was wondering about sys.executable... But do you agree that sys.prefix is what matters and that the way to fix it is via WSGIPythonHome ?
krawyoti
with the debug .wsgi you gave me I get/opt/python2.6/usr/bin/pythonAfter that I tried adding the WSGIPythonHome directive to the vhost config but it wouldn't let me, so I put it in its own /etc/httpd/conf.d/wsgi.confI still get the same debug output, and if I replace the .wsgi file with the original one in my question, I get the same SystemError.
David
So I guess we're stuck? No further ideas?
David