Menggunakan Nginx sebagai Proxy untuk Aplikasi Web Flask

Berikut ini contoh nginx.conf untuk aplikasi Flask saya:

server {
  listen 80;
  server_name ip_address;
  location {
    proxy_pass http://127.0.0.1:8000;
  }
}

Dengan “hanya” menggunakan modal ini, Anda sudah dapat membuat aplikasi web Anda live, misal dengan menggunakan gunicorn:

gunicorn app.views:app -b 127.0.0.1:8000

Menggunakan konfigurasi di atas, berarti kita menggunakan nginx sebagai proxy, hal ini berarti jika kita ingin mendapatkan IP Host server, maka yang muncul adalah

127.0.0.1

Untuk mendapatkan IP server “asli”, kita perlu menambahkan baris di nginx config di atas:

proxy_set_header Host $host;

Dengan begitu, kita dapat mendapatkan IP asli host di Flask dengan:

request.headers.get("Host")

Ada juga kita ingin mendapatkan IP asli dari visitor, karena aplikasi kita di belakang proxy, maka ketika kita hanya akan mendapat IP 127.0.0.1 juga. Bagaimana kita mendapatkan real IP visitor?

Tambahkan baris berikut di nginx conf kita,

proxy_set_header HTTP_X_REAL_IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

Sehingga ketika kita ingin mendapatkan real IP visitor, kita dapat menggunakan:

request.headers.get("HTTP_X_REAL_IP")

atau

request.headers.get("X-Forwarded-For")

Sehingga, secara utuh, konfigurasi nginx.conf kita menjadi:

server {
 listen 80;
 server_name ip_address;
 location {
 proxy_set_header Host $host;
 proxy_set_header HTTP_X_REAL_IP $remote_addr;
 proxy_set_header X-Forwarded-For $remote_addr;
 proxy_pass http://127.0.0.1:8000;
 }
}

Demikian, sekelumit ilmu kecil tentang penerapan nginx sebagai proxy untuk aplikasi web Flask kita. Semoga bermanfaat…

Advertisements

Tunnelling ke Localhost Melalui SSH

Anda tahu layanan seperti ngrox, pagekite atau sejenisnya? Ya layanan ini berguna banget kalo misal kita ingin melakukan demo apa yang sudah kita lakukan di localhost biar bisa diakses secara online. Sayangnya, layanan mereka [mungkin semua] berbayar, kalau pun free, biasanya free trial, atau limit bandwidth.

Nah, sebenarnya hal ini bisa kita lakukan sendiri, syaratnya Anda harus punya server dengan IP Public, dan tentu saja, Anda harus punya akses root ke server. Caranya adalah sebagai berikut:

Di server:

edit /etc/ssh/sshd_config

Tambahkan baris berikut, di baris paling bawah:

GatewayPorts yes

Setelah itu restart ssh

sudo service ssh restart

Di PC local:

ssh -N -R *:0:localhost:5000 username@ip_server

Perintah ini, berarti kita ingin memforward localhost:5000 ke server dengan port yang diberikan setelah menekan enter perintah di atas. Respon server kurang lebih seperti ini:

Allocated port 53409 for remote forward to localhost:5000

Dan, sekarang ketika Anda membuka URL http://ip_server:53409, maka yang muncul adalah halaman localhost:5000

Selamat mencoba….

stormSSH untuk manajemen SSH

Ngelola banyak server? Bingung IP mana untuk server mana? Kasih nama aja, bisa dengan membuat alias di .bashrc atau kita gunakan tools seperti misalnya sshstorm ini.

pip install stormssh --user

Atau gunakan sudo pip install stormssh untuk install stormssh system-wide.

Jalankan perintah berikut untuk menambah daftar ssh kita

storm add master username@ipaddress

Atau kalau mau edit:

storm edit master username@ipaddress

Mau lihat list SSH kita?

storm list

Bye

 

Supervisord, Supervisorctl, Nginx, Gunicorn dan Django

Bingung mau ngasih judul apa, intinya saya mau setup django yang menggunakan gunicorn dan di run secara daemon menggunakan supervisor. Sebelumnya pastikan Anda sudah memasang supervisor di komputer (mengikuti tutorial dari sini):

pip install supervisor
echo_supervisord_conf > supervisord.conf

Jalankan supervisor

supervisor -c supervisord.conf

Jika tidak ada pesan kesalahan, sekarang tambahkan command gunicorn di bagian paling bawah dari file supervisord.conf tadi. Di saya berikut ini perintah untuk gunicorn:

[program:kesuwen]
command=/Users/macbookpro/git/kesuwen/bin/gunicorn --env DJANGO_SETTINGS_MODULE=/Users/macbookpro/git/kesuwen/app --pythonpath=/Users/macbookpro/git/kesuwen/ --bind=127.0.0.1:8000 app

Jalankan lagi supervisor, dan django + gunicorn sekarang sudah di run via supervisor. Anda dapat juga mencoba supervisorctl untuk fleksibilitas yang lebih, misalnya untuk start/stop program tertentu. Caranya adalah dengan sebelumnya masuk dulu ke console supervisorctl dengan mengetikkan perintah:

supervisorctl -c ~/supervisord.conf

Setelah masuk ke prompt, jalankan perintah berikut untuk start/stop program.

start kesuwen
stop kesuwen

Selamat mencoba

Mengganti IP Address Ubuntu Server 16.04

Seringkali jika kita order dedicated server, kita akan dapat IP address lebih dari satu, dan kadang karena pertimbangan tertentu, kita ingin mengganti IP ke IP lain. Bagaimana caranya?

Sunting berkas /etc/network/interfaces, sesuaikan IP address dengan yang baru kemudian jalankan perintah:

ifdown eth0; ifup eth0

Kalau sedang login via ssh, maka terminal session pasti nge-freeze, karena koneksi terputus, tidak apa-apa, tunggu beberapa saat kemudian lakukan login kembali menggunakan IP yang baru.

Jangan lupa untuk melakukan restart service2 yang terkait dengan IP lama, misal nginx, dan lain sebagainya.

Reference: Configure Networking on Ubuntu

Cara Setup nginx x-accel-redirect

Belum habis kagum dengan nginx pagespeed, barusan nemu salah satu fungsi lagi dari nginx untuk internal redirection. Contoh kasus penggunaan, kadang dalam sebuah proyek kita menyediakan file yang bisa diunduh oleh user, dan umumnya logic ini kita buat di level web app. Karena ini terkait dengan file, tentu dengan nginx kerja akan lebih efisien dan aplikasi web kita bisa bekerja untuk hal yang lain.

Continue reading “Cara Setup nginx x-accel-redirect”