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:
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:
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:
di level django:
Jika dalam aplikasi django ada url dengan format
maka django akan meredirect ke
yang kemudian nginx akan melakukan internal redirection ke
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:
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:
Comments
Post a Comment