请选择 进入手机版 | 继续访问电脑版

[LINUX] Linux下Varnish缓存服务器的安装与设置 教程

[复制链接]
查看50 | 回复9 | 2021-9-4 22:55:39 | 显示全部楼层 |阅读模式

Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速率 更快、管理更方便等诸多长处 。作者Poul-Henning Kamp是FreeBSD的内核开发 者之一。Varnish采用全新的软件体系架构,和现在 的硬件提交共同 精密 。在1975年时,储存媒介 只有两种:内存与硬盘。但现在 计算 机体系 的内存除了主存外,还包括了cpu内的L1、L2,乃至 有L3快取。硬盘上也有本身 的快取装置,因此squid cache自行处理物件更换 的架构不大概 得知这些环境 而做到最佳化,但操作体系 可以得知这些环境 ,以是 这部份的工作应该交给操作体系 处理,这就是 Varnish cache计划 架构。
挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 利用 3台Varnish代替了原来的12台squid,性能居然比从前 更好,这是Varnish最成功的应用案例。


Varnish特点:
1.基于内存举行 缓存,重启后数据将消散
2.利用 假造 内存方式,I/O性能好
3.支持设置0~60秒的准确 缓存时间
4.VCL设置 管理比较机动
5.32位机器上缓存文件大小最大为2G
6.具有强盛 的管理功能,比方 top、stat、admin、list等
7.状态机设置奥妙 ,布局 清楚
8.利用 二叉堆管理缓存文件,可达到积极删除目标


Varnish与Squid的对比
Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点,如下:
类似 点:
都是一个反向代理服务器
都是开源软件
不同点,也是Varnish的长处 :
Varnish的稳固 性很高,两者在完成类似 负荷的工作时,Squid服务器发生故障的几率要高于Varnish,由于 利用 Squid要常常 重启。
Varnish访问速率 更快,Varnish采用了“Visual Page Cache”技术,全部 缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速率 方面会更快。
Varnish可以支持更多的并发毗连 ,由于 Varnish的TCP毗连 开释 要比Squid快。因而在高并发毗连 环境 下可以支持更多TCP毗连 。
Varnish可以通过管理端口,利用 正则表达式批量的打扫 部分缓存,而Squid是做不到的。
squid属于是单历程 利用 单核CPU,但Varnish是通过fork情势 打开多历程 来做处理,以是 是合理的利用 全部 核来处理相应的哀求 。
当然,与传统的Squid相比,Varnish也是有缺点的,如下:
varnish历程 一旦挂起、崩溃或者重启,缓存数据都会从内存中完全开释 ,此时全部 哀求 都会发送到后端服务器,在高并发环境 下,会给后端服务器造成很大压力。
在varnish利用 中假如 单个url的哀求 通过HA/F5(负载均衡 )每次哀求 不同的varnish服务器中,被哀求 varnish服务器都会被穿透到后端,而且同样的哀求 会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能降落 。
办理 方案:
综上所述在访问量很大的环境 下保举 利用 varnish的内存缓存方式启动,而且后面必要 跟多台squid服务器。重要 为了防止前面的varnish服务、服务器被重启的环境 下,前期肯定会有很多的穿透如许 squid可以担当第二层cache,而且也补充 了varnish缓存在内存中重启都会开释 的题目 。
如许 的题目 可以在负载均衡 上做url哈希,让单个url哀求 固定哀求 到一台varnish服务器上,可以办理 该题目 。


