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

Belajar Menerapkan Flask Configuration

Kondisi:

Server:

menggunakan mongodb authentication

Localhost:

mongodb tanpa authentication

Awalnya cukup merepotkan, karena harus melakukan hardcode, namun setelah baca-baca lagi, dokumentasi, ada teknik konfigurasi yang manjur.

app 
    --- __init__.py
    --- views.py
    --- config/
        --- config.py
        --- __init__.py

Didalam config.py, masukkan konfig berikut:

class Config(object):
    DEBUG = False

class ProductionConfig(Config):
    MONGODB_USERNAME = "username"
    MONGODB_PASSWORD = "password"

class DevelopmentConfig(Config):
    DEBUG = True

class TestingConfig(Config):
    TESTING = True

Kemudian di file __init__.py yang ada di direktori app, tambahkan baris berikut:

app.config.from_object('app.config.config.ProductionConfig')

Biar lebih modular lagi, saya disini menggunakan python-decouple, dan menambahkan di berkas .env saya

ENVIRON=app.config.config.ProductionConfig

Sehingga baris yang kita tambahkan di berkas __init__.py di direktori app tadi, berubah menjadi:

from decouple import config


app.config.from_object(config("ENVIRON"))

Tentunya Anda butuh menambahkan library python-decouple terlebih dahulu:

pip install python-decouple

Dan… success… Meski begitu, saya kurang tau apa ini termasuk best practice apa bukan, mohon bimbingan dan pencerahan dari pembaca sekalian..

 

Terima kasih..

 

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….

Pymongo Tips – Biar Data Bisa Digunakan Berulang di Flask Template

Biasanya, ketika menggunakan query seperti ini di pymongo

data = db.collection.find({"job": "programmer"})

return render_template("template.html", data=data)

Setelah di-looping sekali, variable data akan empty [], bagaimana jika kita ingin menggunakan berulang? Cukup bungkus statement di atas menjadi:

data = [i for i in db.collection.find({"job": "programmer"})]

Dan, sekarang data bisa digunakan berulang-ulang sesuai keinginan…

Happy coding..

Python Flask Send Raw HTTP Header Response

Kalau di PHP, Anda pasti mengenal fungsi

header("Location": "someurl")

Dari web PHP docs, fungsi ini untuk mengirim raw http header. Bagaimana melakukan hal tersebut di python Flask?

from flask import make_response
from app import app

@app.route("/")
def index():
    resp = make_response()
    resp.location = "http://someurl"
    resp.status = "301"
    return resp

Done

Data DateTime di MongoDB Tanpa MicroSecond

Kalau di MySQL, ketika insert datetime dengan format

datetime.datetime.now()

maka data yang masuk adalah tahun bulan hari jam menit detik” tanpa microsecond. Hal ini berbeda ketika kita memasukkan format datetime yang sama ke MongoDB, secara otomatis, waktu microsecond ikut tercatat. Bagaimana cara biar microsecond tidak usah ikut tercatat?

datetime.datetime.now().replace(microsecond=0)

Otomatis, data datetime akan masuk ke mongodb tanpa microsecond.

 

 

Posting ke WordPress Menggunakan Python WordPress XMLRPC

Berikut code snippet untuk melakukan posting ke WP:

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo
from wordpress_xmlrpc.methods import posts


wp = Client("http://localhost/xmlrpc.php", "admin", "admin")
# posts = wp.call(GetPosts())
# print(posts)
# users = wp.call(GetUserInfo())
# print(users)

post = WordPressPost()
post.title = "My new python title"
post.content = "This is the body of my new post."
post.terms_names = {
 "post_tag": ["test", "firstpost"],
 "category": ["Introductions", "Tests"]
 }
post.id = wp.call(NewPost(post))

post.post_status = "publish"
wp.call(posts.EditPost(post.id, post))

Kenapa wordpress? Karena platform ini terkenal SEO friendly.. Tinggal bagaimana kreativitas kita aja…

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

 

[FIX] Unlimited Scroll di Gnome Terminal

Entah kenapa ini GNOME terminal di Kali Linux kok gak bisa unlimited scroll, apa karena dulu saya install GNOME nya terpisah ya… Entahlah, yang jelas persoalan sudah terselesaikan…

Caranya dengan menginstall command gconftool-e yang ada di paket gconf2

sudo apt install gconf2

Kemudian jalankan perintah ini di Terminal:

gconf2 -t bool --set /apps/gnome-terminal/profiles/Default/scrollback_unlimited 1

Done