.. _deployment:
Deployment
==========
See the instructions for deploying a django project on the
`django deployment page `_
.. note::
You'll need to add the path of your project to the python path just as you
did madrona.
Apache Configuration
--------------------
Using Apache2, you can configure your project as an apache virtual host using the following::
ServerName your.server.org
Alias /media/admin/ /src/django/django/contrib/admin/media/
Order allow,deny
Allow from all
Alias /media/ /src/madrona/media/
Order allow,deny
Allow from all
Options -ExecCGI
Options -Indexes
Order Allow,Deny
Deny from all
WSGIScriptAlias / /src/project/project_wsgi.py
WSGIDaemonProcess project user=gisdev group=gisdev processes=10 threads=1
WSGIProcessGroup project
WSGIRestrictStdin Off
This file is typically placed in /etc/apache2/sites-available/project and then made available using the apache utilities::
a2ensite project
This configuration allows admin media and standard media to be served by apache. It also locks down the media/upload directory which is where user-uploaded files will be placed; we control access to these files through django views in order to leverage authentication and security.
The wsgi script is a python file similar to this::
#!/usr/bin/env python
import sys
import os
sys.stdout = sys.stderr
# If django is not already in python site-directories
sys.path.append('/src/django')
# Project specific
sys.path.append('/src/project')
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Nginx/Gunicorn Configuration
--------------------------------
nginx is an alternate high-performance, low memory footprint web server. It can use gunicorn to serve django wsgi apps.
Installation
++++++++++++
With Ubuntu::
sudo apt-get install nginx
sudo pip install gunicorn
# If you use eventlet
sudo pip install eventlet
# or gevent
sudo apt-get install libevent-dev
sudo pip install gevent
Configuration
+++++++++++++
/etc/nginx/nginx.conf::
worker_processes 1;
user www-data gisdev;
events {
worker_connections 1024;
accept_mutex off;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
gzip_buffers 32 8k;
gzip_types
text/html
application/javascript
text/javascript
text/css
text/xml
application/atom+xml
application/json
application/xml;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/sites-enabled/app::
upstream app_server {
server localhost:8000 fail_timeout=0;
}
server {
server_name server.org;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log info;
keepalive_timeout 5;
client_max_body_size 20M; # file upload size
root /var/www/;
location /media/admin {
alias /usr/local/src/django/django/contrib/admin/media/;
}
location /media {
alias /usr/local/media/app/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server;
break;
}
}
}
Next start the application server listening on the specified host:port (in this example, `localhost:8000`).
You can technically just run the django development server::
python manage.py runserver 127.0.0.1:8000
But that's not a good practice for deploying production sites. Instead we can use a gunicorn wsgi server with an asynchronous event handler::
gunicorn_django --log-file=/tmp/app.log -w 3 -k gevent /usr/local/src/project/app/settings.py -u www-data -b 127.0.0.1:8000 --daemon
Finally, in order to ensure that the gunicorn process starts automatically, create an init script; A fairly comprehensive solution for managing multiple gunicorn servers can be found at `gunicorn-init `_. If you need to manage mutiple servers in different virtual environments, take a look at `this init script `_ for some ideas.