Cara Deploy Django Menggunakan Gunicorn, Supervisord, dan Apache2

Berbeda dengan penggunaan Mod_wsgi untuk menjadi jembatan Apache2 yang harus kita pasang modul tersebut terlebih dahulu. Sekarang kita akan mencoba melakukan deployment Django dengan menggunakan Gunicorn yang akan di-proxy oleh Apache2. Gunicorn adalah sebuah http web server untuk aplikasi berbasis WSGI. Gunicorn sendiri merupakan salah satu proyek yang terinspirasi dari Unicorn untuk Ruby. Gunicorn akan menjalankan aplikasi Django kita di port berbeda dengan port 80 yang digunakan oleh Apache2. Kemudian Apache2 akan mem-proxy port Gunicorn tersebut untuk dapat diakses keluar melalui port 80. Selain itu kita akan menggunakan Supervisord sebagai watchdog yang akan membantu kita menyalakan Gunicorn secara otomatis bila service Gunicorn mati. Supervisord ini berbasis Python.

Sebagai langkah pertama, mari kita install Gunicorn di ubuntu (atau varian unix lainnya):


$ sudo apt-get install gunicorn
$ gunicorn
usage: gunicorn [OPTIONS] [APP_MODULE]
gunicorn: error: No application module specified.

Lalu kita pasang juga Supervisord dengan menggunakan bantuan pip python:


$ sudo pip install supervisor
$ sudo supervisorctl help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

Anggaplah ada sebuah folder aplikasi Django dengan nama myapp sekarang kita harus membuat folder static terlebih dahulu di dalam folder myapp. Kemudian tunjuk folder static dengan menambahkan kode konfigurasi di file myapp/myapp/settings.py:


STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

Sekarang jalankan perintah berikut untuk mengumpulkan file – file static:


$ cd myapp
$ python manage.py collectstatic

Buat sebuah file dengan nama gunicorn.conf.py di dalam folder myapp dan isi dengan kode konfigurasi berikut:


bind = "127.0.0.1:8200"
workers = 4

Untuk menjaga Gunicorn dengan Supervisord, kita harus membuat file dengan nama myappdjangogunicorn.conf di dalam folder /etc/supervisor/conf.d. Buat file tersebut dengan kode konfigurasi berikut:


[program:myappdjangogunicorn]
command=/usr/local/bin/gunicorn myapp.wsgi:application -c /home/user/path-to-project/myapp/gunicorn.conf.py
directory=/home/user/path-to-project/myapp
user=www-data
autostart=true
autorestart=true
redirect_stderr=true

Sekarang mari kita aktifkan program Supervisord tersebut dengan perintah berikut:


$ sudo supervisorctl update
$ sudo supervisorctl start myappdjangogunicorn
$ sudo supervisorctl status
myappdjangogunicorn              RUNNING   pid 4739, uptime 0:27:22

Setelah selesai mengumpulkan file dan folder static, dan mengatur Gunicorn dan Supervisord, sekarang kita tambahkan server name baru dengan nama myappdjangogunicorn.vhost. Mari kita edit /etc/hosts:


127.0.0.1 localhost
127.0.0.1 myappdjangogunicorn.vhost

Lalu buat file baru dengan nama myappdjangogunicorn.conf atau apapun terserah namanya di /etc/apache2/sites-available kemudian copy kode konfigurasi berikut:


<VirtualHost *:80>
    ServerName www.myappdjangogunicorn.vhost
    ServerAlias myappdjangogunicorn.vhost

    DocumentRoot /home/user/path-to-project/myapp

    <Directory /home/user/path-to-project/myapp/static>
           Require all granted
        </Directory>

    # serve static files from Apache
    RewriteEngine on
    RewriteRule ^/static/.* - [L]

    # proxy everything else to the gunicorn process
    ProxyPreserveHost on

    RewriteRule ^(.*)$ http://127.0.0.1:8200$1 [P]
    ProxyPassReverse / http://127.0.0.1:8200/

    ErrorLog ${APACHE_LOG_DIR}/myappdjangogunicorn-error.log
    CustomLog ${APACHE_LOG_DIR}/myappdjangogunicorn-access.log combined

</VirtualHost>

Ingat, maksud dari /home/user/path-to-project/ adalah direktori dimana folder aplikasi django myapp berada. Sesuaikan dengan folder Django Anda sendiri. Mari kita aktifkan virtual host myappdjangogunicorn.vhost dengan perintah dibawah ini:


$ sudo a2ensite myappdjangogunicorn.vhost
$ sudo service apache2 restart

Sekarang mari kita lihat hasilnya di web browser. Anda dapat melihat ada logo beberapa stack yang terdeteksi oleh web browser dengan bantuan plugin Wappalyzer:

contoh halaman index django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

contoh halaman index django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

contoh halaman login admin django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

contoh halaman login admin django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

contoh halaman admin django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

contoh halaman admin django yang sudah dideploy dengan menggunakan apache2, supervisord, dan gunicorn

Sedangkan berikut adalah hasil Apache Benchmark terhadap setting ini dengan request sebanyak 1000 dan konkurensi sebanyak 100 terhadap URL http://myappdjangogunicorn.vhost/admin:


$ ab -n 1000 -c 100 http://myappdjangogunicorn.vhost/admin
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking myappdjangogunicorn.vhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        gunicorn/19.4.5
Server Hostname:        myappdjangogunicorn.vhost
Server Port:            80

Document Path:          /admin
Document Length:        0 bytes

Concurrency Level:      100
Time taken for tests:   0.683 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      215901 bytes
HTML transferred:       0 bytes
Requests per second:    1464.40 [#/sec] (mean)
Time per request:       68.287 [ms] (mean)
Time per request:       0.683 [ms] (mean, across all concurrent requests)
Transfer rate:          308.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   2.5      0       9
Processing:     9   64  10.0     67      85
Waiting:        8   64  10.0     67      81
Total:         15   65   8.3     67      85

Percentage of the requests served within a certain time (ms)
  50%     67
  66%     68
  75%     69
  80%     69
  90%     71
  95%     73
  98%     75
  99%     76
 100%     85 (longest request)

Itulah cara pengaturan singkat Django dengan menggunakan Apache2, Supervisord, dan Gunicorn. Semoga berhasil mengikuti tutorial ini :D.

Referensi:

  • https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-ubuntu-14-04
  • http://blog.mattwoodward.com/2015/11/python-27-django-apache-and-gunicorn-on.html
  • https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-14-04
  • https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-django-with-postgres-nginx-and-gunicorn
  • http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/

Leave a Reply