varnish4 配置文件整理
vim default.vcl
- # 使用varnish版本4的格式.
- vcl 4.0;
- # 加载后端轮询模块
- import directors;
- #######################健康检查策略区域###########################
- # 名为www_probe的健康检查策略
- probe www_probe {
- .request =
- "GET /html/test.html HTTP/1.1" # 健康检查url为/html/test.html 协议为http1.1
- "Host: www.xxxxx.com" # 访问的域名为www.xxxxx.com
- "Connection: close"; # 检查完关闭连接
- #其他参数 如 超时时间 检查间隔 等 均使用默认
- }
- ##################################################################
- #######################配置后端区域################################
- backend backend_16 {
- .host = "111.111.111.16";
- .port = "80";
- .probe = www_probe; # 使用名为www_probe的健康检查策略
- }
- backend backend_17 {
- .host = "111.111.111.17";
- .port = "80";
- .probe = www_probe; # 使用名为www_probe的健康检查策略
- }
- #默认后端
- backend default {
- .host = "192.168.1.1";
- .port = "80";
- }
- ###################################################################
- # 配置后端集群事件
- sub vcl_init {
- # 后端集群有4种模式 random, round-robin, fallback, hash
- # random 随机
- # round-robin 轮询
- # fallback 后备
- # hash 固定后端 根据url(req.http.url) 或 用户cookie(req.http.cookie) 或 用户session(req.http.sticky)(这个还有其他要配合)
- # 把backend_16 和 backend_17配置为轮询集群 取名为www_round_robin
- new www_round_robin = directors.round_robin();
- www_round_robin.add_backend(backend_16);
- www_round_robin.add_backend(backend_17);
- # 把backend_16 和 backend_17配置为随机选择集群 取名为www_random
- new www_random = directors.random();
- www_random.add_backend(backend_16,10); # 设置backend_16后端的权重为10
- www_random.add_backend(backend_17,5); # 设置backend_17后端的权重为5
- # 把backend_16 和 backend_17配置为固定后端集群 取名为www_hash 在recv调用时还需要添加东西 看recv例子
- new www_hash = directors.hash();
- www_hash.add_backend(backend_16,1); # 设置backend_16后端的权重为1
- www_hash.add_backend(backend_17,1); # 设置backend_17后端的权重为1
- }
- #定义允许清理缓存的IP
- acl purge {
- # For now, I'll only allow purges coming from localhost
- "127.0.0.1";
- "localhost";
- }
- # 请求入口 这里一般用作路由处理 判断是否读取缓存 和 指定该请求使用哪个后端
- sub vcl_recv {
- ##############################指定后端区域###########################
- # 域名为 www.xxxxx.com 的请求 指定使用名为www_round_robin的后端集群 在集群名后加上 .backend() 如只使用单独后端 直接写后端名字即可 如 = backend_16;
- if (req.http.host ~ "www.xxxxx.com") {
- set req.backend_hint = www_round_robin.backend();
- }
- # 使用固定后端集群例子 使用名为www_hash的集群
- if (req.http.host ~ "3g.xxxxx.com") {
- set req.backend_hint = www_hash.backend(req.http.cookie); # 根据用户的cookie来分配固定后端 可以指定其他分配规则
- }
- # 其他将使用default默认后端
- #####################################################################
- # 把真实客户端IP传递给后端服务器 后端服务器日志使用X-Forwarded-For来接收
- 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;
- }
- }
- # 匹配清理缓存的请求
- if (req.method == "PURGE") {
- # 如果发起请求的客户端IP 不是在acl purge里面定义的 就拒绝
- if (!client.ip ~ purge) {
- return (synth(405, "This IP is not allowed to send PURGE requests."));
- }
- # 是的话就执行清理
- return (purge);
- }
- # 如果不是正常请求 就直接穿透没商量
- if (req.method != "GET" &&
- req.method != "HEAD" &&
- req.method != "PUT" &&
- req.method != "POST" &&
- req.method != "TRACE" &&
- req.method != "OPTIONS" &&
- req.method != "PATCH" &&
- req.method != "DELETE") {
- /* Non-RFC2616 or CONNECT which is weird. */
- return (pipe);
- }
- # 如果不是GET和HEAD就跳到pass 再确定是缓存还是穿透
- if (req.method != "GET" && req.method != "HEAD") {
- return (pass);
- }
- # 缓存通过上面所有判断的请求 (只剩下GET和HEAD了)
- return (hash);
- }
- # pass事件
- sub vcl_pass {
- # 有fetch,synth or restart 3种模式. fetch模式下 全部都不会缓存
- return (fetch);
- }
- # hash事件(缓存事件)
- sub vcl_hash {
- # 根据以下特征来判断请求的唯一性 并根据此特征来缓存请求的内容 特征为&关系
- # 1. 请求的url
- # 2. 请求的servername 如没有 就记录请求的服务器IP地址
- # 3. 请求的cookie
- hash_data(req.url);
- if (req.http.host) {
- hash_data(req.http.host);
- } else {
- hash_data(server.ip);
- }
- # 返回lookup , lookup不是一个事件(就是 并非指跳去sub vcl_lookup) 他是一个操作 他会检查有没有缓存 如没有 就会创建缓存
- return (lookup);
- }
- # 缓存命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
- sub vcl_hit {
- # 可以在这里添加判断事件(if) 可以返回 deliver restart synth 3个事件
- # deliver 表示把缓存内容直接返回给用户
- # restart 重新启动请求 不建议使用 超过重试次数会报错
- # synth 返回状态码 和原因 语法:return(synth(status code,reason))
- # 这里没有判断 所有缓存命中直接返回给用户
- return (deliver);
- }
- # 缓存不命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
- sub vcl_miss {
- # 此事件中 会默认给http请求加一个 X-Varnish 的header头 提示: nginx可以根据此header来判断是否来自varnish的请求(就不用起2个端口了)
- # 要取消此header头 只需要在这里添加 unset bereq.http.x-varnish; 即可
- # 这里所有不命中的缓存都去后端拿 没有其他操作 fetch表示从后端服务器拿取请求内容
- return (fetch);
- }
- # 返回给用户的前一个事件 通常用于添加或删除header头,如通过curl -I返回头中添加一个返回值,如下:
- sub vcl_deliver {
- # 例子
- # set resp.http.* 用来添加header头 如 set resp.http.xxxxx = "haha"; unset为删除
- # set resp.status 用来设置返回状态 如 set resp.status = 404;
- # obj.hits 会返回缓存命中次数 用于判断或赋值给header头
- # req.restarts 会返回该请求经历restart事件次数 用户判断或赋值给header头
- # 根据判断缓存时间来设置xxxxx-Cache header头
- if (obj.hits > 0) {
- set resp.http.X-Cache = "cached from " + client.ip; #如果命中,则显示Hit from +客户端IP
- } else {
- set resp.http.X-Cache = "uncached"; #未命中则显示"Miss" 具体效果图在最底部
- }
- #取消显示php框架版本的header头
- unset resp.http.X-Powered-By;
- #取消显示nginx版本、Via(来自varnish)等header头 为了安全
- unset resp.http.Server;
- unset resp.http.X-Drupal-Cache;
- unset resp.http.Via;
- unset resp.http.Link;
- unset resp.http.X-Varnish;
- #显示请求经历restarts事件的次数
- set resp.http.X-restarts_count = req.restarts;
- #显示该资源缓存的时间 单位秒
- set resp.http.X-Age = resp.http.Age;
- #显示该资源命中的次数
- set resp.http.X-hit_count = obj.hits;
- #取消显示Age 为了不和CDN冲突
- unset resp.http.Age;
- #返回给用户
- return (deliver);
- }
- #处理对后端返回结果的事件(设置缓存、移除cookie信息、设置header头等) 在fetch事件后自动调用
- sub vcl_backend_response {
- #后端返回如下错误状态码 则不缓存
- if (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
- set beresp.uncacheable = true;
- }
- #如请求php或jsp 则不缓存
- if (bereq.url ~ "\.(php|jsp)(\?|$)") {
- set beresp.uncacheable = true;
- #php和jsp以外的请求
- }else{
- #如请求html 则缓存5分钟
- if (bereq.url ~ "\.html(\?|$)") {
- set beresp.ttl = 300s;
- unset beresp.http.Set-Cookie;
- #其他缓存1小时 如css js等
- }else{
- set beresp.ttl = 1h;
- unset beresp.http.Set-Cookie;
- }
- }
- #开启grace模式 表示当后端全挂掉后 即使缓存资源已过期(超过缓存时间) 也会把该资源返回给用户 资源最大有效时间为6小时
- set beresp.grace = 6h;
- #返回给用户
- return (deliver);
- }
- #返回给用户前的事件 可以在这里自定义输出给用户的内容
- sub vcl_deliver {
- }
varnish 启动
1)手动启动
varnishd -f /etc/varnish/default.vcl -s malloc,256M -T 127.0.0.1:2000 -a 0.0.0.0:80
or
varnishd -a 192.168.1.203:80 -f /etc/varnish/default.vcl
-T 127.0.0.1:6082 -t 120 -p thread_pool_min=50
-p thread_pool_max=1000 -p thread_pool_timeout=120
-u varnish -g varnish -S /etc/varnish/secret -s malloc,256M
-s 指定缓存方式 malloc 内存 file 硬盘
-s malloc,256M
-s file,/cache/data,1G
-f /etc/varnish/default.vcl 指定配置文件路径
-T 127.0.0.1:6082 Varnish 管理ip及端口 (telnet 127.0.0.1 6082)
-t 120
-p thread_pool_min=50 -p thread_pool_max=1000 -p thread_pool_timeout=120 线程最小 最大 数量 超时时间
-u varnish -g varnish 运行varnish进程的用户及组
-S /etc/varnish/secret varnish安全文件
转载自:http://www.ttlsa.com/nginx/varnish-4-configure-file/
varnish4 配置文件整理的更多相关文章
- Linux常用的配置文件整理
/etc/fstab ( 分区挂载配置文件) /etc/sysconfig/network (主机名称配置文件) /etc/sysconfig/network-scripts/ifcfg-e ...
- webpack常用配置总结
1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...
- 使用SpringMVC+mybatis+事务控制+JSON 配置最简单WEB
最近在总结一些项目的基础知识,根据公司最近的一些意向和技术路线,初步整理了一个简单的配置例子 1.使用springmvc代替strutsMVC 2.使用请求json数据串的方式代替传统 ...
- flask-基础知识
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- Flask 基础知识一
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- webpack 功能大全 【环境配置】
1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析
把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...
- VS Code C++ 项目快速配置模板
两个月前我写过一篇博客 Windows VS Code 配置 C/C++ 开发环境 ,主要介绍了在 VS Code 里跑简单 C 程序的一些方法.不过那篇文章里介绍的方法仅适用于单文件程序,所以稍微大 ...
- [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4)
[源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 0x00 摘要 0x01 总体流程 ...
随机推荐
- 【vue】vue +element 搭建项目,实现实时输入效果时停止输入后发送请求
1.实现的效果 输入关键字后,根据输入的关键字实时显示搜索的结果,按回车键时也进行搜索 2.原理: 通过时间戳+定时器+一个全局变量实现.代码量很少比较易懂. 用户输入时触发keyup事件,并调用事件 ...
- jenkins+svn+python+appium启动+mail+html报告
第一步:jenkins从svn中获取最新的测试代码 1.jenkins启动,进入jenkins目录,使用“java -jar jenkins.war”启动(安装后,jenkins已自启动,不用再自己启 ...
- Node.js之mysql增删改查
1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...
- 使用hibernate造成的MySql 8小时问题解决方案
本文借鉴了网上的很多博客,在此不再声明 总结 1.增加 MySQL 的 wait_timeout 属性的值(不推荐) mysql5之前的版本,可以在jdbc连接的url中加入:autoReconnec ...
- gohost -- go 开发的命令行hosts配置管理工具
前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,
- Omi v1.0震撼发布 - 开放现代的Web组件化框架
原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...
- Django 的路由层 视图层 模板层
--------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...
- H5 后代选择器
12-后代选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是段落 <!DOCTYPE html> <html lang="en"> <he ...
- Python Revisited Day 03 (组合数据类型)
目录 第三章 组合数据类型 3.1 序列类型 3.1.1 元组 3.1.2 命名的元组 (collections.nametuple()) 3.1.3 列表 (查询有关函数点这) 3.1.4 列表内涵 ...
- ubuntu中更改apache默认目录的方法
如上,在这两个文件中,我都改为/home/www 及/home/www/html