Cara Deploy Falcon Menggunakan Gunicorn, Supervisord, dan Apache2

Hampir sama dengan cara deploy Flask menggunakan perkakas yang sama, kita akan mencoba melakukan deploy terhadap Falcon. Gunicorn akan menjalankan aplikasi Falcon 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.

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 Falcon dengan nama myapp di dalamnya terdapat sebuah file dengan nama app.py, wsgi.py, dan gunicorn.conf.py. Berikut isi file tersebut:


# file app.py

import falcon

class MainResource:
    def on_get(self, req, resp):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200  # This is the default status
        resp.body = '{"message": "Hello world!"}'

app = falcon.API()
main = MainResource()
app.add_route('/', main)

# file gunicorn.conf.py

bind = "127.0.0.1:8400"
workers = 4

# file wsgi.py

from app import app

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


[program:myappfalcon]
command=/usr/local/bin/gunicorn wsgi:app -c /path-to-project/myapp/gunicorn.conf.py
directory=/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 myappfalcon
$ sudo supervisorctl status
myappfalcon              RUNNING   pid 4739, uptime 0:27:22

Setelah selesai mengatur Gunicorn dan Supervisord, sekarang kita tambahkan server name baru dengan nama myappfalcon.vhost. Mari kita edit /etc/hosts:


127.0.0.1 localhost
127.0.0.1 myappfalcon.vhost

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


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

    DocumentRoot /path-to-project/myapp

    # serve static files from Apache
    RewriteEngine on

    # proxy everything else to the gunicorn process
    ProxyPreserveHost on

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

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

</VirtualHost>

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


$ sudo a2ensite myappfalcon.vhost
$ sudo service apache2 restart

Sekarang mari kita lihat hasilnya di web browser:

Falcon setelah dipasang di Apache2 dengan Gunicorn dan Supervisord

Falcon setelah dipasang di Apache2 dengan Gunicorn dan Supervisord

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

work in progress

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

Referensi:

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

Leave a Reply