Installing varnish reverse proxy for Ubuntu

varnish reverse proxy คืออะไร

varnish-apache-gootum
แสดงการทำงานของ varnish

อธิบายง่ายๆมันก็คือ reverse proxy นั่นเองง่ายไหมอิอิ varnish มันก็คือชื่อเรียกของ cache หรือ reverse proxy นั่นแหล่ะตามที่ผมเข้าใจ Varnish reverse proxy หลักการทำงานก็คือ เมื่อมีคนเรียกเว็บเข้ามามันก็จะผ่าน varnish reverse proxy ก่อนแล้ว varnish reverse proxy ก็จะทำหน้าที่เรียกไปยัง port ที่เราเชตไว้เช่น apache (หรือ images file เป็นต้น) มันจะไม่ผ่าน apache โดยตรงครับ ความสามารถของ varnish ก็เอาทำ cache พวกไฟล์ต่างๆเพื่อไม่ให้เรียกไฟล์โดยตรงครับ จะทำให้ server ลดการทำงานลงและเพิ่มประสิทธิภาพของเว็บเราด้วยมันจะเปิดเร็วขึ้นเยอะเลย แต่จะกินแรมครับ คร่าวๆก็ประมาณนี้ ต่อไปเป็นวิธีการลงแบบมั่วๆของผมซึ่งนั่งงมอยู่ประมาณ 12ชม เต็มๆ

wget http://dfn.dl.sourceforge.net/sourceforge/varnish/varnish-2.0.4.tar.gz
tar xvfz varnish-2.0.4.tar.gz
cd varnish-2.0.4
./configure --prefix=/usr/local/varnish/ && make && make install
/usr/local/varnish/sbin/varnishd -a 0.0.0.0:80 -b 203.150.224.25:81 -T 127.0.0.1:6082 -s malloc

ต่อจากนั้นแก้ไฟล์นี้ /etc/default/varnish

VARNISH_VCL_CONF=/etc/varnish/default.vcl
VARNISH_LISTEN_ADDRESS=203.150.224.25
VARNISH_LISTEN_PORT=80
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
VARNISH_MIN_THREADS=1
VARNISH_MAX_THREADS=1000
VARNISH_THREAD_TIMEOUT=120
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
VARNISH_STORAGE_SIZE=1G
VARNISH_TTL=120

แก้ไขไฟล์ Config ของ Varnish

nano /etc/varnish/default.vcl
backend default {
    .host = "203.150.224.25";
    .port = "81";
}
#จริงๆผมใช้แค่ host และ port ครับ
sub vcl_recv
{

     # normalize compression
     if (req.http.Accept-Encoding){
       if (req.http.Accept-Encoding ~ "gzip"){
          set req.http.Accept-Encoding = "gzip";
       }
       elseif (req.http.Accept-Encoding ~ "deflate" ) {
          set req.http.Accept-Encoding = "deflate";
       }
       else{
          remove req.http.Accept-Encoding;
       }
     }

   if (req.request == "POST")
   {
       pass;
   }

   # do not use Varnish when the user is authenticated
   if (req.http.Cookie && req.http.Cookie ~ "is_logged_in" ) {
       pass;
   }

   if (req.request == "GET")
   {
       lookup;
   }

   if (req.url ~ ".(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico)$")
   {
       lookup;
   }

   /* Nirvana */
   remove req.http.cookie;
}

sub vcl_fetch
{
   if (  obj.http.Pragma        ~ "no-cache"
       || obj.http.Cache-Control ~ "no-cache"
       || obj.http.Cache-Control ~ "private") {
       pass;
   }

   /**
    *  Works with eZ Publish 3.*, 4.0.* with eZ Vlogin
    */
   if (obj.http.Set-Cookie ~ "^eZSESSID.*=.*$")
   {
       set obj.http.X-Cookie = "Cookie removed";
       remove obj.http.Set-Cookie;
   }

}

sub vcl_hit
{
   if (!obj.cacheable)
   {
       pass;
   }

   set obj.http.X-Cache = "Cache-Hit";

   deliver;
}

ไฟล์ config ของ varnish มีเยอะมากๆครับแล้วแต่จะเอาของที่ไหนนะครับเหรือจะเขียนเองก็ได้ส่วนอันนี้ copy เค้ามาไม่รู้ของที่ไหนลองหลายที่มันก็มั่วเหมือนกันหมดอิอิ หลังจากนั้นก็เปิด service ให้มันทำงานครับ

/etc/init.d/varnish start

แล้วทำการเช็คดูว่าทำงานจริงไหม (ต้องเขียน etc เพิ่มเอาเองนะครับเอาไว้ stop/start)

ps aux | grep "varnish"
root     30787  0.0  0.0  85744   948 ?        Ss   03:18   0:00 /usr/local/varnish/sbin/varnishd -a 0.0.0.0:80 -b 203.150.224.25:81 -T 127.0.0.1:6082 -s malloc
nobody   30788  0.1  0.4 223048  9672 ?        Sl   03:18   0:00 /usr/local/varnish/sbin/varnishd -a 0.0.0.0:80 -b 203.150.224.25:81 -T 127.0.0.1:6082 -s malloc

varnish-blog-gootum
ดูจาก firebug มันจะออกไปมาเป็นแบบนี้

เดี๋ยวหาวิธีแก้ไม่ให้ root รันต้องให้ user varnish รันแทนครับ ตอนนี้มันทั้งได้บ้างไม่ได้บ้างเป็นอะไรก็ไม่รู้พอ stop แล้วลอง start ใหม่บางทีก็ไม่ทำงานงงก่ะมันเดี๋ยวคงต้องหาวิธีมั่วต่อครับ อยากรู้ว่าเร็วแค่ไหนเมื่อลงเสร็จแล้วคลิ้กดูครับ เว็บสำเร็จรูป ไปอาบน้ำนอนดีกว่าจะตีสี่แล้ว….

ศึกษาเพิ่มเติม : http://www.all2e.com/Ressourcen/Artikel-und-Fallstudien/Varnish-installation-and-setup-on-ez-publish-based-systems
High-Performance Reverse Proxy Presentation