天天看點

varnish安裝配置

#!/bin/bash

# BY kerryhu

# MAIL:[email protected]

# BLOG:http://kerry.blog.51cto.com

# Please manual operation yum of before Operation.....

#============================ 更新系統時間 ============================

yum install -y ntp

ntpdate time.nist.gov

echo "00 01 * * * ntpdate time.nist.gov" >> /etc/crontab

#============================ Varnish安裝 =============================

如果是RedHat/CentOS系統,在安裝varnish的時候首先要安裝以下軟體包

automake

autoconf

libtool

ncurses-devel

libxslt

groff

pcre-devel

pkgconfig

groupadd www

useradd www -g www -s /sbin/nologin

mkdir -p /data/varnish/{cache,logs}

chmod +w /data/varnish/{cache,logs}

chown -R www:www /data/varnish/{cache,logs}

cd /opt

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

wget http://sourceforge.net/projects/varnish/files/varnish/2.1.3/varnish-2.1.3.tar.gz/download

tar -zxvf varnish-2.1.3.tar.gz

cd varnish-2.1.3

./configure --prefix=/usr/local/varnish

make;make install

#============================ varnish配置 ===========================

vi /usr/local/varnish/etc/varnish/kerry.vcl

backend kerry {                    #定義後端伺服器名

    .host = "192.168.9.203";    #定義後端伺服器IP

    .port = "80";            #定義後端伺服器端口

}

