Tim Hoffmann
Tim Hoffmann

Reputation: 1345

How does mod_wsgi know and execute the application?

I'm tying to setup Apache/2.2.22 (Debian) mod_wsgi/3.3 Python/2.7.3

I manage to get the WSGIScriptAlias executed, but only the top level module code, not the application defined therein.

Apache configuration:

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

WSGIScriptAlias  /testurl /home/django/test/test/wsgi_test.py

<Directory /home/django/test/test>
<Files wsgi_test.py>
Order deny,allow
Allow from all
</Files>
</Directory>

wsgi_test.py:

#!/usr/bin/python
import sys
print >> sys.stderr, "I'm wsgi_test"

def application(environ, start_response):
        print >> sys.stderr, 'in application'
        status = '200 OK'
        output = 'hello World'
        response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(output)))]
        start_response(status, response_headers)
        return [output]

When requesting the url using a browser the wsgi_test.py script gets executed ("I'm wsgi_test" appearing in the apache error log). However, no page is served (500 internal server error) and there is an additional error log entry Premature end of script headers: wsgi_test.py.

As a second test, I used a simple script, which correctly serves 'Hello World':

wsgi_test2.py:

#!/usr/bin/python
import sys
print 'Content-type: text/plain\n\n'
print 'Hello World'

My question: How does mod_wsgi know and execute the application?

From the above tests, I conclude that wsgi_test.py is immediately executed. Since there is no executable code but only a definition of application, the script does not output anything and thus the server complains about the missing html headers. How do I tell the system to run the application?

Upvotes: 0

Views: 1767

Answers (1)

Graham Dumpleton
Graham Dumpleton

Reputation: 58563

The mod_wsgi module does not execute the script in the way that you are likely thinking. That is, it doesn't run them as a program.

Your Apache configuration is likely setup so that files with .py extension are being executed as a CGI script and so this is not actually being handled by mod_wsgi. This would explain the behaviour you are seeing.

Either disable AddHandler directive which makes .py files CGI scripts, or rename your WSGI scripts to have a .wsgi extension and change the WSGIScriptAlias directive to match.

When this is done, then mod_wsgi will load the WSGI script into memory and then run the Python code in the memory of the server processes. So not as a separate program execution.

If you ensure that the LogLevel directive in Apache is set to info if currently set to warn, then you should see a lot more messages logged by mod_wsgi about when it is loading the WSGI script to run it the first time. This will confirm that mod_wsgi is handling them.

Upvotes: 4

Related Questions