Install mod-wsgi on Ubuntu 14.04

mod_wsgi is used to run python scripts in Apache Web Server. This is also used to deploy python framework like Django under Apache.

To install mod_wsgi on Ubuntu 14.04, run

sudo apt-get install libapache2-mod-wsgi-py3

Now you need to edit your web site configuration file and add

AddHandler cgi-script .cgi .pl .py

Restart Apache

sudo service apache2 restart

Now you will be able to execute python scripts under Apache.

List all modules loaded by Apache.

boby@fwhlin:~/www$ sudo apache2ctl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)
 wsgi_module (shared)
boby@fwhlin:~/www$ 

You can see “wsgi_module (shared)” loaded.

My Apache configuration/test python script

boby@fwhlin:~$ cat /etc/apache2/sites-available/000-default.conf 
<VirtualHost 127.0.0.1:80>
        ServerAdmin webmaster@localhost
        SetEnv APP_ENV "dev"

        DocumentRoot /home/boby/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /home/boby/www/>
                Options All 
                AllowOverride All
                Require all granted
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /home/boby/www/cgi-bin/

        <Directory "/home/boby/www/cgi-bin/">
                AllowOverride None
                Require all granted
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        AddHandler cgi-script .cgi .pl .py


        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
boby@fwhlin:~$ cat ~/www/1.py
#!/usr/bin/python

print "Content-type: text/html"
print
print "<pre>"
import os, sys
from cgi import escape
print "<strong>Python %s</strong>" % sys.version
keys = os.environ.keys()
keys.sort()
for k in keys:
    print "%s\t%s" % (escape(k), escape(os.environ[k]))
print "</pre>"

boby@fwhlin:~$

Posted in Ubuntu