vim default.vcl

  1. # 使用varnish版本4的格式.
  2. vcl 4.0;
  3. # 加载后端轮询模块
  4. import directors;
  5. #######################健康检查策略区域###########################
  6. # 名为www_probe的健康检查策略
  7. probe www_probe {
  8. .request =
  9. "GET /html/test.html HTTP/1.1" # 健康检查url为/html/test.html 协议为http1.1
  10. "Host: www.xxxxx.com" # 访问的域名为www.xxxxx.com
  11. "Connection: close"; # 检查完关闭连接
  12. #其他参数 如 超时时间 检查间隔 等 均使用默认
  13. }
  14. ##################################################################
  15. #######################配置后端区域################################
  16. backend backend_16 {
  17. .host = "111.111.111.16";
  18. .port = "80";
  19. .probe = www_probe; # 使用名为www_probe的健康检查策略
  20. }
  21. backend backend_17 {
  22. .host = "111.111.111.17";
  23. .port = "80";
  24. .probe = www_probe; # 使用名为www_probe的健康检查策略
  25. }
  26. #默认后端
  27. backend default {
  28. .host = "192.168.1.1";
  29. .port = "80";
  30. }
  31. ###################################################################
  32. # 配置后端集群事件
  33. sub vcl_init {
  34. # 后端集群有4种模式 random, round-robin, fallback, hash
  35. # random 随机
  36. # round-robin 轮询
  37. # fallback 后备
  38. # hash 固定后端 根据url(req.http.url) 或 用户cookie(req.http.cookie) 或 用户session(req.http.sticky)(这个还有其他要配合)
  39. # 把backend_16 和 backend_17配置为轮询集群 取名为www_round_robin
  40. new www_round_robin = directors.round_robin();
  41. www_round_robin.add_backend(backend_16);
  42. www_round_robin.add_backend(backend_17);
  43. # 把backend_16 和 backend_17配置为随机选择集群 取名为www_random
  44. new www_random = directors.random();
  45. www_random.add_backend(backend_16,10); # 设置backend_16后端的权重为10
  46. www_random.add_backend(backend_17,5); # 设置backend_17后端的权重为5
  47. # 把backend_16 和 backend_17配置为固定后端集群 取名为www_hash 在recv调用时还需要添加东西 看recv例子
  48. new www_hash = directors.hash();
  49. www_hash.add_backend(backend_16,1); # 设置backend_16后端的权重为1
  50. www_hash.add_backend(backend_17,1); # 设置backend_17后端的权重为1
  51. }
  52. #定义允许清理缓存的IP
  53. acl purge {
  54. # For now, I'll only allow purges coming from localhost
  55. "127.0.0.1";
  56. "localhost";
  57. }
  58. # 请求入口 这里一般用作路由处理 判断是否读取缓存 和 指定该请求使用哪个后端
  59. sub vcl_recv {
  60. ##############################指定后端区域###########################
  61. # 域名为 www.xxxxx.com 的请求 指定使用名为www_round_robin的后端集群 在集群名后加上 .backend() 如只使用单独后端 直接写后端名字即可 如 = backend_16;
  62. if (req.http.host ~ "www.xxxxx.com") {
  63. set req.backend_hint = www_round_robin.backend();
  64. }
  65. # 使用固定后端集群例子 使用名为www_hash的集群
  66. if (req.http.host ~ "3g.xxxxx.com") {
  67. set req.backend_hint = www_hash.backend(req.http.cookie); # 根据用户的cookie来分配固定后端 可以指定其他分配规则
  68. }
  69. # 其他将使用default默认后端
  70. #####################################################################
  71. # 把真实客户端IP传递给后端服务器 后端服务器日志使用X-Forwarded-For来接收
  72. if (req.restarts == 0) {
  73. if (req.http.X-Forwarded-For) {
  74. set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
  75. } else {
  76. set req.http.X-Forwarded-For = client.ip;
  77. }
  78. }
  79. # 匹配清理缓存的请求
  80. if (req.method == "PURGE") {
  81. # 如果发起请求的客户端IP 不是在acl purge里面定义的 就拒绝
  82. if (!client.ip ~ purge) {
  83. return (synth(405, "This IP is not allowed to send PURGE requests."));
  84. }
  85. # 是的话就执行清理
  86. return (purge);
  87. }
  88. # 如果不是正常请求 就直接穿透没商量
  89. if (req.method != "GET" &&
  90. req.method != "HEAD" &&
  91. req.method != "PUT" &&
  92. req.method != "POST" &&
  93. req.method != "TRACE" &&
  94. req.method != "OPTIONS" &&
  95. req.method != "PATCH" &&
  96. req.method != "DELETE") {
  97. /* Non-RFC2616 or CONNECT which is weird. */
  98. return (pipe);
  99. }
  100. # 如果不是GET和HEAD就跳到pass 再确定是缓存还是穿透
  101. if (req.method != "GET" && req.method != "HEAD") {
  102. return (pass);
  103. }
  104. # 缓存通过上面所有判断的请求 (只剩下GET和HEAD了)
  105. return (hash);
  106. }
  107. # pass事件
  108. sub vcl_pass {
  109. # 有fetch,synth or restart 3种模式. fetch模式下 全部都不会缓存
  110. return (fetch);
  111. }
  112. # hash事件(缓存事件)
  113. sub vcl_hash {
  114. # 根据以下特征来判断请求的唯一性 并根据此特征来缓存请求的内容 特征为&关系
  115. # 1. 请求的url
  116. # 2. 请求的servername 如没有 就记录请求的服务器IP地址
  117. # 3. 请求的cookie
  118. hash_data(req.url);
  119. if (req.http.host) {
  120. hash_data(req.http.host);
  121. } else {
  122. hash_data(server.ip);
  123. }
  124. # 返回lookup , lookup不是一个事件(就是 并非指跳去sub vcl_lookup) 他是一个操作 他会检查有没有缓存 如没有 就会创建缓存
  125. return (lookup);
  126. }
  127. # 缓存命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
  128. sub vcl_hit {
  129. # 可以在这里添加判断事件(if) 可以返回 deliver restart synth 3个事件
  130. # deliver 表示把缓存内容直接返回给用户
  131. # restart 重新启动请求 不建议使用 超过重试次数会报错
  132. # synth 返回状态码 和原因 语法:return(synth(status code,reason))
  133. # 这里没有判断 所有缓存命中直接返回给用户
  134. return (deliver);
  135. }
  136. # 缓存不命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
  137. sub vcl_miss {
  138. # 此事件中 会默认给http请求加一个 X-Varnish 的header头 提示: nginx可以根据此header来判断是否来自varnish的请求(就不用起2个端口了)
  139. # 要取消此header头 只需要在这里添加 unset bereq.http.x-varnish; 即可
  140. # 这里所有不命中的缓存都去后端拿 没有其他操作 fetch表示从后端服务器拿取请求内容
  141. return (fetch);
  142. }
  143. # 返回给用户的前一个事件 通常用于添加或删除header头,如通过curl -I返回头中添加一个返回值,如下
  144. sub vcl_deliver {
  145. # 例子
  146. # set resp.http.* 用来添加header头 如 set resp.http.xxxxx = "haha"; unset为删除
  147. # set resp.status 用来设置返回状态 如 set resp.status = 404;
  148. # obj.hits 会返回缓存命中次数 用于判断或赋值给header头
  149. # req.restarts 会返回该请求经历restart事件次数 用户判断或赋值给header头
  150. # 根据判断缓存时间来设置xxxxx-Cache header头
  151. if (obj.hits > 0) {
  152. set resp.http.X-Cache = "cached from " + client.ip; #如果命中,则显示Hit from +客户端IP
  153. } else {
  154. set resp.http.X-Cache = "uncached"; #未命中则显示"Miss" 具体效果图在最底部
  155. }
  156. #取消显示php框架版本的header头
  157. unset resp.http.X-Powered-By;
  158. #取消显示nginx版本、Via(来自varnish)等header头 为了安全
  159. unset resp.http.Server;
  160. unset resp.http.X-Drupal-Cache;
  161. unset resp.http.Via;
  162. unset resp.http.Link;
  163. unset resp.http.X-Varnish;
  164. #显示请求经历restarts事件的次数
  165. set resp.http.X-restarts_count = req.restarts;
  166. #显示该资源缓存的时间 单位秒
  167. set resp.http.X-Age = resp.http.Age;
  168. #显示该资源命中的次数
  169. set resp.http.X-hit_count = obj.hits;
  170. #取消显示Age 为了不和CDN冲突
  171. unset resp.http.Age;
  172. #返回给用户
  173. return (deliver);
  174. }
  175. #处理对后端返回结果的事件(设置缓存、移除cookie信息、设置header头等) 在fetch事件后自动调用
  176. sub vcl_backend_response {
  177. #后端返回如下错误状态码 则不缓存
  178. if (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
  179. set beresp.uncacheable = true;
  180. }
  181. #如请求php或jsp 则不缓存
  182. if (bereq.url ~ "\.(php|jsp)(\?|$)") {
  183. set beresp.uncacheable = true;
  184. #php和jsp以外的请求
  185. }else{
  186. #如请求html 则缓存5分钟
  187. if (bereq.url ~ "\.html(\?|$)") {
  188. set beresp.ttl = 300s;
  189. unset beresp.http.Set-Cookie;
  190. #其他缓存1小时 如css js等
  191. }else{
  192. set beresp.ttl = 1h;
  193. unset beresp.http.Set-Cookie;
  194. }
  195. }
  196. #开启grace模式 表示当后端全挂掉后 即使缓存资源已过期(超过缓存时间) 也会把该资源返回给用户 资源最大有效时间为6小时
  197. set beresp.grace = 6h;
  198. #返回给用户
  199. return (deliver);
  200. }
  201. #返回给用户前的事件 可以在这里自定义输出给用户的内容
  202. sub vcl_deliver {
  203. }

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 配置文件整理的更多相关文章

  1. Linux常用的配置文件整理

    /etc/fstab    ( 分区挂载配置文件) /etc/sysconfig/network   (主机名称配置文件) /etc/sysconfig/network-scripts/ifcfg-e ...

  2. webpack常用配置总结

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  3. 使用SpringMVC+mybatis+事务控制+JSON 配置最简单WEB

    最近在总结一些项目的基础知识,根据公司最近的一些意向和技术路线,初步整理了一个简单的配置例子     1.使用springmvc代替strutsMVC     2.使用请求json数据串的方式代替传统 ...

  4. flask-基础知识

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  5. Flask 基础知识一

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  6. webpack 功能大全 【环境配置】

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  7. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析

    把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...

  8. VS Code C++ 项目快速配置模板

    两个月前我写过一篇博客 Windows VS Code 配置 C/C++ 开发环境 ,主要介绍了在 VS Code 里跑简单 C 程序的一些方法.不过那篇文章里介绍的方法仅适用于单文件程序,所以稍微大 ...

  9. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 0x00 摘要 0x01 总体流程 ...

