flask, uwsgi, nginx, macos Localhost setup - @kholidfu

Table of Contents

Terbiasa melakukan setup di lingkungan Linux, mencoba setup di lingkungan macos merupakan satu tantangan tersendiri. Semoga bermanfaat!

1 Flask design

Berikut ini struktur file aplikasi Flask yang saya buat.

~/git/blooms$ tree -L 2
.
|-- README.md
|-- app
|   |-- GeoLite2-Country.mmdb
|   |-- __init__.py
|   |-- assets
|   |-- command.py
|   |-- config.py
|   |-- forms.py
|   |-- models.py
|   |-- static
|   |-- templates
|   |-- utils.py
|   `-- views.py
|-- blooms.db
|-- requirements.txt
`-- wsgi.py

2 Install

2.1 nginx

Install nginx menggunakan brew

brew install nginx

2.2 uwsgi

Install uwsgi

pip install uwsgi

3 Setup

3.1 nginx

Berkas default diisi yang berkaitan dengan routing saja, untuk optimum performance tweak, caching dll, sebaiknya diisikan di nginx.conf. Buat direktori untuk log

sudo mkdir /Library/Logs/nginx

Buat berkas access.log

sudo touch /Library/Logs/nginx/access.log

Tes konfigurasi

sudo nginx -t

View access log

sudo tail -f /Library/Logs/nginx/access.log

3.2 nginx.conf

Sunting nginx.conf yang terletak di /usr/local/etc/nginx/nginx.conf

  • Uncomment baris berikut:
    log_format main '$remote_addr - ...
    
  • Uncomment access.log
    access_log /Library/Logs/nginx/access.log main;
    
  • Optimal setup performance
    http {
         # ... more default setup
         server {
         # ... more default setup
         client_body_buffer_size 10K;
         client_header_buffer_size 1k;
         client_max_body_size 8m;
         large_client_header_buffers 2 1k;
    
         client_body_timeout 12;
         client_header_timeout 12;
         keepalive_timeout 15;
         send_timeout 10;
    
         gzip             on;
         gzip_comp_level  2;
         gzip_min_length  1000;
         gzip_proxied     expired no-cache no-store private auth;
         gzip_types       text/plain application/x-javascript text/xml text/css application/xml;
    
         location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    	 expires 365d;
         }
    
         access_log off;
         }
    }
    
  • Tambahkan include
    include /usr/local/etc/nginx/sites-enabled/*;
    

3.3 Setting berkas konfigurasi default /usr/local/etc/nginx/sites-*

Karena direktori ini by default belum ada, mari kita bikin dulu.

mkdir -p /usr/local/etc/nginx/sites-{enabled,available}
touch -p /usr/local/etc/nginx/sites-available/default
cd ../sites-enabled
ln -s ../sites-available/default
emacs /usr/local/etc/nginx/sites-available/default

Isi berkas default dengan baris berikut:

server {
    listen 80;
    listen [::]:80;
    server_name localhost;

    location / {
	try_files $uri @app;
	proxy_pass http://127.0.0.1:8080;
    }

    location @app {
	include uwsgi_params;
	uwsgi_pass unix:/tmp/uwsgi.sock;
    }

    # serve static files with nginx
    location /assets {
	root /Users/macbookpro/git/blooms/app;
    }

}

4 Start nginx

Jalankan nginx menggunakan brew services:

brew services list
brew services start nginx

Kalau kedua cara di atas gagal, coba

brew services stop nginx
pkill nginx
# check config sudah benar belum
sudo nginx -t
# if no error
sudo nginx

5 Setup uwsgi

. bin/activate
pip install uwsgi

5.1 Buat berkas wsgi.py in Flask app root dir, which contain:

from app import app

if __name__ == "__main__":
    # sesuaikan port dengan konfig nginx
    # (default di macos port 8080, bisa dilihat di nginx.conf)
    app.run(debug=True, port=8080)

6 Jalankan uwsgi

Jalankan uwsgi dengan perintah berikut:

uwsgi --socket /tmp/uwsgi.sock --module wsgi --cale app --virtualenv ~/git/blooms/ --chdir ~/git/blooms --chmod-socket=666

7 Coba jalankan aplikasi Flask di browser

http://127.0.0.1

8 Referensi

Date: <2016-11-02 Wed>

Author: Kholid Fuadi

Created: 2016-11-05 Sat 10:09

Emacs 25.1.1 (Org mode 8.2.10)

Validate