Menyimpan Video Youtube Pakai Squid3 dan Nginx
Assalamu'alaikum warahmatullahi wabarakatuh,
Selamat malam semuanya. Bagaimana malam minggunya? Semoga semuanya dapat merasakan bahagia bersama orang-orang yang kita sayangi, aamiin. Malam ini saya akan membagikan sebuah resep utamanya untuk para proxier yang selalu dikeluhkesahi oleh pengguna-pengguna proxy-nya tentang kecepatan buffering video dari YouTube. Sudah menjadi fakta bahwa YouTube merupakan penyedia materi multimedia yang paling sering diakses saat ini. Kekuatan jaringan data Google memang sangat membantu meningkatkan kepopuleran YouTube.
Meskipun demikian, kepopuleran YouTube ini berimbas pula pada ketersediaan jalur data atau bandwidth. Di banyak negara berkembang permintaan akan akses materi multimedia YouTube umumnya kurang terakomodasi oleh kekuatan jalur data yang ada. Jika anda sedang berada di Jepang atau Korea mungkin anda tidak akan merasakan lambatnya proses pengunduhan video dari YouTube. Akan tetapi minimnya infrastruktur jaringan tersebut bukanlah alasan untuk penggemar video online dan akhirnya muncullah Lusca.
LUSCA
Lusca adalah sebuah tambahan pada Squid 2.x untuk membuat squid proxy menyimpan dan mengubah alamat seluruh berkas video yang sedang disaksikan oleh pengguna proxy sehingga jika video tersebut dibuka kembali di lain waktu, squid tidak perlu mengambilnya kembali dari internet. Teknik ini mengimplementasikan sebuah algortima untuk menterjemahkan alamat video hasil penyandian YouTube sehingga jika berkas video tersebut dibuka kembali, meskipun akan berasal dari squid, pengguna akan melihat bahwa video yang dilihatnya berasal dari YouTube. Sayangnya Lusca belum tersedia untuk squid3. Pilihannya hanya gunakan squid2 atau tidak pakai lusca.
Tetapi pengguna squid3 janganlah terlalu gusar dengan keputusan pengembang lusca yang masih belum menyediakan plugin ini untuk squid3. Toh squid3 juga masih tergolong baru. Masih ada kesempatan lain. Dan satu hal lagi, masih ada cara yang lain kok. Sesuai judul artikel ini, ternyata kita bisa memanfaatkan NGINX untuk melakukan hal yang mirip dengan lusca.
Simpan dengan Nginx
Sejatinya Nginx adalah sebuah program web server ringan yang menurut saya dapat menyaingi kualitas Apache HTTPD. Dalam kasus ini, kenapa kita pilih nginx? Ya karena ukurannya yang lebih kecil jika dibandingkan dengan Apache2. Di slackware saya, Apache2 berukuran 10MB sedangkan Nginx cuma 1MB. Toh yang kita butuhkan saat ini hanyalah fitur proxy dari nginx. Lagipula sumber daya sistem yang digunakan oleh nginx lebih kecil daripada Apache2. Jadi sepertinya sepertinya terlalu berlebihan jika menggunakan Apache2 hanya untuk menyediakan alamat palsu YouTube.
Baik kita mulai saja. Hal pertama yang harus kita lakukan adalah menginstal nginx. Pengguna slackware dapat menggunakan skrip SlackBuild dari SlackBuilds.org atau menggunakan skrip SlackBuild punya saya. Setelah instalasi kita harus mengganti konfigurasi nginx.conf menggunakan konfigurasi berikut:
# This config file is not written by me,
# My Email address is inserted Just for tracking purposes
# For more info, visit http://code.google.com/p/youtube-cache/
# Syed Jahanzaib / aacable [at] hotmail.com
# Modified for Slackware by Widya Walesa <walecha99_[at]_gmail_dot_com
user nobody;
worker_processes 8;
pid /var/run/nginx/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_static on;
gzip_comp_level 6;
gzip_disable .msie6.;
gzip_vary on;
gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;
gzip_proxied expired no-cache no-store private auth;
gzip_buffers 16 8k;
gzip_http_version 1.1;
#include /etc/nginx/conf.d/*.conf;
# starting youtube section
server {
listen 127.0.0.1:8081;
location / {
root /var/www/nginx/files;
#try_files "/id=$arg_id.itag=$arg_itag" @proxy_youtube; # Old one
#try_files "$uri" "/id=$arg_id.itag=$arg_itag.flv" "/id=$arg_id-range=$arg_range.itag=$arg_itag.flv" @proxy_youtube; #old2
try_files "/id=$arg_id.itag=$arg_itag.range=$arg_range.algo=$arg_algorithm" @proxy_youtube;
}
location @proxy_youtube {
resolver IP.DARI.DNS.ANDA;
proxy_pass http://$host$request_uri;
proxy_temp_path "/var/www/nginx/tmp";
#proxy_store "/usr/local/www/nginx_cache/files/id=$arg_id.itag=$arg_itag"; # Old 1
proxy_store "/var/www/nginx/files/id=$arg_id.itag=$arg_itag.range=$arg_range.algo=$arg_algorithm";
proxy_ignore_client_abort off;
proxy_method GET;
proxy_set_header X-YouTube-Cache "nama.anda@domain.siapa";
proxy_set_header Accept "video/*";
proxy_set_header User-Agent "YouTube Cacher (nginx)";
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "";
proxy_set_header Accept-Charset "";
proxy_set_header Cache-Control "";
}
}
}
Setelah itu kita perlu menyiapkan direktori-direktori yang diperlukan oleh proxy nginx ini:
$ mkdir -p /var/www/nginx/files /var/www/nginx/tmp $ chmod 777 /var/www/nginx/files /var/www/nginx/tmp
Kemudian jalankan nginx dan cek apakah nginx sudah berjalan atau belum:
$ /etc/rc.d/rc.nginx start $ netstat -nlp -t tcp | grep nginx
Jika sudah siap, kita dapat menyiapkan skrip ruby yang digunakan sebagai program penulis ulang alamat oleh squid:
$ mkdir -p /etc/squid/nginx.rb $ nano /etc/squid/nginx.rb
Isikan skrip ruby berikut ke file tersebut dan simpan
#!/usr/bin/env ruby
# This script is not written by me,
# My Email address is inserted Just for tracking purposes
# For more info, visit http://code.google.com/p/youtube-cache/
# Syed Jahanzaib / aacable [at] hotmail.com
# Modified for Slackware by Widya Walesa <walecha99_[at]_gmail_dot_com
# url_rewrite_program <path>/nginx.rb
# url_rewrite_host_header off
require "syslog"
require "base64"
class SquidRequest
attr_accessor :url, :user
attr_reader :client_ip, :method
def method=(s)
@method = s.downcase
end
def client_ip=(s)
@client_ip = s.split('/').first
end
end
def read_requests
# URL <SP> client_ip "/" fqdn <SP> user <SP> method [<SP> kvpairs]<NL>
STDIN.each_line do |ln|
r = SquidRequest.new
r.url, r.client_ip, r.user, r.method, *dummy = ln.rstrip.split(' ')
(STDOUT << "#{yield r}\n").flush
end
end
def log(msg)
Syslog.log(Syslog::LOG_ERR, "%s", msg)
end
def main
Syslog.open('nginx.rb', Syslog::LOG_PID)
log("Started")
read_requests do |r|
if r.method == 'get' && r.url !~ /[?&]begin=/ && r.url =~ %r{\Ahttp://[^/]+\.youtube\.com/(videoplayback\?.*)\z}
log("YouTube Video [#{r.url}].")
"http://127.0.0.1:8081/#{$1}"
else
r.url
end
end
end
main
Lalu ubah mode aksesnya agar dapat dieksekusi
$ chmod +x /etc/squid/nginx.rb
Sekarang masuk ke konfigurasi squid. Mudah saja. Kita hanya perlu menambahkan baris yang menyatakan bahwa berkas skrip ruby /etc/nginx.nginx.rb adalah program pengubah alamat untuk permintaan klien berkas video YouTube:
# acl berikut yang menyatakan permintaan video YouTube # harus diganti ke server lokal acl apache rep_header Server ^Apache # Jangan sampai lupa acl ini. 'Server YouTube' # kita berjalan di localhost acl localhost src 127.0.0.1/32 acl to_localhost dst 127.0.0.0/8 # Ijinkan localhost mengakses squid http_access allow localhost # Bagian inilah yang akan mengubah alamat video YouTube url_rewrite_program /etc/nginx/nginx.rb url_rewrite_host_header off acl youtube_videos url_regex -i ^http://[^/]+\.youtube\.com/videoplayback\? acl range_request req_header Range . acl begin_param url_regex -i [?&]begin= acl id_param url_regex -i [?&]id= acl itag_param url_regex -i [?&]itag= acl sver3_param url_regex -i [?&]sver=3 # Baris berikut ini menyatakan bahwa squid kita akan berkawan # dengan server nginx lokal dan menjadikannya sebagai salah satu # sumber pertama untuk permintaan video YouTube sebelum YouTube.com cache_peer 127.0.0.1 parent 8081 0 proxy-only no-query connect-timeout=10 cache_peer_access 127.0.0.1 allow youtube_videos id_param itag_param sver3_param !begin_param !range_request cache_peer_access 127.0.0.1 deny all
Kemudian kita coba me-reload squid:
$ /etc/rc.d/rc.squid reload atau $ squid -k reconfigure
Supaya mudah untuk mengetahui apakah proses pengubahan alamat dan penyimpanan video YouTube sudah benar, serta untuk mengetahui ada atau tidak permasalahan pada squid dan nginx, kita dapat mengaktifkan log squid dan nginx:
# FILE: /etc/squid/squid.conf cache_access_log /var/log/squid/access.log cache_log /var/log/squid/cache.log # Supaya log-nya mirip dengan log apache/nginx emulate_httpd_log on logformat squid %tl %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
Apabila mekanisme pengubahan sudah berjalan dengan lancar kita bisa memeriksa apakah video-video yang diminta sudah disimpan di dalam harddisk lokal kita:
root@proxy:~# ls -lh /var/www/nginx/files/ | more total 2.4G -rw------- 1 nobody nobody 1.7M Jan 7 2010 id\=00eb20bff5ff715f.itag\=34.range\=10690560-12472319.algo\=throttle-factor -rw------- 1 nobody nobody 1.7M Jan 7 2010 id\=00eb20bff5ff715f.itag\=34.range\=12472320-14254079.algo\=throttle-factor -rw------- 1 nobody nobody 1.7M Jan 7 2010 id\=00eb20bff5ff715f.itag\=34.range\=13-1781759.algo\=throttle-factor
Kita juga dapat melihat di log squid dan nginx proses permintaan yang sudah diubah:
FILE: /var/log/squid/squid.log 1348290565.359 7566 10.10.30.11 TCP_MISS/200 1782196 GET http://o-o---preferred---sn-i3b7sn76---v16---lscache2.c.youtube.com/videoplayback? - DIRECT/127.0.0.1 video/x-flv
atau dalam bentuk emulasi log httpd
10.10.30.11 - - [22/Sep/2012:12:36:49 +0700] "GET http://o-o---preferred---sn-i3b7sn7k---v9---lscache6.c.youtube.com/videoplayback? HTTP/1.1" 200 819307 TCP_MISS:FIRST_UP_PARENT
Dari log tersebut dapat kita lihat bahwa meskipun squid melaporkan permintaan tersebut MISS, tetapi perhatikan lokasi servernya, 127.0.0.1 atau localhost atau server nginx kita tadi (FIRST_UP_PARENT). Jika tidak ada masalah apa-apa lagi, kita dapat menonaktifkan log squid. Lumayan untuk menghemat ruang harddisk:
# FILE: /etc/squid/squid.conf cache_access_log /dev/null cache_log /dev/null cache_store_log /dev/null
Tulisan ini diadaptasi dengan beberapa modifikasi dari artikel penulis aslinya. Silakan kunjungi artikel aslinya jika menginginkan informasi lebih lanjut:
http://aacable.wordpress.com/2012/08/13/youtube-caching-with-squid-nginx/
Bagaimana? Mudah bukan? Selamat mencoba. Selamat tidur.