varnish4.1.8安裝
varnish版本:varnish4.1.8
安裝步驟:
-
安裝依賴包:
yum install -y autoconf automake jemalloc-devel libedit-devel libtool ncurses devel pcre-devel pkgconfig python-docutils python-sphinx graphviz
/home/work/install里面,下載varnish源碼包:
wget http://varnish-cache.org/_downloads/varnish-4.1.8.tgz
cd /home/work/install/varnish-4.1.8
./authgen.sh
./configure --prefix=/home/work/varnish
默認安裝位置指定為/home/work/varnish
make && sudo make install
ldconfig
啟動腳本
- 啟動腳本,在/home/workl/varnish/bin下新建啟動腳本
start.sh
:
#! /bin/bash
# rootpath指定啟動腳本和配置文件的根目錄
ROOTPATH=/home/work/varnish
${ROOTPATH}/sbin/varnishd -P ${ROOTPATH}/conf/varnish.pid -f ${ROOTPATH}/conf/default.vcl -a 0.0.0.0:8080 -T 0.0.0.0:8081 -t 120 -S ${ROOTPATH}/conf/secret -s malloc,1024MB -F
注意:-a
參數(shù)指定了varnish監(jiān)聽的IP和端口。varnish4.1.8如果配置成 -a: 6081
,啟動時候,便會拋錯:Address family not supported by protocol
。varnish4需要配置成:-a 0.0.0.0:8080
,表示接受來自任何IP(0.0.0.0)訪問8080端口的請求。而varnish5.1版本,-a參數(shù)就可以直接配置成-a :8080
。這一點,是varnish4和varnish5的一點小小不同。
配置文件。
該配置文件用于緩存HLS協(xié)議的TS視頻文件,對于m3u8以及其他文件,不緩存。
新建/home/work/varnish/conf文件夾,其中default.vcl配置如下:
vcl 4.0;
# 指定后端源站
backend default {
.host = "127.0.0.1";
.port = "8446";
}
sub vcl_recv {
if (req.url ~ "^/[^?]+\.(m3u8|ts|jpeg|jpg|png|gif|ico|js|css|txt|zip|html|htm)(\?.*|)$") {
# 去除 Cookies (靜態(tài)文件通常不需要處理 Cookies)
unset req.http.cookie;
unset req.http.cache-control;
unset req.http.pragma;
}
# url提取,去掉query string,優(yōu)化緩存空間
set req.url = regsub(req.url, "\?.*$", "");
# m3u8文件不保存
if (req.url ~ ".*\.m3u8.*") {
return(pass);
}
# 為發(fā)往后端主機的請求添加X-Forward-For首部
if (req.http.X-Forward-For) {
set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
} else {
set req.http.X-Forward-For = client.ip;
}
return(hash);
}
sub vcl_hash {
# 只根據(jù)URL獲取object的hashkey
# 注意,不加這句話,源站分發(fā)的文件與瀏覽器獲取這個文件,走的不是一個hash key
hash_data(req.url);
return(lookup);
}
sub vcl_hit {
if (obj.ttl >= 0s) {
return(deliver);
}
if (obj.ttl + obj.grace > 0s) {
return(deliver);
}
return(pass);
}
sub vcl_backend_response {
# 去除backend的set-cookie,防止ts文件不緩存
if (bereq.url ~ "^/[^?]+\.(m3u8|ts|jpeg|jpg|png|gif|ico|js|css|txt|zip|html|htm)(\?.*|)$") {
unset beresp.http.set-cookie;
}
# m3u8文件不保存,ts文件設置240s緩存時間
if (bereq.url ~ ".*\.m3u8.*") {
set beresp.ttl = 240s;
set beresp.uncacheable = true;
} else if (bereq.url ~ ".*\.ts.*") {
set beresp.ttl = 240s;
}
}
sub vcl_deliver {
# 設置response是否varnish命中、以及命中數(shù)
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
set resp.http.X-Cache-Hits = obj.hits;
# 跨域的解決
set resp.http.Access-Control-Allow-Origin = "*";
}