varnish的工作流程
1、历程 之间通讯
varnish启动或有2个历程 master(management)历程 和child(worker)历程 。master读入存储设置 下令 ,举行 初始化,然后fork,监控child。child则分配线程举行 cache工作,child还会做管理线程和天生 很多worker线程。
child历程 主线程初始化过程中,将存储大文件整个加载到内存中,假如 该文件超出体系 的假造 内存,则会减少原来设置 mmap大小,然后继续加载,这时间 创建并初始化空闲存储布局 体,放在存储管理的struct中,等待分配。
接着varnish某个负责接口新http毗连 的线程开始等待用户,假如 有新的http毗连 ,但是这个线程只负责汲取 ,然后唤醒等待线程池中的work线程,举行 哀求 处理。
worker线程读入uri后,将会查找已有的object,掷中 直接返回,没有掷中 ,则会从后端服务器中取出来,放到缓存中。假如 缓存已满,会根据LRU算法,开释 旧的object。对于开释 缓存,有一个超时线程会检测缓存中全部 object的生命周期,假如 缓存过期(ttl),则删除,开释 相应的存储内存。
2、设置 文件各布局 之间通讯

2016411132937298.jpg (864×1085)

Varnish安装

复制代码代码如下:
wget http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.33.tar.gz
tar xzf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install
cd ../

