Varnish+Nginx 配置----Varnish

2024-03-31 12:38
文章标签 配置 nginx varnish

本文主要是介绍Varnish+Nginx 配置----Varnish,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近项目引入反向代理和缓存,熟悉了一下Squid、Apache、Valish、Nginx,根据项目实际进行选择,客观来说,采用Linux系统部署最好,也没有什么难度,但实际情况必须采用Windows系统(本着方案要结合现实的原则,研究要以Windows平台为主)。


一  Varnish启动:

e:
cd e:\varnish\bin
set PATH=%CD%;%PATH%
varnishd -a :7575 -T :11212 -f /etc/varnish_cst_cfg.vcl -s file,E:/var/varnish/tg/cache/jjtg,1024M -p thread_pool_max=5000 -p thread_pool_min=100 
REM pause
二  Varnish配置:
# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
# 
# Default backend definition.  Set this to point to your content
# server.backend tgweb {.host = "192.168.45.45";.port = "7574";.connect_timeout = 20s;.first_byte_timeout = 20s;.between_bytes_timeout = 20s;}#允许刷新缓存的规则
#acl purgeAllow {
#     #只能本机进行刷新
#     "localhost";
#}# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.sub vcl_recv {#判断请求主机,跳转到相应后端服务器if(req.http.host ~ "^(.*)(tg.stockjyb.com:7575)"){set req.backend=tgweb;}else{error 408 "Hostname not found"; }#grace缓存过期仍存放# 若backend是健康的,则仅grace 5s,如果backend不健康,则grace 1m。# 这里,5s的目的是为了提高高并发时的吞吐率;# 1m的目的是,backend挂了之后,还能继续服务一段时间,期望backend挂的不要太久。。。if (req.backend.healthy) {set req.grace = 5s;} else {set req.grace = 1m;}#刷新缓存的处理#if (req.request == "PURGE"){#    if(!client.ip ~ purgeAllow) {#            error 405 "Not allowed.";#    }#    #转到hit或者miss处理#    return (lookup);#}#移除一些特定格式的cookieif (req.url ~ "^(.*)\.(jpg|png|gif|jpeg|flv|bmp|gz|tgz|bz2|tbz|js|css|html|htm)($|\?)" ) {#移除cookie,以便能缓存到varnishunset req.http.cookie;}#Accept-Encoding 是浏览器发给服务器,声明浏览器支持的编码类型的#修正客户端的Accept-Encoding头信息#防止个别浏览器发送类似 deflate, gzipif (req.http.Accept-Encoding) {if (req.url ~ "^(.*)\.(jpg|png|gif|jpeg|flv|bmp|gz|tgz|bz2|tbz)($|\?)" ) {remove req.http.Accept-Encoding;}else if (req.http.Accept-Encoding ~ "gzip"){set req.http.Accept-Encoding = "gzip";} else if (req.http.Accept-Encoding ~ "deflate"){set req.http.Accept-Encoding = "deflate";} else if (req.http.Accept-Encoding ~ "sdch"){#chrome新增加的压缩set req.http.Accept-Encoding = "sdch";}else {remove req.http.Accept-Encoding;}}#首次访问增加X-Forwarded-For头信息,方便后端程序获取客户端ipif (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.request != "GET" &&#    req.request != "HEAD" &&#    req.request != "PUT" &&#    req.request != "POST" &&#    req.request != "TRACE" &&#    req.request != "OPTIONS" &&#    req.request != "DELETE") {#    /* Non-RFC2616 or CONNECT which is weird. */#    return (pipe);#}if (req.request != "GET" && req.request != "HEAD") {/* We only deal with GET and HEAD by default */return (pass);}if (req.http.Authorization) {/* Not cacheable by default */return (pass);}#js,css文件都有Cookie,不能每次都去后台服务器去取#if (req.http.Cookie) {#    /* Not cacheable by default */#    return (pass);#}#如果请求的是动态页面直接转发到后端服务器if (req.url ~ "^(.*)\.(aspx|asmx|ashx)($|.*)") {return (pass);}return (lookup);}sub vcl_pipe {# Note that only the first request to the backend will have# X-Forwarded-For set.  If you use X-Forwarded-For and want to# have it set for all requests, make sure to have:# set bereq.http.connection = "close";# here.  It is not set by default as it might break some broken web# applications, like IIS with NTLM authentication.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);}#支持压缩的要增加,防止发送给不支持压缩的浏览器压缩的内容if(req.http.Accept-Encoding){hash_data(req.http.Accept-Encoding);}return (hash);}#缓存服务器lookup查找命中:hitsub vcl_hit {#刷新缓存的请求操作,设置TTL为0,返回处理结果代码#if (req.request == "PURGE") {#     set obj.ttl = 0s;#     error 200 "Purged.";# }//#缓存服务器命中后(查找到了)return (deliver);}#缓存服务器lookup查找没有命中:misssub vcl_miss {#刷新缓存的请求操作,#if (req.request == "PURGE") {#    error 404 "Not in cache.";#}//#缓存服务器没有命中(去后台服务器取)return (fetch);}#从后台服务器取回数据后,视情况是否进行缓存sub vcl_fetch {#如果请求的是动态页面直接发转发#动态请求回来的,一定要放在前面处理if (req.url ~ "^(.*)\.(aspx|asmx|ashx)($|.*)") {set beresp.http.Cache-Control="no-cache, no-store";unset beresp.http.Expires;return (deliver);}# 仅当该请求可以缓存时,才设置beresp.grace,若该请求不能被缓存,则不设置beresp.graceif (beresp.ttl > 0s) {set beresp.grace = 1m;}  if (beresp.ttl <= 0s ||beresp.http.Set-Cookie ||beresp.http.Vary == "*") {/** Mark as "Hit-For-Pass" for the next 2 minutes*/set beresp.ttl = 120 s;#下次请求时不进行lookup,直接passreturn (hit_for_pass);}#设置从后台服务器获得的特定格式文件的缓存TTLif (req.url ~ "^(.*)\.(pdf|xls|ppt|doc|docx|xlsx|pptx|chm|rar|zip)($|\?)")     {#移除服务器发送的cookie unset beresp.http.Set-Cookie;#加上缓存时间set beresp.ttl = 30d;return (deliver);}else if(req.url ~ "^(.*)\.(bmp|jpeg|jpg|png|gif|svg|png|ico|txt|css|js|html|htm)($|\?)"){#移除服务器发送的cookie unset beresp.http.Set-Cookie;#加上缓存时间set beresp.ttl = 15d;return (deliver);}else if(req.url ~ "^(.*)\.(mp3|wma|mp4|rmvb|ogg|mov|avi|wmv|mpeg|mpg|dat|3pg|swf|flv|asf)($|\?)"){#移除服务器发送的cookie unset beresp.http.Set-Cookie;#加上缓存时间set beresp.ttl = 30d;return (deliver);}#从后台服务器返回的response信息中,没有缓存的,不缓存if (beresp.http.Pragma ~"no-cache" || beresp.http.Cache-Control ~"no-cache" || beresp.http.Cache-Control ~"private") {return (deliver);}return (deliver);}#缓存服务器发送到客户端前调用sub vcl_deliver {#下面是添加一个Header标识,以判断缓存是否命中。if (obj.hits > 0) {set resp.http.X-Cache = "HIT from TG.varnish-cache.jjcj.com";#set resp.http.X-Varnish = "HIT from TG.varnish-cache.jjcj.com";} else {set resp.http.X-Cache = "MISS from TG.varnish-cache.jjcj.com";#set resp.http.X-Varnish = "MISS from TG.varnish-cache.jjcj.com";}#去掉不是必须的headerunset resp.http.Vary;unset resp.http.X-Powered-By;unset resp.http.X-AspNet-Version;return (deliver);}sub vcl_error {set obj.http.Content-Type = "text/html; charset=utf-8";set obj.http.Retry-After = "5";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><p>Varnish cache server</p></body></html>"};return (deliver);}sub vcl_init {return (ok);}sub vcl_fini {return (ok);}

这篇关于Varnish+Nginx 配置----Varnish的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864358

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

JDK8(Java Development kit)的安装与配置全过程

《JDK8(JavaDevelopmentkit)的安装与配置全过程》文章简要介绍了Java的核心特点(如跨平台、JVM机制)及JDK/JRE的区别,重点讲解了如何通过配置环境变量(PATH和JA... 目录Java特点JDKJREJDK的下载,安装配置环境变量总结Java特点说起 Java,大家肯定都

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Nginx实现端口映射的示例代码

《Nginx实现端口映射的示例代码》本文主要介绍了Nginx实现端口映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 找到nginx的部署路径2. 备份原来的配置文件3. 编辑nginx.conf文件4. 在

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与