4

I am trying to set up a web development environment using Python 2.7, apache, mod_wsgi, and web2py on an iMac running Lion (Mac OS X 10.7.3).

I downloaded and installed mod_wsgi v. 3.3 (./configure; make; sudo make install)

It installed in /usr/libexec/apache2. Everything looks sensible:

07:49 PM ~ [541] otool -L /usr/libexec/apache2/mod_wsgi.so 
/usr/libexec/apache2/mod_wsgi.so:
    /Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 635.19.0)

07:55 PM ~ [542] file /usr/libexec/apache2/mod_wsgi.so 
/usr/libexec/apache2/mod_wsgi.so: Mach-O universal binary with 2 architectures
/usr/libexec/apache2/mod_wsgi.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
/usr/libexec/apache2/mod_wsgi.so (for architecture i386):   Mach-O bundle i386

I added several configuration directives to /private/etc/apache2/httpd.conf after all the LoadModule directives.

LoadModule wsgi_module libexec/apache2/mod_wsgi.so
WSGIScriptAlias / /Library/WebServer/Documents

I restarted the apache daemon. The apache log looked good:

[Thu Feb 09 19:19:15 2012] [notice] Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 mod_wsgi/3.3 Python/2.7.2 configured -- resuming normal operations

I put this file into the /Library/WebServer/Documents folder:

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

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

    start_response(status, response_headers)

    return [output]

I executed it from my browser with: http://192.168.1.2/test.py

I got back a response of "500 Internal Server error."

My server log says:

[Thu Feb 09 20:12:10 2012] [error] [client 192.168.1.2] (8)Exec format error: exec of '/Library/WebServer/Documents/test.py' failed
[Thu Feb 09 20:12:10 2012] [error] [client 192.168.1.2] Premature end of script headers: test.py
[Thu Feb 09 20:12:10 2012] [error][client 192.168.1.2] mod_wsgi (pid=4251): Target WSGI script '/Library/WebServer/Documents/favicon.ico' does not contain WSGI application 'application'.

After much searching I haven't been able to find out why. I even stuck a favicon.ico in the documents folder. That caused this to be logged:

[Thu Feb 09 19:15:44 2012] [error] [client 192.168.1.2] (8)Exec format error: exec of '/Library/WebServer/Documents/test.py' failed
[Thu Feb 09 19:15:44 2012] [error] [client 192.168.1.2] Premature end of script headers: test.py
[Thu Feb 09 19:15:46 2012] [error] [client 192.168.1.2] mod_wsgi (pid=4135): Target WSGI script '/Library/WebServer/Documents/favicon.ico' does not contain WSGI application 'application'.

Any help would be appreciated.

Graham Dumpleton
  • 57,726
  • 6
  • 119
  • 134
david193
  • 155
  • 1
  • 10
  • The exec format error went away when I put $! python at the start of the source file. I still don't understand the "Premature end of script" error or "Target WSGI script does not contain WSGI application 'application'. I've verified the file permissions (755) and encoding (UTF-8). – david193 Feb 10 '12 at 03:46
  • Why did you put mod_python in the title? – Ignacio Vazquez-Abrams Feb 10 '12 at 04:54

1 Answers1

1

You mapped WSGIScriptAlias to DocumentRoot directory itself and without a trailing slash on the directory, which likely means that it is trying to load the directory in some bad way as the WSGI script file and failing. The premature end of script file message is confusing though unless you haven't included all your mod_wsgi configuration. That message indicates you are either using mod_wsgi daemon mode, which isn't shown, or something is actually being interpreted as a CGI script.

Anyway, what you probably want to do if you want to drop .py files in DocumentRoot is to do is remove the WSGIScriptAlias and then add:

<Directory /Library/WebServer/Documents>
AddHandler wsgi-script .py
Options +ExecCGI
</Directory>

This will mean 'http://192.168.1.2/test.py' should work, plus you can still drop other static files in that directory and they will be served up.

Make sure you go revise:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide

Graham Dumpleton
  • 57,726
  • 6
  • 119
  • 134