Caching Dynamic Content dan Youtube Menggunakan Squid

Terkadang beberapa clients secara bersamaan menonton video youtube yang sama – dan hal ini berimbas pada penggunaan bandwidth yang besar. Dengan menggunakan squid, kita dapat melakukan efisiensi penggunaan bandwidth dengan melakukan dynamic content caching – termasuk didalamnya melakukan caching video youtube.

Pertanyaan yang sering muncul : pilih lusca atau squid?

Lusca di kembangkan berdasarkan squid 2.7, dan memiliki opsi tuning lebih banyak. Lusca dapat di implementasikan lebih baik dalam hal melakukan video caching jika dibandingkan dengan squid versi lainnya.

Kekurangannya adalah, lusca di kembangkan secara pribadi (oleh Adrian Chadd) dan menggunakan dasar squid 2.7. Squid 2.7 sendiri sudah “agak” lama tidak didevelop oleh developer squid. Squid 2.7 dinyatakan obsolete dan tidak didukung lagi jika squid 3.2 secara resmi dirilis.

Apa saja yang bisa di cache oleh lusca?

Ada banyak, seperti windows update, antivirus updates, video streaming seperti pada Youtube, Tube8 dan tube-tube lainnya, Facebook, mp3, mp4 dan sebagainya.

Lusca dapat dengan mudah di instal pada mesin berbasis *NIX, seperti Linux (Ubuntu dan CentOS sangat saya rekomendasikan), FreeBSD, OpenBSD, dan lain-lainnya.

Walaupun demikian, tutorial ini dapat di implementasikan pada squid2.7STABLE9 dan LUSCA

Catatan – Read me!! 

Pada posting ini youtube yang akan di rewrite adalah youtube range (video youtube yang di split menjadi beberapa bagian yang ukurannya bervariasi antara 1 – 15 Mb).

Jika anda ingin me-rewrite youtube non-range (alias video youtube di cache secara full / bukan di split atau dipisah menjadi beberapa bagian), silakan membaca posting saya yang berjudul “Squid Caching Youtube Non-Range“.

Pada update youtube terbaru, tampaknya mustahil untuk “memaksa” agar video yang di play menjadi non-range :(

Bagaimana melakukan caching youtube dengan Lusca / squid2.7STABLE9?

Saya berasumsi Lusca/Squid sudah terinstal dengan baik dimesin anda. Jika anda belum menginstal Lusca/Squid atau kebingungan melakukan instalasinya, silakan bertanya kepada mbah Google. :)

Pertama, carilah tag konfigurasi seperti dibawah ini pada squid.conf, kemudian hapus:

acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY

Kemudian, tambahkan konfigurasi berikut ini (sesuaikan dengan konfigurasi anda!) :

# allow cache untuk youtube
acl youtube dstdomain .youtube.com
cache allow youtube
cache allow all

# max. object 128 Mb / bisa disesuaikan
minimum_object_size 512 bytes
maximum_object_size 128 Mb

# acl untuk URL youtube yang dikirim ke storeurl
acl youtube url_regex -i youtube.*(ptracking|stream_204|player_204|gen_204).*$
acl youtube url_regex -i \.c\.(youtube|google)\.com\/(get_video|videoplayback|videoplay).*$
storeurl_access allow youtube

# acl tambahan untuk storeurl - 1 domain perbaris :)
# bisa di jadiin 1 baris, tapi kata temen ane yg bule, biar squid lebih
# efisien parsing config, sebaiknya dijadiin beberapa baris.. (bener nggak ya?)
acl storeurl_domain dstdomain .fbcdn.net
acl storeurl_domain dstdomain .dailymotion.com 
acl storeurl_domain dstdomain .metacafe.com 
acl storeurl_domain dstdomain .filehippo.com 
acl storeurl_domain dstdomain .redtube.com 
acl storeurl_domain dstdomain .tube8.com 
acl storeurl_domain dstdomain .phncdn.com 
acl storeurl_domain dstdomain .download.youporn.com
acl storeurl_domain dstdomain .static.blip.tv
storeurl_access allow storeurl_domain

