Cara Deploy Flask Python dengan uWSGI dan Nginx di CentOS 7

Diposting pada

EKSYAM.COM – Tutorial Cara Deploy Flask Python dengan uWSGI dan Nginx di CentOS 7 ini saya tulis untuk merangkum dan mengingat kembali cara setting Flask Python, uWSGI dan Nginx di CentOS 7 yang saya lakukan beberapa waktu yang lalu.

Dalam tutorial ini, kita akan menyiapkan aplikasi Python sederhana menggunakan framework Flask di CentOS 7. Sebagian besar artikel ini adalah tentang cara seting uWSGI untuk melaunching aplikasi dan Nginx untuk bertindak sebagai reverse proxy.

Saya tidak akan menjelaskan apa itu Flask, uWSGI, atau Nginx. Saya asumsikan kalian sudah mengetahuinya, dan mungkin dilain kesempatan akan dibahas terpisah. Jadi kita fokus pada cara setting Flask Python dengan uWSGI dan Nginx di CentOS 7 saja.

Topologi Flask Python dengan uWSGI dan Nginx di CentOS 7
Topologi Flask Python dengan uWSGI dan Nginx di CentOS 7

Install Komponen dari CentOS and Repository EPEL

Langkah pertama yaitu menginstal semua bagian yang dibutuhkan dari repositori. Kita perlu menambahkan repositori EPEL, yang berisi beberapa paket tambahan, untuk menginstal beberapa komponen yang kita butuhkan.

Kalian dapat mengaktifkan repo EPEL dengan mengetik:

sudo yum install epel-release

Selanjutnya instal paket yang dibutuhkan seperti pip , package manager python untuk menginstal dan mengelola komponen python. Instal juga compiler yang dibutuhkan untuk membuat uWSGI, serta Nginx dengan menjalankan perintah berikut:

sudo yum install python-pip python-devel gcc nginx

Buat Python Virtual Environment

Selanjutnya, kita akan menyiapkan virtual environment untuk mengisolasi aplikasi Flask dari file Python lain pada sistem dengan menginstal virtualenv menggunakan pip :

sudo pip install virtualenv

Sekarang, kita buat folder untuk aplikasi Flask, sebagai contoh saya buat folder appflask . Masuk ke folder setelah membuatnya dengan perintah:

mkdir ~/appflask
cd ~/appflask

Kita dapat membuat virtual environment untuk menyimpan requirement Python yang menggunakan Flask dengan mengetik:

virtualenv env

Ini akan menginstal salinan Python di local dan pip  ke direktori yang disebut env  dalam folder project appflask.

Sebelum kita menginstal aplikasi dalam virtual environment, kita perlu mengaktifkannya. dengan mengetik:

source env/bin/activate

Sekarang virtual environment sudah jalan, akan terlihat seperti ini(env)user@host:~/appflask$

Saat ini kita ada di virtual environment, selanjutnya menginstal Flask dan uWSGI dan mulai membuat aplikasi.

Instal Flask dan uWSGI

Kita dapat menggunakan pip  untuk menginstal Flask dan uWSGI. Ketik perintah berikut untuk menginstal dua komponen tersebut:

pip install uwsgi flask

Buat Aplikasi Menggunakan Flask

Kita sudah menginstal Flask, kita dapat membuat aplikasi sederhana. Meskipun aplikasi yang akan kalian deploy mungkin lebih kompleks, di contoh ini kita akan membuat aplikasi Flask dalam satu file, yang akan kita sebut appflask.py :

nano ~/appflask/appflask.py

Silahkan copy + paste kan script berikut.

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
    return "<h2 style='color:blue; text-align: center;'>Hello App Flask!</h2>"

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=5000)

Kita dapat menguji aplikasi Flask diatas dengan mengetik:

python appflask.py

Kunjungi nama domain atau alamat IP server dengan diikuti nomor port yang ditentukan dalam output terminal (default flask biasanya :5000 ) di browser web Anda. Selanjutnya buka di browser, harus kalian melihat seperti ini:

Hello App Flask!

Tekan CTRL-C di terminal beberapa kali untuk menghentikan running server Flask.

Buat WSGI Entry Point

Selanjutnya, kita akan membuat file yang akan berfungsi sebagai entry point untuk aplikasi yang dibuat. Ini akan memberi tahu server uWSGI berinteraksi dengan aplikasi. Buat file wsgi.py :

nano ~/appflask/wsgi.py

File ini sangat sederhana, kita cukup mengimpor Flask instance dari appflask.py  dan kemudian menjalankannya:

from appflask import application

if __name__ == "__main__":
    application.run()

Simpan dan tutup file.

Aplikasi sudah dibuat dan titik entry point sudah dibuat. Kita sekarang dapat beralih ke konfirgurasi uWSGI.

Testing uWSGI Serving

Hal pertama yang akan kita lakukan adalah tes untuk memastikan bahwa uWSGI dapat melayani aplikasi kita.

