[How-to] Install Varnishd on CentOS+DA

[U]

[B]How-to Install Varnishd on CentOS+DA (by KKE)[/B][/U]

หลังจากได้ทดลองติดตั้งใช้งานเป็นที่น่าพอใจ จึงนำวิธีการติดตั้งมาเผยแพร่ครับ

หมายเหตุ: อันนี้ติดตั้งเฉพาะ http ที่ port 80 นะครับ สำหรับ https ที่ port 443 จะเข้าตรงที่ apache ไม่ผ่าน varnish

หมายเหตุ: เครื่องที่มีมากกว่า 1 ip อาจจะมีปัญหากับ virtual host template นะครับ เพราะไม่ได้ทดสอบ แต่น่าจะใช้งานได้ และต้องเพิ่ม bind ip ให้ varnish ด้วย

[COLOR=#ff00ff][B]Varnish Cache[/B] is an open source, state of the art web application accelerator. You install it on your web server and it makes your website fly.

https://www.varnish-cache.org/

[/COLOR]

วิธีการติดตั้งนั้นจะใช้วิธี compile จาก source เอานะครับ ไม่ลงผ่าน yum หรือ apt

[COLOR=#0000ff][B]ขั้นตอนที่ 1[/B] ติดตั้งและทดสอบการทำงานของ varnish ก่อนใช้งานจริง[/COLOR]

[B]1.1: เตรียม dependencies ที่ varnish ต้องการ

[/B]สำหรับ OS อื่นๆ ดูได้ที่ https://www.varnish-…rce-or-packages

สำหรับ CentOS



#yum  -y  install   automake   autoconf   libtool   ncurses-devel   libxslt   groff   pcre-devel   pkgconfig


[B]1.2: download varnish and compile

[/B]



#wget  http://repo.varnish-cache.org/source/varnish-3.0.0.tar.gz

#tar  xzf  varnish-3.0.0.tar.gz

#cd  varnish-3.0.0

#sh autogen.sh

#sh configure

#make

#make install

#ldconfig

 

[B]1.3: ทดสอบ varnish ที่ port 8080

[/B]หากมี firewall ให้ทำการเปิด port tcp 8080 ก่อน

แก้ไขไฟล์ /usr/local/etc/varnish/default.vcl (เอา #remark 4 บรรทัดนี้ออก แล้วแก้ไขโดยที่ 123.123.123.123 เป็น ip จริงของ server)



backend default {

     .host = "123.123.123.123";

     .port = "80";

}


start varnish ด้วยคำสั่ง



#varnishd  -f /usr/local/etc/varnish/default.vcl  -s malloc,512M  -T 127.0.0.1:2000  -a 123.123.123.123:8080


ลองเรียกเว็บผ่าน port 8080 ดู ถ้าเข้าได้ตามปกติแปลว่า varnish ทำงานได้ถูกต้อง เช่น

hxxp://www.domain.com:8080/index.php

ทุก url ควรจะได้ผลลัพธ์เหมือนกับเรียกตามปกติที่ไม่ใส่ :8080 ทุกประการ

[B]1.4: stop varnish

[/B]



#killall varnishd


[COLOR=#006400]มาถึงตรงนี้เราก็พร้อมที่จะทำการสลับเอา varnish มาไว้ที่ port 80 และเอา apache ไปไว้ที่ port 8080 เพื่อใช้งานจริงกันแล้ว[/COLOR]

[COLOR=#0000ff]

[B]ขั้นตอนที่ 2 [/B]สลับ Apache ไปใช้งาน port 8080[/COLOR]

[B]2.1: แก้ไขไฟล์ config ต่างๆเพื่อเปลี่ยน port apache ไปใช้งาน 8080

[/B]ไฟล์ที่ต้องแก้ไขทั้งหมด

/etc/httpd/conf/httpd.conf

/etc/httpd/conf/ips.conf (ไฟล์ถูก DA เขียนทับเมื่อเพิ่ม domain)

/etc/httpd/conf/extra/httpd-vhosts.conf

/usr/local/directadmin/data/templates/custom/virtual_host2.conf

/usr/local/directadmin/data/templates/custom/virtual_host2_sub.conf

/usr/local/directadmin/data/templates/custom/redirect_virtual_host.conf

/etc/httpd/conf/httpd.conf

จาก



Listen 80


เป็น



Listen 8080


[s]/etc/httpd/conf/ips.conf

จาก

[/s]



LogFormat "%O \"%r\"" homedir

NameVirtualHost 123.123.123.123:80

NameVirtualHost 123.123.123.123:443


เป็น (ให้เพิ่มข้อความต่อไปนี้ที่ต้นไฟล์ /etc/httpd/conf/extra/httpd-vhosts.conf แทน และ remark บรรทัด include ips.conf ออก)



LogFormat "%O \"%r\"" homedir

NameVirtualHost 127.0.0.1:8080

NameVirtualHost 123.123.123.123:8080

NameVirtualHost 123.123.123.123:443


/etc/httpd/conf/extra/httpd-vhosts.conf

จาก



Include /etc/httpd/conf/ips.conf



#

#

<VirtualHost 123.123.123.123:80>


เป็น



###Include /etc/httpd/conf/ips.conf

LogFormat "%O \"%r\"" homedir

NameVirtualHost 127.0.0.1:8080

NameVirtualHost 123.123.123.123:8080

NameVirtualHost 123.123.123.123:443



#

#

<VirtualHost 127.0.0.1:8080 123.123.123.123:8080>


คัดลอกไฟล์ template มาไว้ใน custom เพื่อแก้ไข (ไฟล์ใน custom จะไม่ถูกทับเมื่อ update DirectAdmin)



#cp -p /usr/local/directadmin/data/templates/virtual_host2.conf  /usr/local/directadmin/data/templates/custom/virtual_host2.conf

#cp -p /usr/local/directadmin/data/templates/virtual_host2_sub.conf  /usr/local/directadmin/data/templates/custom/virtual_host2_sub.conf

#cp -p  /usr/local/directadmin/data/templates/redirect_virtual_host.conf  /usr/local/directadmin/data/templates/custom/redirect_virtual_host.conf


/usr/local/directadmin/data/templates/custom/virtual_host2.conf

/usr/local/directadmin/data/templates/custom/virtual_host2_sub.conf

/usr/local/directadmin/data/templates/custom/redirect_virtual_host.conf

ทั้ง 3 ไฟล์แก้เหมือนกัน จาก



<VirtualHost |IP|:80 |MULTI_IP|>


เป็น



<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>


[B]2.2: ติดตั้ง mod_rpaf เพื่อแก้ไข ip ของ remote host จาก 127.0.0.1 ที่เรียกมาจาก varnish ให้เป็น client ip ที่เรียกมาจริง

[/B]


#wget http://www.stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
#tar xzf mod_rpaf-0.6.tar.gz
#cd mod_rpaf-0.6
#apxs -cia mod_rpaf-2.0.c

แก้ไขไฟล์ /etc/httpd/conf/extra/httpd-includes.conf เพิ่มข้อความ



<IfModule mod_rpaf-2.0.c>

RPAFenable On

RPAFsethostname On

RPAFproxy_ips 127.0.0.1

RPAFheader X-Forwarded-For

</IfModule>


[B]2.3 สร้างไฟล์ start/stop varnishd

[/B]/etc/init.d/varnishd



#!/bin/sh

#

# Startup script for varnishd

#

# chkconfig: 2345 80 20

# description: Varnish Cache is an open source, state of the art web application accelerator. \

#              You install it on your web server and it makes your website fly.

# processname: varnishd

# config: /usr/local/etc/varnish/default.vcf

#

# By: Korakot E. <korakot [at] pinkkeyhost.com>

# $Id: varnishd.init.d,v 1.0 2011/07/27 23:23:23 kke $



# Source function library.

. /etc/rc.d/init.d/functions



MALLOC="512M"

BINDADDR="0.0.0.0:80"

TELPORT="2000"

CONFIG="/usr/local/etc/varnish/default.vcl"

OPTIONS="-f $CONFIG  -s malloc,$MALLOC  -T 127.0.0.1:$TELPORT  -a $BINDADDR"

 

if [ -f /etc/sysconfig/varnishd ]; then

      . /etc/sysconfig/varnishd

      OPTIONS="-f $CONFIG  -s malloc,$MALLOC  -T 127.0.0.1:$TELPORT  -a $BINDADDR"

  fi



PATH="$PATH:/usr/local/sbin"



# See how we were called.

case "$1" in

        start)

                echo -n "Starting varnishd: "

                daemon varnishd $OPTIONS

                echo

                touch /var/lock/subsys/varnishd

                ;;

        stop)

                echo -n "Shutting down varnishd: "

                killproc varnishd

                echo

                rm -f /var/lock/subsys/varnishd

                ;;

        status)

                status varnishd

                ;;

        restart)

                $0 stop

                $0 start

                ;;

        *)

                echo -n "Usage: $0 {start|stop|restart|status}"

                exit 1