# catch all... deny all...
acl store_regex url_regex -i cdn(.?)/[0-9a-zA-Z_-]*.?\.(jpg|jpeg|gif|png|ico|mp3|flv|mp4)
acl store_regex url_regex ^http:\/\/([a-zA-Z-]+[0-9-]+)\.[A-Za-z]*\.[A-Za-z]*
acl store_regex url_regex (([a-z]{1,2}[0-9]{1,3})|([0-9]{1,3}[a-z]{1,2}))\.[a-z]*[0-9]?\.[a-z]{3}
storeurl_access allow store_regex
storeurl_access deny all

# setting storeurl-nya disini nih...
# kalo user yg dilayani squid jumlahnya banyak, maka children bisa ditambah
storeurl_rewrite_program /etc/squid/storeurl.pl
storeurl_rewrite_children 7
storeurl_rewrite_concurrency 50

# refresh_pattern

refresh_pattern (get_video\?|videoplayback\?|videodownload\?) 5259487 99999999% 5259487 override-expire ignore-reload ignore-private 
refresh_pattern -i \.(flv|mp4)$ 10080 90% 999999 ignore-no-cache override-expire ignore-private

##### jika ada refresh pattern lain, letakkan dibawah baris ini #####

refresh_pattern -i \.fbcdn.net.*\.(jpg|gif|png|mp3) 10080 80% 10080 ignore-reload override-expire ignore-no-cache

##### default refresh_pattern, letakkan paling bawah! #####
refresh_pattern -i (/cgi-bin/|\?)   0   0%      0
refresh_pattern .                   0   0%   4320

 Selanjutnya, bikin storeurl nya (credits mas ucok_karnadi)

# vim /etc/squid/storeurl.pl

Isi storeurl nya :

#!/usr/bin/perl

