Django,

Django, Nginx dan Apache mod_wsgi di Ubuntu

Tanggal 24 Jul 2009
Kategori : Aplikasi Linux,Programming dan Framework
Tag : , , , ,

Artikel ini akan memberikan panduan untuk menjalankan aplikasi Django anda dengan menggunakan front end Nginx Web Server untuk file statik dengan upstream Apache dan mod_wsgi untuk menjalankan script python pada mesin Ubuntu 9.04 64 bit yang dapat anda miliki melalui Layanan VPS Magnet Hosting.

Mengapa Nginx Web Server?

Nginx Web Server sangat powerful dan jauh lebih hemat RAM dibandingkan Apache ketika melayani file statik seperti file gambar atau pun html, oleh sebab itu Nginx menjadi preferensi bagi website / aplikasi dengan traffic / load tinggi, baik berjalan sendiri maupun dipadukan dengan web server lain seperti Apache.

Mengapa Apache mod_wsgi?

Mod_wsgi memiliki overhead sampai dengan 50% lebih ringan dibandingkan mod_python, dan jauh lebih ringan dibandingkan CGI untuk menjalankan script python pada Web Server Apache. Dokumentasi teknis mengenai benchmark ini dapat dipelajari lebih lanjut di http://code.google.com/p/modwsgi/wiki/PerformanceEstimates. Atau melalui link berikut untuk perbandingan di aplikasi yang sudah berjalan http://collingrady.wordpress.com/2009/01/06/mod_python-versus-mod_wsgi/.

Mengapa Ubuntu?

Ubuntu apabila dibandingkan dengan distribusi linux lainnya memiliki kompilasi paket yang lebih maju, sebagai ilustrasi, versi python pada Ubuntu 9.04 adalah Python 2.6.2, sementara pada CentOS 5.3 memiliki versi Python 2.4.3. Hal ini merupakan salah satu alasan untuk menggunakan Ubuntu apabila anda membutuhkan dukungan Python dengan versi lebih baru. Karena pada semua distribusi Linux Python merupakan core software yang sangat sulit (atau tidak bisa) untuk diupgrade secara manual. Namun demikian, Django mendukung Python 2.3.x (dukungan terhadap Python 2.3.x akan ditarik oleh Django dalam waktu dekat) sehingga tetap tidak menjadi masalah apabila anda menggunakan CentOS untuk mendeploy aplikasi anda.

Update Ubuntu

Masukkan repository universe pada sources.list anda.

sudo nano /etc/apt/sources.list

Sesuaikan dengan isi file anda, seperti contoh berikut;

deb http://ubuntu.indika.net.id jaunty main universe
deb http://security.ubuntu.com/ubuntu jaunty-security main universe

Update Ubuntu

sudo aptitude update

Instalasi Build Essential

sudo aptitude install build-essential

Instalasi Apache dan mod_wsgi

sudo aptitude install apache2 apache2.2-common apache2-mpm-worker apache2-threaded-dev libapache2-mod-wsgi python-dev

Konfigurasi Apache

Sesuaikan direktif timeout dan matikan KeepAlive

sudo nano /etc/apache2/apache2.conf
Timeout 60
KeepAlive Off

Modifikasi konfigurasi security di conf.d (opsional)

sudo nano /etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
TraceEnable Off

Restart Apache

sudo apache2ctl graceful

Hapus default site bawaan dari instalasi awal

sudo a2dissite 000-default

Ubah port listening dan port virtual host Apache menjadi 8080, Nginx yang akan melayani port 80, sementara request untuk script Python akan di proxy ke port 8080 (Apache);

sudo nano /etc/apache2/ports.conf
NameVirtualHost *:8080
Listen 8080

Restart Apache

sudo apache2ctl graceful

Instalasi Nginx

sudo aptitude install nginx

Instalasi dengan menggunakan aptitude akan membuat file konfigurasi berada di /etc/nginx. Pada Ubuntu 9.04, versi Nginx yang digunakan adalah 0.6.35, sementara versi stable terbaru pada saat tulisan ini dibuat adalah 0.7.61, anda bisa melakukan kompilasi sendiri apabila anda membutuhkan Nginx dengan versi yang lebih baru.

Start Nginx

sudo /etc/init.d/nginx start

Hapus konfigurasi default virtual host dari Nginx

sudo rm -f /etc/nginx/sites-enabled/default

Layout Nginx hasil instalasi ini mirip dengan Apache, untuk Virtual Host anda akan memiliki dua direktori yaitu sites-available dan sites-enabled, di dalam sites-enabled (seperti halnya Apache di Ubuntu) berisi symbolic link ke file yang berada di dalam sites-available. File konfigurasi virtual host sites-enabled ini yang nantinya akan ikut dipanggil ketika Nginx dijalankan.

Sesuaikan konfigurasi utama Nginx

sudo nano /etc/nginx/nginx.conf

di root konfigurasi

worker_processes  4;     <--- sesuaikan dengan jumlah core di dalam server anda

di dalam http {}

keepalive_timeout  2;
tcp_nopush on;

gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

Buat file proxy.conf yang akan dipanggil oleh konfigurasi Virtual Host Nginx.

sudo nano /etc/nginx/proxy.conf
proxy_redirect              off;
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       90;
proxy_send_timeout          90;
proxy_read_timeout          90;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

Restart Nginx

sudo /etc/init.d/nginx restart

Instalasi Subversion

Kita membutuhkan subversion karena Django yang akan kita gunakan adalah versi SVN.

sudo aptitude install subversion

Instalasi Django

Pada Python 2.6 di Ubuntu, modul tambahan tidak lagi di letakkan di sites-package, melainkan di dist-packages, hal ini mungkin akan membingungkan bagi anda yang terbiasa menggunakan Python ver 2.5 ke bawah.