esac



if [ $# -gt 1 ]; then

        shift

        $0 $*

fi



exit 0


แก้ permission และกำหนดให้ varnishd ทำงานเมื่อ boot ระบบ



#chmod 755 /etc/init.d/varnishd

#chkconfig --add varnishd

#chkconfig varnishd on


[B]2.4: กำหนดค่า config ของ varnishd

[/B]แก้ไขไฟล์ /usr/local/etc/varnish/default.vcl



backend default {

     .host = "127.0.0.1";

     .port = "8080";

}


สร้าง/แก้ไขไฟล์ /etc/sysconfig/varnishd กำหนดค่า MALLOC ตามต้องการ (หรือจะแก้ไปในไฟล์ init.d ตรงๆเลยก็ได้ ก็ไม่ต้องสร้างไฟล์นี้)



MALLOC="1G"

BINDADDR="127.0.0.1:80,123.123.123.123:80"

TELPORT="2000"

CONFIG="/usr/local/etc/varnish/default.vcl"


[B]2.5: ทำการ rewrite config vhosts ของ apache ใหม่ตามไฟล์ template ที่ได้แก้ไขไป

[/B]



#echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue


[COLOR=#ff0000]รอประมาณ 1 นาที ให้ cron ทำงาน

[/COLOR]



#/etc/init.d/httpd restart


[COLOR=#008000]ถึงตรงนี้จะต้องเข้าเว็บผ่าน url :8080 ได้ (เข้าไปที่ apache ตรงๆ)

[/COLOR]

[B]2.6: start varnish

[/B]



#/etc/init.d/varnishd start


[COLOR=#008000]ถึงตรงนี้จะต้องเข้าเว็บผ่าน url ปกติได้ (เข้าผ่าน varnish)

[/COLOR]

[B]2.7: หากมี firewall สามารถปิด port 8080 ที่เปิดเพื่อทดสอบตอนแรกได้ เนื่องจาก varnish จะเรียกผ่าน 127.0.0.1

[/B][COLOR=#ff0000]หมายเหตุ: หากมี script ประเภทป้องกัน DDOS ให้แน่ใจว่ามันจะไม่ block 127.0.0.1 ไปใน firewall

[/COLOR]

[B]2.8: หากต้องการ start/stop varnishd ผ่าน service monitor ของ DA

[/B]ให้แก้ไขไฟล์ /usr/local/directadmin/data/admin/services.status เพิ่มบรรทัดนี้ที่ท้ายไฟล์



varnishd=ON


[COLOR=#0000ff][B]การ start/stop varnishd

[/B][/COLOR]



#/etc/init.d/varnishd start

#/etc/init.d/varnishd stop

#/etc/init.d/varnishd restart


[B][COLOR=#0000ff]

เรียกดู stat

[/COLOR][/B]



#varnishstat


[B][COLOR=#0000ff]เพิ่มเติม[/COLOR][/B]

ตัวอย่างค่า apache config ที่ผมใช้

Timeout 35

KeepAlive On

MaxKeepAliveRequests 250

KeepAliveTimeout 3

StartServers               10

MinSpareServers      10

MaxSpareServers     24

ServerLimit              256

MaxClients               256

MaxRequestsPerChild   10000

[B][COLOR=#ff00ff]ใครจะเอาไปเผยแพร่ต่อ ใส่ credit + แหล่งที่มา ไว้ด้วยนะครับ

บทความโดย: KKE <korakot [at] pinkkeyhost.com>

[/COLOR][/B]

http://www.thaihosttalk.com/topic/32748-how-to-install-varnishd-on-centosda/

สุกี้ มี How-to ดีๆ แบบนี้เยี่ยมมากครับ

ละเอียดทุกขั้นตอน

wow สุดยอดครับ +thl=k

สุดยอดมากครับ คงต้องลองใช้ซะแล้ว :smiley:

:d5f02ecd: ละเอียดยิบเลย สุดยอดครับ เดี๋ยวลองดูมั่ง :875328cc:

เจอปัญหาว่า varnishd สั่ง stop ไม่ได้อะครับ แต่ start ได้

ไปค้นมาสูตรที่ควรตั้งค่า 20% ของ ram ที่เรามี

ผมมีข้อสงสัยว่าแทนที่เราจะย้าย apache เราใช้เทคนิค FW port แบบเดียวกับที่ทำบน nginx ได้ไหม ?

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

ผมลอง varnishstat พบว่า varnishd วิ่งปกติ ผมไปดู service httpd ใน DA พบว่าหายไปเพียบ (แบบเดียวกับที่ nginx ทำ)

เพียงแต่พอลอง top ดูพบว่า varnishd ทำงานแต่ เป็น nobody เลยไม่รู้ว่าใช้ได้จริง ๆ หรือเปล่า

ขอบคุณครับพี่แมน สักพักหากได้จัด เดี่ยวมาต่อยอดครับ

Thank you kub

ผมเจอปัญหาหลังจาก add domain ใหม่ครับ

/etc/httpd/conf/ips.conf DA มัน gen กลับไปเป็นค่าเดิมครับ ไม่ทราบว่า ท่านๆที่ลองแล้ว เจอแบบผมหรือเปล่าครับ

จิงๆใช้ iptable redirect ก็ได้นะครับ ผมเคยทำ

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

แต่ผมเจอ 503 บ่อยเลยเลิกใช้ไป

ปล ลงจาก rpm ก็ได้นะครับถ้าขี้เกียจ compile

http://repo.varnish-cache.org/redhat/el5/x86_64/

แก้ไขแล้วครับ เอา content ไปใส่ในไฟล์ httpd-vhosts.conf ที่มัน include ips.conf ตรงๆเลย

ก็ทำได้ครับ แต่ performance ไม่ดีเท่าวิ่งเข้า 80 แล้วเรียก backend apache ผ่าน 127.0.0.1 ตรงๆ

ที่เจอ 503 ก็คือ varnish มัน connect ไป apache ไม่ได้ มีหลายสาเหตุ เช่น apache เต็ม

อย่างเช่น ถ้ามี slow query จน apache ค้างจนเต็ม varnish มันก็ connect apache ไม่ได้ ก็จะ 503 แต่ก็ใช่ว่าไปเพิ่ม apache maxclients เยอะๆแล้วจะเป็นการแก้ปัญหาที่ถูกจุด

หรือโดน ddos/firewall block ip ตัวเอง

ใครลองแล้วมา update หน่อยนะครับ

ลองแล้ว แต่ยังไม่ค่อยเห็นผลเท่าไหร่ค่ะ อาจจะยังไม่เจอช่วงโหลดหนักๆ ขอบคุณสำหรับสิ่งดีๆค่ะ

ไม่เป็นนะคะ ลองเพิ่ม domain.com เล่นๆดู ips.conf ก็ยังเป็นค่าเดิมที่เราแก้มา หรือต้องไปดูที่ไหนหว่า …

ขอรอคนอื่นลองก่อนดีกว่า. เมื่อคืนลองแล้ว cpu ของ varnishd วิ่งไป 200% ตลอดเลย kill ออก ไม่ทราบว่าทำไมเหมือนกันครับ.

หลังจากลอง nginx และ varnish สำหรับผม apache + keepalive off เสถียรสุดแล้ว load average วิ่งประมาณ 1-2 นอกนั้นลองแล้วไป 2-3 หมดเลย. แหะ ๆ สงสัยไม่เก่งพอ config ไม่ work

cpu พุ่งแบบนั้น connection loop ครับ

ทดสอบแล้วใช้งานได้ี เนียนกว่า nginx proxy นิดหน่อย

เออผมใช้ apt-get on debian นะครับ

กำลังงมเรื่อง multiple ip อยู่ ไว้ได้เรื่องแล้วจะมาบอกนะครับ

น่าจะปักหมุดนะคะเนี่ย

อัพเดท ลง VPS ให้ลูกค้า 1 ราย เค้าใช้ ionCube + open-realty ปรกติโหลดประมาณ 10 วิ ช้ามากๆ

ลง XCache + Zend Optimizer + Varnish โหลดประมาณ 3 วิ

ขอบคุณมากครับ