MAUSDjangoApache » History » Revision 10
« Previous |
Revision 10/29
(diff)
| Next »
Jackson, Mike, 10 February 2012 15:41
Deploying Django under Apache¶
- Table of contents
- Deploying Django under Apache
Apache 2.2 deployment¶
Apache 2.2 (http://httpd.apache.org/) is an HTTP server.
For full deployment information, see
Following the "overview for the impatient"...
- Log in as root user,
$ sudo su -
- Download,
$ lynx http://httpd.apache.org/download.cgi
- Alternatively:
$ wget http://mirrors.ukfast.co.uk/sites/ftp.apache.org//httpd/httpd-2.2.22.tar.gz
- Alternatively:
- Extract,
$ gzip -d httpd-2.2.22.tar.gz $ tar xvf httpd-2.2.22.tar $ cd httpd-2.2.22
- Configure,
$ ./configure
- This uses a default deployment directory of
/usr/local/apache2
.
- This uses a default deployment directory of
- Compile,
$ make
- Install,
$ make install
- Start-up server,
$ /usr/local/apache2/bin/apachectl -k start
- If you get an error like,
(98)Address already in use: make_sock: could not bind to address [::]:80 (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable to open logs
- Then edit
/usr/local/apache2/conf/httpd.conf
,$ xemacs /usr/local/apache2/conf/httpd.conf
- and change,
Listen 80
- to a port that is not in use e.g.
Listen 9090
- and start Apache,
$ /usr/local/apache2/bin/apachectl -k start
- If you get an error like,
- Browse to http://localhost:8080 (or whatever port you specified above) and you should see
It works!"
Useful files:
- Configuration:
/usr/local/apache2/conf/httpd.conf
- Error log:
/usr/local/apache2/logs/error_log
mod_wsgi deployment¶
mod_wsgi (http://code.google.com/p/modwsgi/) is an Apache module allowing the hosting of Python applications which suppport Python's WSGI (Web Server Gateway Interface).
For full deployment information, see
- http://code.google.com/p/modwsgi/wiki/InstallationInstructions
- http://code.google.com/p/modwsgi/wiki/InstallationIssues
Now, following the quick installation guide (http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide),
- Download latest release (July 2010)
$ wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
- Extract,
$ gunzip mod_wsgi-3.3.tar.gz $ tar -xf mod_wsgi-3.3.tar $ cd mod_wsgi-3.3
- Set Python library path, if using a non-default Python distribution. The author uses MAUS Python, so set:
$ export LD_LIBRARY_PATH=/home/michaelj/maus-bzr/maus/third_party/install/lib/
- Configure,
$ ./configure
- If you get an error like:
/home/michaelj/maus-bzr/maus/third_party/install/bin/python2.7: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
- Then set the
LD_LIBRARY_PATH
as above. - If using a non-default Python distribution, then add a
--with-python
flag pointing to the Python executable. The author uses MAUS Python so set:--with-python=/home/michaelj/maus-bzr/maus/third_party/install/bin/python2.7
- If you get an error like:
checking for apxs2... no checking for apxs... no checking Apache version... ./configure: line 1704: apxs: command not found ./configure: line 1704: apxs: command not found ./configure: line 1705: apxs: command not found ./configure: line 1708: /: is a directory checking for python... /home/michaelj/maus-bzr/maus/third_party/install/bin/python ./configure: line 1877: apxs: command not found configure: creating ./config.status config.status: error: cannot find input file: Makefile.in
- Then explicitly provide the path to Apache's
apxs
command,$ ./configure --with-apxs=/usr/local/apache2/bin/apxs
- Combining the above gives,
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/home/michaelj/maus-bzr/maus/third_party/install/bin/python2.7
- If you get an error like:
- Compile,
$ make
- Install,
$ make install
- A
mod_wsgi.so
library is installed in/usr/local/apache2/modules
. - Configure Apache, edit
/usr/local/apache2/conf/httpd.conf
,$ xemacs /usr/local/apache2/conf/httpd.conf
- and add,
LoadModule wsgi_module modules/mod_wsgi.so
- If you use a non-standard Python location and set
LD_LIBRARY_PATH
above, then edit/usr/local/apache2/bin/envvars
and add a line to set the Python library path e.g.LD_LIBRARY_PATH="/home/michaelj/maus-bzr/maus/third_party/install/lib/:$LD_LIBRARY_PATH"
- Restart Apache,
$ /usr/local/apache2/bin/apachectl restart
- If all is well you should see, in
/usr/local/apache2/logs/error_log
a line like,[Tue Feb 07 18:50:37 2012] [notice] Apache/2.2.22 (Unix) mod_wsgi/3.3 Python/2.7.2 configured -- resuming normal operations
- If you see an error like,
[Tue Feb 07 18:46:40 2012] [notice] SIGHUP received. Attempting to restart httpd: Syntax error on line 55 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_wsgi.so into server: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
- then you have to set the
LD_LIBRARY_PATH
as above.
- then you have to set the
- Clean up,
$ make clean
To check your installation (following http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation),
- List server information,
$ /usr/local/apache2/bin/httpd -V Server version: Apache/2.2.22 (Unix) ... Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" ...
- Important information is the version and prefork settings,
- List compiled-in modules,
$ /usr/local/apache2/bin/httpd -l Compiled in modules: ... prefork.c
- You should see
prefork.c
.
- You should see
- List dynamically-loaded modules,
$ /usr/local/apache2/bin/httpd -M mpm_prefork_module (static) ... wsgi_module (shared) ...
- You should see
wsgi_module
. - If this fails with,
httpd: Syntax error on line 55 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_wsgi.so into server: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
- Then set your
LD_LIBRARY_PATH
as above and try again,$ export LD_LIBRARY_PATH="/home/michaelj/maus-bzr/maus/third_party/install/lib/:$LD_LIBRARY_PATH" $ /usr/local/apache2/bin/httpd -M Loaded Modules: ...
- You should see
- List modules linked to by
mod_wsgi
:$ ldd /usr/local/apache2/modules/mod_wsgi.so ... libpython2.7.so.1.0 => /home/michaelj/maus-bzr/maus/third_party/install/lib/libpython2.7.so.1.0 (0x00110000) ...
- You should see the link to your Python library.
Deploying ImageMagick¶
The ImageMagick library is used to convert between image types in the MAUS web-front end.
To install,
- Log in as root user,
$ sudo su -
- Get and unpack ImageMagick,
$ wget http://www.imagemagick.org/download/ImageMagick.tar.gz $ gunzip ImageMagick.tar.gz $ tar -xf ImageMagick.tar $ cd ImageMagick-6.7.4-0/
- Configure,
$ ./configure
- Make,
$ make
- Install,
$ make install
- This places libraries in
/usr/local/lib
.
- This places libraries in
- Cache the libraries,
$ ldconfig /usr/local/lib
- This avoids problems with libraries not being found by Python's magickwand library.
- Check,
$ /usr/local/bin/convert -h Version: ImageMagick 6.7.4-0 2011-12-13 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC Features: OpenMP
To install Python magickwand
- Setup the MAUS environment:
$ source env.sh
- Install,
$ easy_install magickwand
Check,$ python $ import magickwand $ from magickwand.image import Image ...
- If you get an error like,
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "build/bdist.linux-i686/egg/magickwand/image.py", line 2, in <module> File "build/bdist.linux-i686/egg/magickwand/api/__init__.py", line 1, in <module> # File "build/bdist.linux-i686/egg/magickwand/api/lib.py", line 11, in <module> File "/home/michaelj/maus-bzr/maus/third_party/install/lib/python2.7/ctypes/__init__.py", line 353, in __init__ self._handle = _dlopen(self._name, mode) OSError: libMagickWand.so.5: cannot open shared object file: No such file or directory
- then run
ldconfig
as described above.
Deploying the MAUS Django web front-end¶
For more on Django deployment under Apache 2.2/mod_wsgi, see
- https://docs.djangoproject.com/en/1.3/howto/deployment/modwsgi/
- http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
- Check-out the MAUS Django code,
$ bzr branch -v lp:~michaelj-h/maus-apps/devel maus-apps
- Set-up environment,
$ cd maus-apps $ ./configure $ ./install.sh
- Copy a couple of sample images,
$ cp images/* media/raw
- Log in as root user,
$ sudo su -
- Edit Apache 2.2 configuration,
$ xemacs -nw /usr/local/apache2/conf/httpd.conf
Add,WSGIScriptAlias / ${MAUS_WEB_DIR}/apache/django.wsgi # Location of django.wsgi <Directory ${MAUS_WEB_DIR}/apache> Order deny,allow Allow from all </Directory>
- where:
/
specifies the root URL - so all URL requests will be directed to Django./...
- location of WSGI file within the MAUS Django project.
- Edit Apache 2.2 environment, so it has access to the MAUS environment (in particular all the Python libraries that have been easy_installed):
$ xemacs -nw /usr/local/apache2/bin/envvars
- Add
source /home/michaelj/maus-bzr/maus/env.sh source /home/michaelj/maus-apps/env.sh
- Restart Apache 2.2,
$ /usr/local/apache2/bin/apachectl restart
- Test,
- Visit http://localhost:8080/maus/, remembering to change the port number if you use a custom port.
Updated by Jackson, Mike almost 12 years ago · 10 revisions