backend king {

    .host = "192.168.9.204";

    .port = "80";

#定義通路控制清單,充許那些IP清除varnish 緩存

acl local {

    "localhost";

    "127.0.0.1";

#判斷host請求針對那個後端伺服器

sub vcl_recv {

    if (req.http.host ~ "^(www.)?kerry.com$") {  #泛域名的寫法"^(.*.)?kerry.com$"

        set req.backend = kerry;

    }

    elsif (req.http.host ~ "^(www.)?king.com$") {

        set req.backend = king;

    else {

        error 404 "Unknown HostName!";    #如果都不比對,傳回404錯誤

    #不充許非通路控制清單的IP進行varnish緩存清除

    if(req.request == "PURGE") {

        if (!client.ip ~ local) {

            error 405 "Not Allowed.";

            return (lookup);

            }

    #清除url中有jpg|png|gif等檔案的cookie

    if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") {

        unset req.http.cookie;

    #取消伺服器上p_w_picpaths目錄下所有檔案的cookie

    if (req.url ~ "^/p_w_picpaths") {

    #判斷req.http.X-Forwarded-For,如果前端有多重反向代理,這樣可以擷取用戶端IP位址。

    if (req.http.x-forwarded-for) {

        set req.http.X-Forwarded-For =

        req.http.X-Forwarded-For ", " client.ip;

        set req.http.X-Forwarded-For = client.ip;

    if (req.request != "GET" &&

        req.request != "HEAD" &&

        req.request != "PUT" &&

        req.request != "POST" &&

        req.request != "TRACE" &&

        req.request != "OPTIONS" &&

        req.request != "DELETE") {

        return (pipe);

    #針對請求和url位址判斷,是否在varnish緩存裡查找

    if (req.request != "GET" && req.request != "HEAD") {

        return (pass);

    }    ## 對非GET|HEAD請求的直接轉發給後端伺服器

    if (req.http.Authorization || req.http.Cookie) {

    if (req.request == "GET" && req.url ~ "\.(php)($|\?)") {

        }    #對GET請求,且url裡以.php和.php?結尾的,直接轉發給後端伺服器

         return (lookup);

    }        #除了以上的通路以外,都在varnish緩存裡查找

sub vcl_pipe {

    return (pipe);

sub vcl_pass {

    return (pass);

sub vcl_hash {

    set req.hash += req.url;

    if (req.http.host) {

        set req.hash += req.http.host;

    } else {

        set req.hash += server.ip;

    return (hash);

sub vcl_hit {

    if (!obj.cacheable) {

    if (req.request == "PURGE") {

            set obj.ttl = 0s;

            error 200 "Purged.";

         }

    return (deliver);

sub vcl_miss {

    return (fetch);

sub vcl_fetch {

    if (!beresp.cacheable) {

    if (beresp.http.Set-Cookie) {

    #WEB伺服器指明不緩存的内容,varnish伺服器不緩存

    if (beresp.http.Pragma ~ "no-cache" ||

        beresp.http.Cache-Control ~ "no-cache" ||

            beresp.http.Cache-Control ~ "private") {

      }

      #對.txt .js .shtml結尾的URL緩存時間設定1小時,對其他的URL緩存時間設定為10天

    if (req.request == "GET" && req.url ~ "\.(txt|js|css|shtml|html|htm)$") {

               set beresp.ttl = 3600s;

               set beresp.ttl = 10d;

#添加在頁面head頭資訊中檢視緩存命中情況

sub vcl_deliver {

    set resp.http.x-hits = obj.hits ;

    if (obj.hits > 0) {

        set resp.http.X-Cache = "HIT cqtel-bbs";

         set resp.http.X-Cache = "MISS cqtel-bbs";

sub vcl_error {

    set obj.http.Content-Type = "text/html; charset=utf-8";

    synthetic {"

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

   <head>

      <title>"} obj.status " " obj.response {"</title>

   </head>

   <body>

      <h1>Error "} obj.status " " obj.response {"</h1>

      <p>"} obj.response {"</p>

      <h3>Guru Meditation:</h3>

      <p>XID: "} req.xid {"</p>

      <hr>

      <address>

         <a href="http://www.bbs.com/">bbs cache server</a>

      </address>

   </body>

</html>

"};

注意:在2.1後的版本裡,原"obj.*"的變量全部變為"beresp.*"了,需要留意一下

啟動varnish

/usr/local/varnish/sbin/varnishd -u www -g www -f /usr/local/varnish/etc/varnish/kerry.vcl -a 192.168.9.201:80 -s file,/data/varnish/cache/varnish_cache.data,1G -w 1024,51200,10 -t 3600 -T 192.168.9.201:3000

echo "/usr/local/varnish/sbin/varnishd -u www -g www -f /usr/local/varnish/etc/varnish/kerry.vcl -a 192.168.9.201:80 -s file,/data/varnish/cache/varnish_cache.data,1G -w 1024,51200,10 -t 3600 -T 192.168.9.201:3000" >> /etc/rc.local

參數:

-u 以什麼用運作

-g 以什麼組運作

-f varnish配置檔案

-a 綁定IP和端口

-s varnish緩存檔案位置與大小

-w 最小,最大線程和逾時時間

-T varnish管理端口,主要用來清除緩存

-p client_http11=on 支援http1.1協定

-P(大P) /usr/local/varnish/var/varnish.pid 指定其程序碼檔案的位置,實作管理

停止varnish

pkill varnishd        #結束varnishd程序

啟動日志,友善分析網站通路情況

/usr/local/varnish/bin/varnishncsa -w /data/varnish/logs/varnish.log &

echo "/usr/local/varnish/bin/varnishncsa -w /data/varnish/logs/varnish.log &" >> /etc/rc.local

參數: -w 指定varnish通路日志要寫入的目錄與檔案

varnish日志切割

vi /root/cut_varnish_log.sh

#!/bin/sh

logs_path=/data/varnish/logs

vlog=${logs_path}/varnish.log

date=$(date -d "yesterday" +"%Y-%m-%d")

pkill -9 varnishncsa

mkdir -p ${logs_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/

mv /data/varnish/logs/varnish.log ${logs_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/varnish-${date}.log

使用計劃任務,每天晚上淩晨00點運作日志切割腳本

echo "0 0 * * * /root/cut_varnish_log.sh" >> /etc/crontab

cat /etc/rc.local

ulimit -SHn 51200

#============================ Varnish 緩存清除 ======================

/usr/local/varnish/bin/varnishadm -T 192.168.9.201:3000 purge "req.http.host ~ www.kerry.com$ && req.url ~ /static/p_w_picpath/tp.php"

說明:

192.168.9.201:3000 為被清除緩存伺服器位址

www.kerry.com 為被清除的域名

/static/p_w_picpath/tp.php 為被清除的url位址清單

清除所有緩存

/usr/local/varnish/bin/varnishadm -T 192.168.9.201:3000 url.purge *$

清除p_w_picpath目錄下所有緩存

/usr/local/varnish/bin/varnishadm -T 192.168.9.201:3000 url.purge /p_w_picpath/

檢視Varnish伺服器連接配接數與命中率

/usr/local/varnish/bin/varnishstat –n /data/varnish/cache/varnish_cache.data

#============================ 核心優化 ==============================

vi /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 300

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

/sbin/sysctl -p

#===================== Varnish添加到服務自啟動 ======================

配置啟動檔案

vi /etc/init.d/varnish

#! /bin/sh

#

# varnish Control the varnish HTTP accelerator

# chkconfig: - 90 10

# description: Varnish is a high-perfomance HTTP accelerator

# processname: varnishd

# config: /etc/sysconfig/varnish

# pidfile: /var/run/varnish/varnishd.pid

### BEGIN INIT INFO

# Provides: varnish

# Required-Start: $network $local_fs $remote_fs

# Required-Stop: $network $local_fs $remote_fs

# Should-Start: $syslog

# Short-Description: start and stop varnishd

# Description: Varnish is a high-perfomance HTTP accelerator

### END INIT INFO

# Source function library.

. /etc/init.d/functions

retval=0

pidfile=/var/run/varnish.pid

exec="/usr/local/varnish/sbin/varnishd"

prog="varnishd"

config="/usr/local/varnish/etc/varnish/varnish"

lockfile="/var/lock/subsys/varnish"

# Include varnish defaults

[ -e /usr/local/varnish/etc/varnish/varnish ] && . /usr/local/varnish/etc/varnish/varnish

start() {

    if [ ! -x $exec ]

    then

        echo $exec not found

        exit 5

    fi

    if [ ! -f $config ]

        echo $config not found

        exit 6

    echo -n "Starting varnish HTTP accelerator: "

    # Open files (usually 1024, which is way too small for varnish)

    ulimit -n ${NFILES:-131072}

    # Varnish wants to lock shared memory log in memory.

    ulimit -l ${MEMLOCK:-82000}

        # $DAEMON_OPTS is set in /etc/sysconfig/varnish. At least, one

        # has to set up a backend, or /tmp will be used, which is a bad idea.

    if [ "$DAEMON_OPTS" = "" ]; then

        echo "\$DAEMON_OPTS empty."

        echo -n "Please put configuration options in $config"

        return 6

    else

        # Varnish always gives output on STDOUT

        daemon   $exec -P $pidfile "$DAEMON_OPTS" > /dev/null 2>&1

        retval=$?

        if [ $retval -eq 0 ]

        then

            touch $lockfile

            echo_success

            echo

        else

            echo_failure

        fi

        return $retval

stop() {

    echo -n "Stopping varnish HTTP accelerator: "

    killproc $prog

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

restart() {

    stop

    start

reload() {

    restart

force_reload() {

rh_status() {

    status $prog

rh_status_q() {

    rh_status >/dev/null 2>&1

# See how we were called.

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

    restart)

    reload)

        rh_status_q || exit 7

    force-reload)

        force_reload

    status)

        rh_status

    condrestart|try-restart)

        restart

    *)

    echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

    exit 2

esac

exit $?

varnish的配置調用檔案,是用來告訴程式從哪裡讀取配置檔案,啟動參數有哪些等

vi /usr/local/varnish/etc/varnish

# Configuration file for varnish

# /etc/init.d/varnish expects the variable $DAEMON_OPTS to be set from this

# shell script fragment.

# Maximum number of open files (for ulimit -n)

NFILES=131072

# Locked shared memory (for ulimit -l)

# Default log size is 82MB + header

MEMLOCK=1000000

## Alternative 2, Configuration with VCL

DAEMON_OPTS="-a 192.168.9.201:80 \

             -f /usr/local/varnish/etc/varnish/kerry.vcl \

             -T 192.168.9.201:3000 \

             -u www -g www \

             -n /data/varnish/cache \

             -s file,/data/varnish/cache/varnish_cache.data,1G"

添加到系統服務,開機自啟動

chmod +x /etc/init.d/varnish

/sbin/chkconfig --add varnish

/sbin/chkconfig --level 2345 varnish on

開啟varnish

/etc/init.d/varnish start

關閉varnish

/etc/init.d/varnish stop