$|=1;
while (<>) {
@X = split;

if ( $X[0] =~ m/^http\:\/\/.*/) { 
$x = $X[0]; 
$_ = $X[0];
$u = $X[0];
} else { 
$x = $X[1]; 
$_ = $X[1];
$u = $X[1];
}

if ($x =~ m/^http\:\/\/.*(profile|photo|creative).*\.ak\.fbcdn\.net\/((h|)(profile|photos)-ak-)(snc|ash|prn|frc)[0-9]?(.*)/) {
        $out="http://fbcdn.net.squid.internal/" . $2  . "fb" .  $6  ;

} elsif ($X[1] =~ m/^http(|s)\:\/\/.*youtube.*(ptracking|stream_204|player_204|gen_204).*(video_id|docid|v)\=([^\&\s]*).*/){
		$vid = $4 ;
		@cpn = m/[&?]cpn\=([^\&\s]*)/;
		$fn = "/var/log/squid/@cpn";
		unless (-e $fn) {
		open FH,">".$fn ;
		print FH "$vid\n";
		close FH;
		}
		print $x . $X[1] . "\n";

} elsif ($X[1] =~ m/^http\:\/\/.*(youtube|google).*videoplayback.*/){
		@itag = m/[&?](itag=[0-9]*)/;
		@ids = m/[&?]id\=([^\&\s]*)/;
		@mime = m/[&?](mime\=[^\&\s]*)/;
		@cpn = m/[&?]cpn\=([^\&\s]*)/;
		if (defined($cpn[0])) {
		$fn = "/tmp/@cpn";
		if (-e $fn) {
		open FH,"<".$fn ;
		$id  = <FH>;
		chomp $id ;
		close FH ;
		} else {
		$id = $ids[0] ;
		}
		} else {
		$id = $ids[0] ;
		}
		@range = m/[&?](range=[^\&\s]*)/;
		print $x . "http://video-srv.youtube.com.SQUIDINTERNAL/id=" . $id . "&@itag@range@mime\n";

} elsif ($x =~ m/^http:\/\/i[1-4]\.ytimg\.com\/(.*)/) {
        $out="http://ytimg.com.squid.internal/" . $1 ;

} elsif ($x =~ m/^http:\/\/.*\.dl\.sourceforge\.net\/(.*)/) {
          $out="http://dl.sourceforge.net.squid.internal/" . $1 ;

		#Speedtest
} elsif ($x =~ m/^http\:\/\/.*\/speedtest\/(.*\.(jpg|txt)).*/) {
        $out="http://speedtest.squid.internal/" . $1 ;

		#BLOGSPOT
} elsif ($x =~ m/^http:\/\/[1-4]\.bp\.(blogspot\.com.*)/) {
        $out="http://blog-cdn." . $1  ;

		#AVAST
} elsif ($x =~ m/^http:\/\/download[0-9]{3}.(avast.com.*)/) {
          $out="http://avast-cdn." . $1  ;

	      #AVAST
} elsif ($x =~ m/^http:\/\/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\/(iavs.*)/) {
        $out="http://avast-cdn.avast.com/" . $1  ;

  	#KAV
} elsif ($x =~ m/^http:\/\/dnl-[0-9]{2}.(geo.kaspersky.com.*)/) {
          $out="http://kav-cdn." . $1  ;

		#AVG
} elsif ($x =~ m/^http:\/\/update.avg.com/) {
          $out="http://avg-cdn." . $1  ;

		#maps.google.com
} elsif ($x =~ m/^http:\/\/(cbk|mt|khm|mlt|tbn)[0-9]?(.google\.co(m|\.uk|\.id).*)/) {
        $out="http://" . $1  . $2 ;

		#gstatic and/or wikimapia
} elsif ($x =~ m/^http:\/\/([a-z])[0-9]?(\.gstatic\.com.*|\.wikimapia\.org.*)/) {
        $out="http://" . $1  . $2 ;

		#maps.google.com
} elsif ($x =~ m/^http:\/\/(khm|mt)[0-9]?(.google.com.*)/) {
        $out="http://" . $1  . $2 ;

		#Google
} elsif ($x =~ m/^http:\/\/www\.google-analytics\.com\/__utm\.gif\?.*/) {
        $out="http://www.google-analytics.com/__utm.gif";

} elsif ($x =~ m/^http:\/\/(www\.ziddu\.com.*\.[^\/]{3,4})\/(.*?)/) {
        $out="http://" . $1 ;

		#cdn, varialble 1st path
} elsif (($x =~ /filehippo/) && (m/^http:\/\/(.*?)\.(.*?)\/(.*?)\/(.*)\.([a-z0-9]{3,4})(\?.*)?/)) {
        @y = ($1,$2,$4,$5);
        $y[0] =~ s/[a-z0-9]{2,5}/cdn./;
        $out="http://" . $y[0] . $y[1] . "/" . $y[2] . "." . $y[3] ;

		#rapidshare
} elsif (($x =~ /rapidshare/) && (m/^http:\/\/(([A-Za-z]+[0-9-.]+)*?)([a-z]*\.[^\/]{3}\/[a-z]*\/[0-9]*)\/(.*?)\/([^\/\?\&]{4,})$/)) {
        $out="http://cdn." . $3 . "/squid.internal/" . $5 ;

		#for yimg.com video
} elsif ($x =~ m/^http:\/\/(.*yimg.com)\/\/(.*)\/([^\/\?\&]*\/[^\/\?\&]*\.[^\/\?\&]{3,4})(\?.*)?$/) {
        $out="http://cdn.yimg.com/" . $3 ;

		#for yimg.com doubled
} elsif ($x =~ m/^http:\/\/(.*?)\.yimg\.com\/(.*?)\.yimg\.com\/(.*?)\?(.*)/) {
        $out="http://cdn.yimg.com/"  . $3 ;

		#for yimg.com with &sig=
} elsif ($x =~ m/^http:\/\/([^\.]*)\.yimg\.com\/(.*)/) {
        @y = ($1,$2);
        $y[0] =~ s/[a-z]+([0-9]+)?/cdn/;
        $y[1] =~ s/&sig=.*//;
        $out="http://" . $y[0] . ".yimg.com/"  . $y[1] ;

} else {
        $out=$x;

}
if ( $X[0] =~ m/^http\:\/\/.*/) { 
	print "$out\n" ;
	} else { 
	print $X[0] . "$out\n" ;
	}
}

Lakukan chmod pada storeurl agar dapat di eksekusi :

# chmod +x /etc/squid/storeurl.pl