Kita dapat melakukan ini hanya dengan memberikannya nama entry point. Kita juga akan menentukan socket sehingga akan dimulai pada interface dan protokol yang tersedia untuk umum sehingga akan menggunakan HTTP alih-alih menggunakan uwsgi protokol biner. Jalankan perintah berikut diterminal:

uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi

Jika kita mengunjungi nama domain atau alamat IP server dengan menambahkan port :8000  di browser, kita akan melihat halaman yang terlihat seperti ini:

Hello App Flask!

Ketika semuanya berfungsi dengan baik, tekan CTRL-C di jendela terminal. Sekarang kita sudah selesai dengan virtual environment, sehingga kita dapat menonaktifkan virtual environment dengan perintah:

deactivate

Operasi apa pun sekarang akan dilakukan ke environment sistem Python bukan lagi virtual environment.

Membuat File Konfigurasi uWSGI

Kita telah menguji bahwa uWSGI dapat melayani aplikasi Flask, tetapi kita menginginkan sesuatu yang lebih kuat untuk penggunaan jangka panjang. Kita dapat membuat file konfigurasi uWSGI dengan opsi yang kita inginkan.

Mari kita letakkan pengaturan itu di direktori aplikasi yang kita buat dengan membuat file konfigurasi appflask.ini :

nano ~/appflask/appflask.ini

Simpan dengan mengisi settingan berikut:

[uwsgi]
module = wsgi

master = true
processes = 5

socket = appflask.sock
chmod-socket = 660
vacuum = true

die-on-term = true

Setelah selesai, simpan dan tutup file.

Buat Systemd Unit File

Bagian selanjutnya yang perlu kita tangani adalah Systemd service unit file. Membuat Systemd unit file akan memungkinkan sistem CentOS secara otomatis memulai uWSGI dan menjalankan aplikasi Flask setiap kali server melakukan booting.

Buat unit file yang diakhiri .service difolder /etc/systemd/system  seperti perintah berikut:

sudo nano /etc/systemd/system/appflask.service

Simpan dengan mengisi settingan berikut:

[Unit]
Description=uWSGI instance to serve appflask
After=network.target

[Service]
User=username
Group=nginx
WorkingDirectory=/home/username/appflask
Environment="PATH=/home/username/appflask/env/bin"
ExecStart=/home/username/appflask/env/bin/uwsgi --ini appflask.ini

[Install]
WantedBy=multi-user.target

Pada settingan di atas ganti username dengan username system kalian masing-masing. Simpan dan tutup sekarang.

Kita sekarang dapat memulai uWSGI service yang kita buat dan mengaktifkannya sehingga akan mulai saat booting:

sudo systemctl start appflask
sudo systemctl enable appflask

Konfigurasi Nginx ke Proxy Requests

Server aplikasi uWSGI sekarang sudah aktif dan berjalan, menunggu permintaan pada file socket di folder aplikasi flaskapp. Kita perlu mengkonfigurasi Nginx untuk mengirimkan permintaan web ke socket itu menggunakan uwsgi protokol.

Buka file konfigurasi default Nginx:

sudo nano /etc/nginx/nginx.conf

Tambahkan pengaturan berikut di atas settingan server{}  yang sudah ada.

server {
    listen          80;
    server_name     server_domain;

    location / {
        try_files $uri @appflask;
    }

    location @appflask {
        include uwsgi_params;
        uwsgi_pass unix:/home/username/appflask/appflask.sock;
        uwsgi_read_timeout 300;
    }
}

Ganti server_domain dengan domain atau IP kalian sendiri, dan ganti username  dengan username system kalian.

Pengaturan yang kita butuhkan untuk melayani aplikasi cukup itu. Simpan dan tutup file setelah selesai.

User nginx harus memiliki akses ke folder aplikasi kita untuk mengakses file socket disana. Secara default, CentOS mengunci direktori home masing-masing pengguna dengan sangat ketat, jadi kita akan menambahkan user nginx ke grup user kita sehingga dapat membuka izin yang diperlukan untuk memberikan akses.

Kalian dapat menambahkan user nginx ke grup user kalian dengan perintah berikut. Ganti username dengan username system kalian sendiri.

sudo usermod -a -G username nginx

Sekarang, kita dapat memberikan izin grup user kita pada folder home. Ini akan memungkinkan proses Nginx untuk masuk dan mengakses konten di dalam:

chmod 710 /home/username

Dengan permissions yang sudah diatur, kita dapat menguji file konfigurasi Nginx dari kesalahan sintaks dengan perintah berikut:

sudo nginx -t

Jika tidak ada response yang menunjukkan masalah, kita dapat memulai dan mengaktifkan proses Nginx sehingga akan mulai secara otomatis saat booting:

sudo systemctl start nginx
sudo systemctl enable nginx

Cek domain atau alamat IP server kalian di browser web, dan seharusnya kalian sudah melihat website sudah berjalan.

Hello App Flask!

Muncul? Beres, ya!!! 🙂