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