Jalankan lusca/squid anda, dan monggo cek Youtube dan access.log untuk memastikan video cachingnya berjalan baik.

Catatan :

  • Youtube biasanya suka gonta ganti coding, yang mengakibatkan storeurl.pl tidak dapat melakukan redirect dengan benar. Oleh karena itu, biasakan mengupdate storeurl.pl dengan versi terbaru.
  • Untuk konfigurasi dasar squid2.7STABLE9 atau Lusca, bisa dilihat disini.

Last update : 17 Desember 2013

Catatan :

  • Jangan asal copas… perhatikan kode / perintah yang anda copas.
  • Saya tidak menjamin panduan ini bisa berhasil melakukan cache Youtube atau tidak. Just give a try! :)

_____________________________

Credits :

  1. http://aacable.wordpress.com/2012/01/11/howto-cache-youtube-with-squid-lusca-and-bypass-cached-videos-from-mikrotik-queue/
  2. http://wiki.squid-cache.org/ConfigExamples/DynamicContent/YouTube
  3. http://www.forummikrotik.com/linux-support/21089-new-storeurl-untuk-youtube-file-range.html (thanks mas ucok_karnadi)

About Fajar R. 297 Articles
Seseorang yang antusias terhadap dunia internet, IT, networking dan komputer. Tipikal introvert tapi suka berorganisasi dan adventuring ke tempat-tempat baru.

