Cara Deploy Flask Menggunakan Gunicorn, Supervisord, dan Apache2

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

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1>Hello World!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

# file gunicorn.conf.py

bind = "127.0.0.1:8300"
workers = 4

# file wsgi.py

from app import app

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


[program:myappflask]
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 myappflask
$ sudo supervisorctl status
myappdjangogunicorn              RUNNING   pid 4739, uptime 0:27:22

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


127.0.0.1 localhost
127.0.0.1 myappflask.vhost

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


<VirtualHost *:80>
    ServerName www.myappflask.vhost
    ServerAlias myappflask.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:8300$1 [P]
    ProxyPassReverse / http://127.0.0.1:8300/

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

</VirtualHost>

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


$ sudo a2ensite myappflask.vhost
$ sudo service apache2 restart

Sekarang mari kita lihat hasilnya di web browser:

Deploy flask di apache2, supervisord, dan gunicorn

Deploy flask di apache2, supervisord, dan gunicorn

Itulah cara pengaturan singkat Flask 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