随机推荐

  1. 【vue】vue +element 搭建项目,实现实时输入效果时停止输入后发送请求

    1.实现的效果 输入关键字后,根据输入的关键字实时显示搜索的结果,按回车键时也进行搜索 2.原理: 通过时间戳+定时器+一个全局变量实现.代码量很少比较易懂. 用户输入时触发keyup事件,并调用事件 ...

  2. jenkins+svn+python+appium启动+mail+html报告

    第一步:jenkins从svn中获取最新的测试代码 1.jenkins启动,进入jenkins目录,使用“java -jar jenkins.war”启动(安装后,jenkins已自启动,不用再自己启 ...

  3. Node.js之mysql增删改查

    1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...

  4. 使用hibernate造成的MySql 8小时问题解决方案

    本文借鉴了网上的很多博客,在此不再声明 总结 1.增加 MySQL 的 wait_timeout 属性的值(不推荐) mysql5之前的版本,可以在jdbc连接的url中加入:autoReconnec ...

  5. gohost -- go 开发的命令行hosts配置管理工具

    前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,

  6. Omi v1.0震撼发布 - 开放现代的Web组件化框架

    原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...

  7. Django 的路由层 视图层 模板层

    --------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...

  8. H5 后代选择器

    12-后代选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是段落 <!DOCTYPE html> <html lang="en"> <he ...

  9. Python Revisited Day 03 (组合数据类型)

    目录 第三章 组合数据类型 3.1 序列类型 3.1.1 元组 3.1.2 命名的元组 (collections.nametuple()) 3.1.3 列表 (查询有关函数点这) 3.1.4 列表内涵 ...

  10. ubuntu中更改apache默认目录的方法

    如上,在这两个文件中,我都改为/home/www 及/home/www/html