Web App dengan Python Flask, Nginx dan uwsgi.

Update April 2018:

Dengan Docker, proses persiapan dan deploy jauh lebih gampang. Tutorial/repo yang dapat digunakan: https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/

Walapun sempat mengerjakan beberapa proyek dengan PHP, pengalaman saya membuat web app dengan PHP ternyata tidak menyenangkan. Pernah coba menggunakan Java, tapi menurut saya terlalu rumit untuk web app. Sejalan dengan eksplorasi saya belajar Python untuk keperluan datamining, maka sekalian saja menggunakan Python untuk membuat applikasi web, baik frontend maupun untuk RestFul-API.

Di posting sebelumnya saya mencoba membuat sendiri dari nol, tapi ternyata rawan kesalahan. Setelah lihat-lihat beberapa framework, menurut saya yang paling menarik adalah Flask (http://flask.pocoo.org/).  Seperti biasa, saya share di blog ini untuk catatan pribadi dan mudah-mudahan bermanfaat bagi pemula seperti saya.

Saya menggunakan instance Ubuntu AWS  dengan client Windows+Putty.  Pertama siapkan port forwarding agar kita bisa mencoba app dengan aman via SSH.  Di Putty, pilih settings->connection-SSH-tunnels. Saya forward port 5000, jangan lupa klik add (gambar bawah). Simpan session supaya tidak perlu mengeset berulangkali.

tunnel

Pertamakali yang perlu dilakukan adalah install pip, tools untuk menginstall lib python.

sudo apt-get update
sudo apt-get install python-pip

Kemudian install nginx sebagai webserver

sudo apt-get install nginx

Pastikan port 80 sudah dibuka (kalau digital ocean dibuka, tapi kalau AWS defaultnya ditutup),  dan buka alamat server kita di browser, harusnya pesan bahwa nginx sudah terinstall akan keluar.

Selanjutnya kita akan menginstall virtual environment (virtualenv). Ini penting dan wajib karena memungkinkan kita menginstall lib Python untuk suatu proyek  yang terisolasi dengan proyek lainnya. Tanpa virtualenv, install lib bisa membuat proyek lain jadi tidak jalan (pengalaman pahit pribadi hehe).

sudo pip install virtualenv 

Selanjutnya buat directory project dan masuk.

mkdir myproject
cd myproject

Dalam direktori ini set virtual env dengan:

 virtualenv myproject-env 

untuk mengaktivasi virtual env ini, gunakan

source myproject-env/bin/activate 

perhatikan prompt akan berubah. Sekarang kalau kita jalankan pip, maka lib tersebut akan terinstall di virt env ini saja (myproject/myproject-env).  Tapi kalau installnya lewat apt-get tetap berlaku untuk semua.

Untuk mengetest, coba jalankan

 which python 

maka yang muncul adalah lokasi Python di myproject. Untuk menonaktifkan virt env ini,  ketik  deactivate (tapi jangan lakukan dulu sekarang).

Selanjutnya install Flask dan uwsgi. Flask untuk framework, sedangkan uwsgi untuk koneksi dengan nginx.

 pip install uwsgi flask 

Selanjutnya kita akan membuat code sederhana hello world.

from flask import Flask
from werkzeug.serving import run_simple
app = Flask(__name__)

@app.route("/")
def beranda():
     return "Hello World"

if __name__ == '__main__':
     run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True, use_evalex=True)

Jalankan

 python myapp.py 

dan buka browser dengan alamat  http://localhost:5000/  maka di browser akan muncul “Hello World” (jika menggunakan putty, pastikan tunneling sudah benar).  Jika code diupdate maka otomatis akan dilakukan reload. Gampang kan 🙂

Inilah kelebihan Flask, sangat mudah untuk dijalankan dan didebug.  Tapi tentu jika sudah operasional cara seperti ini tidak cocok. Sekarang kita akan menghubungkan app ini dengan web server nginx melalui uwsgi.

Pertama buat konfigurasi wsgi dulu, buat file uwsgi-myproject.ini dengan isi sebagai berikut:

Catatan: Sesuaikan path lokasi project di variabel home. Pastikan nama directory virtenv sudah cocok.

[uwsgi]
home = /home/ubuntu/myproject
wsgi-file = %(home)/myapp.py
socket = 127.0.0.1:3033
callable = app
module = app
daemonize = %(home)/app.log
pidfile = %(home)/app.pid
virtualenv= %(home)/myproject-env

Sekarang kita perlu update nginx agar mendengarkan socket uwsgi.  Buka /etc/nginx/nginx.conf   (mungkin perlu sudo) lalu pada bagian  ” http { ” tambahkan konfigurasi server berikut:

http {
  ##
  # Basic Settings
  ##
  ...
  server {
    listen 80;
    location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3033; }
  }
}

Selanjutnya hapus page default nginx dan restart nginx.

sudo rm -v /etc/nginx/sites-enabled/default
sudo service nginx restart

Sekarang jalankan uwsgi project kita dengan cara

 uwsgi uwsgi-myproject.ini 

Sekarang buka di browser alamat server anda (bukan localhost:5000), yang tadinya ucapan default dari nginx harusnya akan berubah menjadi “Hello world” . Jika tidak, coba lihat catatan error di di file app.log (tail -10 app.log)

Untuk men-stop uwsgi, lakukan dengan (hati-hati, parameternya adalah app.pid bukan file uwsgi.ini):

 uwsgi --stop app.pid 

Tips: jika di-log keluar pesan seperti ini: “probably another instance of uWSGI is running on the same address”. Reset port dengan

 sudo fuser -k 3033/tcp 

Untuk mengaktifkan autoreload gunakan:

 uwsgi --py-autoreload 1 
Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google+

You are commenting using your Google+ account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

w

Connecting to %s