cd /usr/lib/python2.6/dist-packages
sudo svn co http://code.djangoproject.com/svn/django/tags/releases/1.0.2/django django
sudo ln -s /usr/lib/python2.6/dist-packages/django/bin/django-admin.py /usr/local/bin/django-admin.py

Menyiapkan Virtual Host

Layout direktori berikut dapat disesuaikan dengan selera kita, pada intinya kita akan menyiapkan direktori untuk Nginx (Media Files), Apache (handler WSGI) dan untuk aplikasi Django kita yang dibuat melalui django-admin.py startproject <namaproject>. Sesuaikan semua keterangan di dalam <keterangan> dengan kondisi anda.

cd ~
mkdir /home/<username>/public_html
mkdir -p /home/<username>/public_html/<domain name>
mkdir -p /home/<username>/public_html/<domain name>/private
mkdir -p /home/<username>/public_html/<domain name>/logs

Aplikasi Django kita akan berada di dalam /home/<username>/public_html/<domain name>

Berikan permission kepada web server (baik Nginx maupun Apache akan berjalan sebagai user www-data), tambahkan username kita atau yang akan digunakan ke dalam group web server / www-data

sudo usermod -a -G www-data <username>

Ubah group ownership dari layout direktori dan berikan permission yang sesuai seperti contoh berikut;

sudo chgrp -R www-data /home/<username>/public_html
sudo chmod -R 2750 /home/<username>/public_html
sudo chmod -R 2770 /home/<username>/public_html/<domain name>/private

Instalasi Aplikasi Django

Start Django project, atau pindahkan file anda apabila sudah ada

cd /home/<username>/public_html/<domain name>
django-admin.py startproject <django_project_name>

Buat file .wsgi yang akan dipanggil oleh Apache mod_wsgi

mkdir -p /home/<username>/public_html/<domain name>/<django project name>/apache
cd /home/<username>/public_html/<domain name>/<django project name>/apache
sudo nano <django project name>.wsgi
import os, sys

apache_configuration= os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace) 

sys.path.append('/usr/lib/python2.6/dist-packages/django/')
sys.path.append('/home/<username>/public_html/<domain name>/<django project name>')

os.environ['DJANGO_SETTINGS_MODULE'] = '<django project name>.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Buat symbolic link untuk file media interface admin

sudo ln -s /usr/lib/python2.6/dist-packages/django/contrib/admin/media /home/<username>/public_html/<domain name>/<django project name>/media/admin]

Sesuaikan settings.py untuk Django Project anda

sudo nano settings.py
ADMIN_MEDIA_PREFIX = '/media/admin/'
.
.
.
MIDDLEWARE_CLASSES = (
'django.middleware.http.SetRemoteAddrFromForwardedFor',
)

Virtual Host Nginx

sudo nano /etc/nginx/sites-available/<namadomainanda.com>
upstream backend {
 server 127.0.0.1:8080;
}

server {
 listen   <ip.address.anda>:80;
 server_name www.<domain name> <domain name>;

 access_log /home/<username>/public_html/<domain name>/logs/nginx_access.log;
 error_log /home/<username>/public_html/<domain name>/logs/nginx_error.log;

 location / {
 proxy_pass  http://backend;
 include     /etc/nginx/proxy.conf;
 }

 location  /media/ {
 root /home/<username>/public_html/<domain name>/<django project name>/;
 }
}

Aktifkan konfigurasi Virtual Host tersebut dan restart Nginx

sudo ln -s /etc/nginx/sites-available/<domain name> /etc/nginx/sites-enabled/<domain name>
sudo /etc/init.d/nginx restart

Virtual Host Apache

sudo nano /etc/apache2/sites-available/<domain name>
<VirtualHost *:8080>
 #Basic setup
 ServerAdmin <admin email>
 ServerName www.<domain name>
 ServerAlias <domain name>

 <Directory /home/<username>/public_html/<domain name>/<django project name>/apache/>
 Order deny,allow
 Allow from all
 </Directory>

 LogLevel warn
 ErrorLog  /home/<username>/public_html/<domain name>/logs/apache_error.log
 CustomLog /home/<username>/public_html/<domain name>/logs/apache_access.log combined

 WSGIDaemonProcess <domain name> user=www-data group=www-data threads=25
 WSGIProcessGroup <domain name>

 WSGIScriptAlias / /home/<username>/public_html/<domain name>/<django project name>/apache/<django project name>.wsgi
</VirtualHost>

Aktifkan konfigurasi tersebut dan restart Apache

sudo a2ensite <domain name>
sudo /etc/init.d/apache2 reload

Reload WSGI Daemon Mode

Konfigurasi di atas akan menjalankan mod_wsgi dalam moda Daemon, dengan demikian apabila anda melakukan perubahan script, silahkan di touch file .wsgi nya agar group proses wsgi akan direload ulang, dengan demikian anda tidak perlu mereload / restart Apache setiap terjadi perubahan script.

sudo touch /home/<username>/public_html/<domain name>/<django project name>/apache/<djangoproject>.wsgi

Referensi

  • http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/
  • http://code.google.com/p/modwsgi/
Situs ini dibuat dengan memanfaatkan Teknologi Open Source Wordpress, Nginx, 960 Grid System dan Linux CentOS.
Isi dari situs diutamakan untuk membantu Pengguna Layanan Magnet Hosting dalam memanfaatkan layanannya, disediakan tanpa jaminan, dapat dimanfaatkan, diperbanyak ataupun ditulis kembali dengan resiko masing-masing.
Copyright PT. Indonesia Digital Media © 2008-2009. (Top)