Pada artikel Cara Install Flask di Ubuntu 16.04, Flask dijalankan dengan menggunakan developement server. Tutorial kali ini akan membahas tentang cara menjalankan Flask dengan menggunakan Gunicorn dikombinasikan dengan Nginx di distro Linux Ubuntu 16.04. Ini juga merupakan salah satu cara dalam deployment Flask di server online / VPS.
Gunicorn (Green Unicorn) adalah sebuah WSGI (Web Server Gateway Interface) HTTP Server untuk bahasa pemrograman Python. Gunicorn mengimplementasikan PEP3333 sebuah standar spesifikasi WSGI server sehingga dapat menjalankan aplikasi web Python yang juga mengimplementasikan standar tersebut. Misalnya framework Django, Flask, atau Bottle.

Penghubung pertama antara request dari browser pengunjung dengan aplikasi web dilayani oleh Nginx karena berjalan pada port 80, port default dari HTTP. Jika file yang direquest adalah file static seperti gambar, html, css, dan js atau disebut juga frontend maka tetap Nginx yang bekerja. Namun jika yang direquest adalah Flask atau backend maka Nginx menghubungi Gunicorn melalui reverse proxy atau unix-socket. Respon dari Flask dikirim ke Gunicorn lalu ke Nginx dan terakhir ditampilkan pada browser.
Install pip dan Nginx
Install pip dan Nginx jika menggunakan Python 2
1 | sudo apt-get install python-pip python-dev nginx |
Install pip dan Nginx jika menggunakan Python 3
1 | sudo apt-get install python3-pip python3-dev nginx |
Membuat Virtual Environment
Selanjutnya membuat virtual environment untuk mengisolasi aplikasi Flask dari Python sistem operasi utama.
Install virtualenv Python 2
1 | sudo pip install virtualenv |
Install virtualenv Python 3
1 | sudo pip3 install virtualenv |
Membuat folder project Flask
1 2 | mkdir ~/belajar-flask cd ~/belajar-flask |
Membuat virtualenv
Jika ingin menggunakan Python 2 pada virtualenv
1 | virtualenv -p python2 env |
Jika ingin menggunakan Python 3 pada virtualenv
1 | virtualenv -p python3 env |
Mengaktifkan virtualenv
1 | source env/bin/activate |
Menginstall Flask dan Gunicorn
1 | pip install flask gunicorn |
Membuat aplikasi Flask sederhana, menampilkan tulisan
1 | nano aplikasi.py |
Isinya
1 2 3 4 5 6 7 8 9 | from flask import Flask appku = Flask(__name__) @appku.route("/") def hello(): return "<h1>Belajar Flask</h1>" if __name__ == "__main__": appku.run(host='0.0.0.0') |
Menjalankan aplikasi FLask dengan development server
1 | python aplikasi.py |
Browsing http://localhost:5000.
Jika berhasil menampilkan tulisan Belajar Flask lanjut ke tahap berikutnya.
Membuat file WSGI
1 | nano wsgi.py |
Isinya
1 2 3 4 | from aplikasi import appku if __name__ == "__main__": appku.run() |
Menguji menjalankan aplikasi dengan Gunicorn
1 | gunicorn --bind 0.0.0.0:5000 wsgi:appku |
Nonaktifkan virtual environment
1 | deactivate |
Membuat service untuk aplikasi Flask
Service ini dibuat agar Gunicorn secara otomatis sejak boot menjalankan aplikasi Flask.
1 | sudo nano /etc/systemd/system/belajarflask.service |
Isinya
1 2 3 4 5 6 7 8 9 10 11 12 13 | [Unit] Description=Gunicorn untuk menjalankan aplikasi BelajarFlask After=network.target [Service] User=musa Group=www-data WorkingDirectory=/home/musa/belajar-flask Environment="PATH=/home/musa/belajar-flask/env/bin" ExecStart=/home/musa/belajar-flask/env/bin/gunicorn --workers 3 --bind unix:belajar-flask.sock -m 007 wsgi:appku [Install] WantedBy=multi-user.target |
Jalankan service dan enable agar aktif sejak boot
1 2 | sudo systemctl start belajarflask sudo systemctl enable belajarflask |
Konfigurasi Nginx
Tahap berikutnya mengkonfigurasi Nginx agar berkomunikasi dengan Gunicorn melalui proxy.
1 | sudo nano /etc/nginx/sites-available/belajarflask |
Isinya
1 2 3 4 5 6 7 8 9 | server { listen 80; server_name NOMOR_IP_ATAU_DOMAIN; location / { include proxy_params; proxy_pass http://unix:/home/musa/belajar-flask/belajar-flask.sock; } } |
Mengaktifkan virtual host/blok konfigurasi Nginx yang baru saja dibuat dengan membuat link ke sites-enabled.
1 | sudo ln -s /etc/nginx/sites-available/belajarflask /etc/nginx/sites-enabled |
Menguji apakah ada konfigurasi Nginx yang salah.
1 | sudo nginx -t |
Jika tidak ada kesalahan, restart service nginx
1 | sudo systemctl restart nginx |
Terakhir browsing http://IP_SERVER_ATAU_DOMAIN
selamat mencoba:)
referensi:
fullstackpython.com
digitalocean.com