varnish-3.0.4报错如下:
varnishadm.c:48:33: error: editline/readline.h: No such file or directory
varnishadm.c: In function 'cli_write':
varnishadm.c:76: warning: implicit declaration of function 'rl_callback_handler_remove'
varnishadm.c:76: warning: nested extern declaration of 'rl_callback_handler_remove'
varnishadm.c: In function 'send_line':
varnishadm.c:179: warning: implicit declaration of function 'add_history'
varnishadm.c:179: warning: nested extern declaration of 'add_history'
varnishadm.c: In function 'varnishadm_completion':
varnishadm.c:216: warning: implicit declaration of function 'rl_completion_matches'
varnishadm.c:216: warning: nested extern declaration of 'rl_completion_matches'
varnishadm.c:216: warning: assignment makes pointer from integer without a cast
varnishadm.c: In function 'pass':
varnishadm.c:233: error: 'rl_already_prompted' undeclared (first use in this function)
varnishadm.c:233: error: (Each undeclared identifier is reported only once
varnishadm.c:233: error: for each function it appears in.)
varnishadm.c:235: warning: implicit declaration of function 'rl_callback_handler_install'
varnishadm.c:235: warning: nested extern declaration of 'rl_callback_handler_install'
varnishadm.c:239: error: 'rl_attempted_completion_function' undeclared (first use in this function)
varnishadm.c:300: warning: implicit declaration of function 'rl_forced_update_display'
varnishadm.c:300: warning: nested extern declaration of 'rl_forced_update_display'
varnishadm.c:303: warning: implicit declaration of function 'rl_callback_read_char'
varnishadm.c:303: warning: nested extern declaration of 'rl_callback_read_char'
make[3]: *** [varnishadm-varnishadm.o] Error 1
make[3]: Leaving directory `/root/lnmp/src/varnish-3.0.4/bin/varnishadm'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/root/lnmp/src/varnish-3.0.4/bin'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/lnmp/src/varnish-3.0.4'
make: *** [all] Error 2
报错没找到办理 方法,选varnish-3.0.3

复制代码代码如下:
wget http://repo.varnish-cache.org/source/varnish-3.0.3.tar.gz
tar xzf varnish-3.0.3.tar.gz
cd varnish-3.0.3
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings --enable-dependency-tracking --with-jemalloc
make && make install
/usr/bin/install -m 755 ./redhat/varnish.initrc /etc/init.d/varnish
/usr/bin/install -m 644 ./redhat/varnish.sysconfig /etc/sysconfig/varnish
/usr/bin/install -m 755 ./redhat/varnish_reload_vcl /usr/local/varnish/bin
useradd -M -s /sbin/nologin varnish


复制代码代码如下:
ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
ln -s /usr/local/varnish/bin/varnish_reload_vcl /usr/bin/
ln -s /usr/local/varnish/bin/varnishadm /usr/bin/


复制代码代码如下:
chkconfig --add varnish
chkconfig varnish on


天生 varnish管理秘钥:

复制代码代码如下:
uuidgen > /usr/local/varnish/etc/varnish/secret
chmod 644 /usr/local/varnish/etc/varnish/secret


修改varnish启动设置 :

复制代码代码如下:
sed -i "s@^VARNISH_VCL_CONF=/etc/varnish/default.vcl@#VARNISH_VCL_CONF=/etc/varnish/default.vcl\nVARNISH_VCL_CONF=/usr/local/varnish/etc/varnish/linuxeye.vcl@" /etc/sysconfig/varnish
sed -i "s@^VARNISH_LISTEN_PORT=6081@#VARNISH_LISTEN_PORT=6081\nVARNISH_LISTEN_PORT=80@" /etc/sysconfig/varnish
sed -i "s@^VARNISH_SECRET_FILE=/etc/varnish/secret@#VARNISH_SECRET_FILE=/etc/varnish/secret\nVARNISH_SECRET_FILE=/usr/local/varnish/etc/varnish/secret@" /etc/sysconfig/varnish
sed -i "s@^VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin@#VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin\nVARNISH_STORAGE_FILE=/usr/local/varnish/var/varnish_storage.bin@" /etc/sysconfig/varnish
sed -i "s@^VARNISH_STORAGE_SIZE.*@VARNISH_STORAGE_SIZE=150M@" /etc/sysconfig/varnish
sed -i "s@^VARNISH_STORAGE=.*@VARNISH_STORAGE=\"malloc,\${VARNISH_STORAGE_SIZE}\"@" /etc/sysconfig/varnish

假设你的服务器拥有多颗逻辑处理器,还可以做以下的设置:
/etc/sysconfig/varnish 内里 还可以添加自定义的参数,用”-p 参数“的方式添加,如:
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE} \
             -p thread_pools=2" #这里为添加项
Varnish启动后进入后台运行,同时返回下令 行状态。必要 注意 的是,Varnish运行时会同时启动两个历程 ,一个主历程 ,一个是子历程 ,假如 子历程 出现题目 ,主历程 将重新天生 一个子历程 。


VCL设置

复制代码代码如下:
/usr/local/varnish/etc/varnish/linuxeye.vcl
#通过backend定义了一个名称为webserver的后端主机,“.host”指定后端主机的IP地址或者域名,“.port”指定后端主机的服务端口。
backend webserver {
.host = "127.0.0.1";
.port = "8080";
}
#调用vcl_recv开始
sub vcl_recv {
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
#假如 哀求 的范例 不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE时,进入pipe模式。注意 这里是“&&”的关系
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
#假如 哀求 的范例 不是GET与HEAD,则进入pass模式
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
return (pass);
} #对linuxeye.com域名举行 缓存加速,这是个泛域名的概念,也就是全部 以linuxeye.com末端 的域名都举行 缓存
if (req.http.host ~ "^(.*).linuxeye.com") {
set req.backend = webserver;
}
#对以.jsp、.do、php末端 以及带有?的URL时,直接从后端服务器读取内容
if (req.url ~ "\.(jsp|do|php)($|\?)") {
return (pass);
} else {
return (lookup);
}
}

sub vcl_pipe {
return (pipe);
}

sub vcl_pass {
return (pass);
}

sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}

sub vcl_hit {
return (deliver);
}

sub vcl_miss {
return (fetch);
}


复制代码代码如下:
#对于哀求 范例 是GET,并且哀求 的URL中包含upload,那么就举行 缓存,缓存的时间是300秒,即5分钟
sub vcl_fetch {
if (req.request == "GET" && req.url ~ "^/upload(.*)$") {
set beresp.ttl = 300s;
}

if (req.request == "GET" && req.url ~ "\.(png|gif|jpg|jpeg|bmp|swf|css|js|html|htm|xsl|xml|pdf|ppt|doc|docx|chm|rar|zip|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|txt)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 30d;
}
return (deliver);
}


复制代码代码如下:
#下面是添加一个Header标识,以判定 缓存是否掷中
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from demo.linuxeye.com";
} else {
set resp.http.X-Cache = "MISS from demo.linuxeye.com";
}
return (deliver);
}


复制代码代码如下:
#利用 vcl_error可以定制一个错误页面
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
set obj.http.Retry-After = "5";
synthetic {"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


"} + obj.status + " " + obj.response + {"


Error "} + obj.status + " " + obj.response + {"


"} + obj.response + {"


Guru Meditation:


XID: "} + req.xid + {"




Varnish cache server




"};
return (deliver);
}

sub vcl_init {
return (ok);
}

sub vcl_fini {
return (ok);
}

检查VCL设置 是否准确 :

复制代码代码如下:
service varnish configtest



复制代码代码如下:
varnishd -C -f /usr/local/varnish/etc/varnish/linuxeye.vcl

启动varnish:

复制代码代码如下:
service varnish start

查看varnish状态:

复制代码代码如下:
service varnish status

动态加载VCL设置 :

复制代码代码如下:
service varnish reload

克制 varnish:

复制代码代码如下:
service varnish stop

查看当前varnish监听的80端口:

复制代码代码如下:
# netstat -tpln | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15249/varnishd
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 19468/nginx
tcp 0 0 :::80 :::* LISTEN 15249/varnishd


查看varnish历程 :

复制代码代码如下:
# ps -ef | grep varnishd | grep -v grep
root 15248 1 0 11:47 ? 00:00:00 /usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /usr/local/varnish/etc/varnish/linuxeye.vcl -T 127.0.0.1:6082 -t 120 -w 50,1000,120 -u varnish -g varnish -S /usr/local/varnish/etc/varnish/secret -s malloc,150M
varnish 15249 15248 0 11:47 ? 00:00:00 /usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /usr/local/varnish/etc/varnish/linuxeye.vcl -T 127.0.0.1:6082 -t 120 -w 50,1000,120 -u varnish -g varnish -S /usr/local/varnish/etc/varnish/secret -s malloc,150M

Varnish访问日记
varnishncsa可以利用 NCSA通用日记 格式(NCSA Common Log Format)将HTTP哀求 记录到日记 文件.

复制代码代码如下:
/usr/bin/install -m 755 ./redhat/varnishncsa.initrc /etc/init.d/varnishncsa
chmod +x /etc/init.d/varnishncsa
chkconfig varnishncsa on
mkdir -p /usr/local/varnish/logs

编辑varnishncsa启动设置

复制代码代码如下:
ln -s /usr/local/varnish/bin/varnishncsa /usr/bin
sed -i 's@^logfile.*@logfile="/usr/local/varnish/logs/varnishncsa.log"@' /etc/init.d/varnishncsa

启动varnishncsa:

复制代码代码如下:
service varnishncsa start

利用 logrotate轮询日记 文件(每天 轮询):

复制代码代码如下:
cat > /etc/logrotate.d/varnish << EOF
/usr/local/varnish/logs/varnishncsa.log {
daily
rotate 5
missingok
dateext
compress
notifempty
sharedscripts
postrotate
[ -e /var/run/varnishncsa.pid ] && kill -USR1 \`cat /var/run/varnishncsa.pid\`
endscript
}
EOF

日记 轮询debug测试:

复制代码代码如下:
logrotate -df /etc/logrotate.d/varnish


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 找食的麻雀粮 | 2021-9-20 02:37:22 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

avatar 城外606 | 2021-9-20 17:32:42 | 显示全部楼层
admin楼主的病历本丢我这里了!
回复

使用道具 举报

avatar 123457682 | 2021-9-27 23:05:23 | 显示全部楼层
admin楼主是我最崇拜的人!
回复

使用道具 举报

avatar 光荣与梦想483 | 2021-10-11 13:03:19 | 显示全部楼层
没人理我,好伤心啊!
回复

使用道具 举报

avatar 123457595 | 2021-10-12 08:54:07 | 显示全部楼层
admin楼主内心很强大!
回复

使用道具 举报

avatar 王太保 | 2021-10-12 22:06:25 | 显示全部楼层
admin楼主看起来很有学问!
回复

使用道具 举报

我和我的小伙伴都惊呆了!
回复

使用道具 举报

支持一下,下面的保持队形!
回复

使用道具 举报

admin楼主的帖子越来越有深度了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则