22 Komentar

  1. Mas Fazar, saya sudah coba konfigurasi mas dan berhasil dengan baik namun saya masih punya kendala mas. Saya coba di beberapa pc (3 PC), 2 PC fresh install dengan firefox terbaru sedangkan yang PC yang 1 masih menggunakan firefox lama versi 8. No plugin install.

    Setelah di test cacing 1 movie di youtube (BOA everyheart), ketiga PC tersebut saya restart supaya membuktikan bahwa cachenya berhasil.

    Kemudian saya play lagi video yang sama di ke-3 PC tersebut. Hasilnya PC yang fresh install hanya download video cachenya 1/4 ( ga full ) sedangkan di PC yang lama bisa full tanpa buffer sedikitpun, akhirnya di PC yang baru saya install Grease Mongkey dan masalah Solved

    Mohon pencerahannya, apakah ada settingan khusus untuk firefox mas supaya bisa full buffer dan saya coba di chrome juga tidak full. Kira-kira kenapa ya mas ?

    • sebelum melakukan test, pastikan cache browser dalam keadaan kosong (untuk firefox pencet ctrl+alt+del, time range pilih Everything, trus contreng semua dan klik clear now). jika masbro menggunakan tutorial diatas, maka video yg dicache bersifat partial (sepotong-sepotong) makanya video yg di cache cuman seperempatnya.

      agar video di cache sepenuhnya, buatlah acl url_path video youtube yg partial, kemudian deny acl tersebut. nanti hasilnya video youtube akan dicache full.. nggak separo-separo lagi. :)

  2. mas adhi saya juga ada masalah menggunakan lusca head R14809, tidak bisa download diatas 2 GB bisa mohon bantuan skripnya agar bisa download diatas 2 GB?

  3. saya sangatlah bingung dengan versi squid yang sekarang ini.
    ada banyak pilihan, ditambah lusca.
    official web mengatakan versi 2.7 sudah usang dan disarankan untuk tidak di produksi lg, sedangkan versi 3.1 atau 3.2 masih banyak trouble2 yang sering saya baca di forum squid, tolong kasih pencerahan (saran), saya skrg pengguna slackware.
    dulu sempet pake ubuntu, debian dengan squid 2.7 tapi ketika listrik padam, tiba2 OS tidak mau booting, dst.
    Terima kasih :)

    • pertama, betul… squid 2.7 sudah obsolete dan tidak direkomendasikan untuk mesin produksi. digantikan dengan versi 3.x stabil. akan tetapi untuk keperluan caching konten dinamis, squid 2.7 didukung oleh kemampuan penggunaan storeurl yg belum terdapat di squid 3.x.

      kedua, listrikk.. aduhhhh, udah lazim di indonesia kena byarpet pln (perusahaan lilin negara) satu-satunya cara adalah menggunakan UPS. kalo perlu pake UPS yg rada gede (2 batere keatas), agar tidak terimbas efek pemadaman listrik. semua OS, termasuk linux sangat sensitif untuk urusan mati lampu. :D

      demikian.. semoga bermanfaat.

      • antara squid 2.7 sama lusca stabil yang mana ya, saya tidak terlalu memperdulikan masalah kecepatan read/write atau kecepatan access cache_hit nya, yang penting sistem stabil dan tidak pernah kebocoran memory, itu yang sedang saya cari dan bingung, menurut mas fazar bagaimana ?
        sudah pernah membandingkan antara keduanya ?

        • squid 2.7 stable 9. dengan konfigurasi yg agresif masih bisa memiliki performa yg bagus dan stabil. compile sendiri agar sesuai dengan spesifikasi dan OS mesin, jangan pake yg udah jadi paketan install (deb, rpm, dsb).

          • iya saya memang lebih suka compile meng-compile.
            dulu sudah pernah compile squid 2.7 Stable 9, 2x gagal, gagal disini mskdnya, squid gak bertahan lama, baru 6 bln sudah sering ngadet, ntah dari OS nya apa squid-nya, padahal config standar2 aja, cache_dir gak lebih dari 60% total partisi, gak pake redirector segala macem.

            rencana sih saya mau coba2 lusca ini, apakah mas fajar sekarang pakai lusca ?
            masalah apa mas yang sering mucul di lusca ?
            kalau diadu kesetabilan, mana tuh yg mas pilih. hehe pertanyaannya lebay.

          • dulu waktu ane kerja ngurus warnet squid 2.7stable9 ane compile di ubuntu server LTS 10 (hardy) dan bisa jalan cukup baik dan stabil selama 3 tahun (listrik di backup sama UPS dan ane schedule auto reboot pake cron setiap hari senin pagi). saran ane gunakan OS yg bener-bener stabil dan ditujukan sebagai server seperti ubuntu server, centos minimal, debian atau sejenisnya dan gunakan UPS agar aman dari efek mati lampu mendadak :D

            untuk di kantor sekarang ane pake lusca jalan di ipfire, udah 6 bulan ane pakai dan cukup stabil dipakai 24 jam sehari nonstop (dibackup UPS dan nggak ada schedule reboot). masalah yg muncul di lusca nggak terlalu banyak sih, paling bug dikit aja (bisa dilihat di cache.log), yg paling kentara adalah ane pake Lusca Release – r14809 tanpa patch dan dapat dipastikan tidak dapat mendownload file yg lebih gede dari 2 GB. tapi ini menguntungkan dilingkungan kerja ane, karena klien nggak bisa download file-file gede… hehehe.

            kestabilannya.. 2-2 nya cukup baik kok. tapi untuk mesin produksi misalnya untuk RT/RW dengan klien yg cukup banyak ane recommend squid 2.7stable9. semoga membantu.

          • Maaf mas fajar, ubuntu 10 bukannya lucid ?
            dan maksud Lusca Release-r14809 gak bisa download file >2GB ?

            –enable-large-cache-files
            Enable support for large cache files (>2GB).
            WARNING: on-disk cache format is changed by this option

            Thanks for sharing and masukannya :)

    • tidak ada acl yg spesifik untuk hotspot di squid, yg ditambahkan mungkin hanya acl untuk kelas IP klien hotspot yg akan di allow menggunakan proxy. untuk manajemen bandwidth akan lebih mudah jika menggunakan mikrotik atau sejenisnya,

  4. mas fazar kalo boleh saya boleh tau acl di squid.conf atau tuning di storeurl.pl agar youtube tidak split lagi, boleh di mas fazar email ke saya, terima kasih sebelumnya. buat bahan belajar saya saja.

  5. Mas, boleh minta Squid Caching Youtube Non-Range nya mas? Saya udah ngubek di googl tapi belum nemu. Saya butuh untuk kebutuhan thesis saya mas.

    Terima Kasih Sebelumnya.

Leave a Reply

Alamat email Anda tidak akan dipublikasikan.


*