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.

Ada dua macam kasus, pertama internal redirect untuk melayani file yang jadi satu dengan server web, atau bisa juga untuk melayani file yang ada di remote host. Mari kita lihat contoh kode di nginx.conf untuk kasus I:

location /protected_files {
    internal;
    alias /home/ubuntu;
 }
location / {
    ...
}

Untuk kasus di atas, url /protected_files/image.jpg akan di handle oleh nginx dengan mencari file di direktori /home/ubuntu/image.jpg (bisa juga dengan menggunakan directive root).

Sekarang mari kita lihat contoh di django app/views.py untuk fungsi redirect-nya:

def download(request, fpath):
    response = HttpResponse()
    redirect_path = "/protected_files/{}".format(fpath)
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] = redirect_path
    response['X-Accel-Buffering'] = 'yes'
    return response

Jika dalam aplikasi kita ada url /download/image.jpg, maka django akan melakukan redirect ke /protected_files/image.jpg di mana kemudian nginx akan mencari di direktori dengan path /home/ubuntu/image.jpg

Contoh kasus II:

location ~* /redir/(.*) {
    internal;
    resolver 8.8.8.8;
    proxy_pass http://$1;
 }

di level django:

def download(request, url):
    response = HttpResponse()
    redirect_path = "/redir/{}".format(url)
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] = redirect_path
    response['X-Accel-Buffering'] = 'yes'
    return response

Jika dalam aplikasi django ada url dengan format

/download/mslib.co/path/to/image.jpg

maka django akan meredirect ke

/redir/mslib.co/path/to/image.jpg

yang kemudian nginx akan melakukan internal redirection ke

mslib.co/path/to/image.jpg

Bagi yang suka bermain dengan hotlink, ini bisa menjadi alternatif solusi untuk masking agar tidak terlihat melakukan hotlink, dan karena secara default dibantu nginx cache, maka remote host tidak akan terlalu dirugikan.

Reference:

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s