Varnish 缓存服务器


Varnish缓存服务器

     # yum install varnish
     # rpm -ql varnish
         /etc/varnish/default.vcl
         /etc/varnish/varnish.params         \\ 进程配置文件 命令行选项
         /etc/varnish/secret                  \\ 进入varnishadm 的密码文件
     # cd /etc/varnish
     # vim varnish.params                       \\ 主配置文件
         VARNISH_LISTEN_PORT=80                  \\ 默认6081端口为监听端口 如果后端为http服务需要改成80
         VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1   \\ 不允许远程连接 如需要远程连接 更改此地址
         VARNISH_ADMIN_LISTEN_PORT=6082            \\ 6082为 varnishadm命令行的端口
         VARNISH_TTL=120                            \\ 连接后端服务器超时时间
         VARNISH_STORAGE="malloc,256M"               \\ 可修改缓存的模式 详情看注解        
     # vim default.vcl                                \\ Vcl语言 命令行配置文件
         backend default {
             .host = "192.168.10.10";
             .port = "80";
         }
     # systemctl restart varnish
     # ss -tnl                    \\ 80 和 6082端口被监听
     # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ -S 指明密码文件 -T 指明连接地址 直接使用varnishadm也可以进入
         help            \\ 获取命令列表
         ping             \\ 探测后端服务器是否在线
         status            \\ 服务器本身状态
         start              \\ 启动 子进程的
         stop                \\ 停止 子进程的
         vcl.list             \\ 列出所有可用的vcl文件
             active          0 boot    \\ boot为启动时加载的 编号为0 当前为active活动状态
         vcl.load test default.vcl      \\ 装载vcl文件  可使用vcl.list 查看


后端Web服务器     可建立两台配置一样
     # yum install httpd
     # for i in {1..10}; do echo "Page $i on Web1" > /var/www/html/test$i.html; done   \\ 建立十个测试页面
     # mkdir /var/www/html/admin                                        \\ 建立admin 测试目录
     # echo "admin for 192.168.10.10" > /var/www/html/admin/index.html   \\ 建立测试文件 为实例2准备
     # systemctl restart httpd


实例1 在客户端添加varnish状态 查看本次请求是否为缓存        \\ 以下实例只做了一遍 是不太熟悉
     # cd /etc/varnish/
     # cp default.vcl test.vcl
     # vim test.vcl           \\ 可替换vcl_recv{}和sub vcl_deliver{}的内容
         sub vcl_recv {        \\ 被调用的时机 当一个请求接收完成,并且被解析之后 或重启之后 触发
            if (req.method == "PRI") {
                /* We do not support SPDY or HTTP/2.0 */
                return (synth(405));
             }
            if (req.method != "GET" &&
                req.method != "HEAD" &&
                req.method != "PUT" &&
                req.method != "POST" &&
                req.method != "TRACE" &&
                req.method != "OPTIONS" &&
                req.method != "DELETE") {
                    /* Non-RFC2616 or CONNECT which is weird. */
                return (pipe);
            }
            if (req.method != "GET" && req.method != "HEAD") {
                /* We only deal with GET and HEAD by default */
                return (pass);
            }
            if (req.http.Authorization || req.http.Cookie) { 
                /* Not cacheable by default */
                return (pass);
            }
            return (hash);
         }
         sub vcl_deliver {       \\ 发送对象给客户端前调用
             if (obj.hits>0) {    \\ obj.hits是varnish自带的值 hits是变量 表示是不是从缓存取得的 不是为0 取了一次加 1
                 set resp.http.X-Cache = "HIT";  \\ 如果大于0说明从缓存取得的 返回命中
             }                                    \\ 设置 resp响应报文的http首部加一个自定义首部X-Cache的值为 HIT
             else {
                 set resp.http.X-Cache = "MISS";    \\ 设置 resp响应报文的http首部加一个自定义首部X-Cache的值为 MISS
             }
         }
     # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082   \\ 进入Vcl语言编辑
         vcl.load test1 test.vcl               \\ 创建vcl test1 使用test.vcl为模板进行加载
         vcl.list                               \\ 显示所有的vcl active为正在使用的 available为可用的
         vcl.use test1                           \\ 使用 test1 使成为active
         vcl.show test1                           \\ 查看test1的内容   Ctrl+c 退出
     # curl -I http://192.168.10.15/test1.html     \\ 只请求 首部信息


实例2 强制对某资源的请求 不检查缓存  为查看效果可以在实例1基础上去做
     # cd /etc/varnish/
     # cp default.vcl test.vcl
     # vim test.vcl                             \\ 修改配置文件
         sub vcl_recv {                          \\ 在vcl_recv中添加  实例2.1
             if (req.url ~ "^/test7.html$") {     \\ ~为请求的资源的url能够被指定的模式所匹配 此资源是以tesh7.html开头和结尾 
                     return(pass);                 \\ 不让去查缓存   略过缓存
             }                                      \\ 实例2.2 还有两个后台一个是以/admin开头的 一个是/login用户登录的不允许查缓存
             if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {  \\ (?i)在字符配置时候不区分大小写 || 或者 以/loginx开头的
                 return(pass);
             } 
         }
     # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082   \\ 进入Vcl语言编辑
         vcl.load test2 test.vcl
         vcl.list
         vcl.use test2
     # curl -I http://192.168.10.15/test7.html           \\ 在实例1的基础上 可以看到测试效果
     # curl -I http://192.168.10.15/admin/index.html
实例3 对特定类型的资源取消其私有的cookie标识            \\ 感觉没什么大用
     # cd /etc/varnish/
     # cp default.vcl test.vcl
     # vim test.vcl                                         \\ 修改配置文件
         sub vcl_backend_response {                          \\ 当成功从后端服务器获取到 response headers 时,调用
             if (beresp.http.cache-control !~ "s-maxage") {   \\ 服务器端响应的cache-control这个首部 此值对应的没有s-maxage这个首部
                 if (bereq.url ~ "(?i).jpg$") {               \\ 所请求的url 不区分大小写以.jpg结尾的
                     set beresp.ttl = 3600s;                    \\ 强制缓存1小时 在varnish的缓存时长
                     unset beresp.http.Set-Cookie;               \\ 把set-cookie强制取消
                 }
                 if (bereq.url ~ "(?i).css$") {
                     set beresp.ttl = 600s;
                     unset beresp.http.Set-Cookie;
                 }
             }
         }


实例4 不同资源发给不同的主机 实现动静分离
     # cd /etc/varnish/
     # cp default.vcl test.vcl
     # vim test.vcl                          \\ 修改配置文件
         backend webserver1 {                 \\ 定义了backend 必须要调用
             .host = "192.168.10.10";
             .port = "80";
             .probe = {                 \\ 是否对后端服务器做健康状态检测
                 .url = "/test1.html";   \\ 通过获取哪个一个url当做健康状态检测还有
             }                            \\ 还可以使用request expected_response timeout interval等
         }
         backend webserver2 {
             .host = "192.168.10.12";
             .port = "80";
             .probe = {
                 .url = "/test1.html";
             }
         }
         sub vcl_recv {
             if (req.url ~ "(?i).(jpg|png|gif)$") { \\ 如果是图片发给第一个服务器 ~做匹配 (?i)不区分大小写 .转移符 |或者 $末尾牟定
                 set req.backend_hint = webserver1;   \\ 在此调用
             } else {
                 set req.backend_hint = webserver2;
             }
         }
     # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082   \\ 进入Vcl语言编辑
         vcl.load test5 test.vcl
         vcl.list
         vcl.use test5


实例5 为2个后端服务器做负载均衡  不是对单个资源多次请求做轮询 而是对多个不同资源做轮询
     # vim test.vcl                       \\ 在上一实验基础上去做
     # cd /etc/varnish/
     # cp default.vcl test.vcl
     # vim test.vcl                          \\ 修改配置文件
         backend webserver1 {                 \\ 定义了backend 必须要调用
             .host = "192.168.10.10";
             .port = "80";
             .probe = {                 \\ 是否对后端服务器做健康状态检测
                 .url = "/test1.html";   \\ 通过获取哪个一个url当做健康状态检测还有
             }                            \\ 还可以使用request expected_response timeout interval等
         }
         backend webserver2 {
             .host = "192.168.10.12";
             .port = "80";
             .probe = {
                 .url = "/test1.html";
             }
         }
         import directors;                           \\ 引入directors模块 才能使用
         sub vcl_init {
             new mycluster = directors.round_robin();  \\ 定义一个集群new名字 = 算法 
                                                        \\ 负载均衡算法 round_robin轮询 random fallback hash原地址哈希
             mycluster.add_backend(webserver1);          \\ 集群之中第一个节点
             mycluster.add_backend(webserver2);           \\ 第二个节点
         }
         sub vcl_recv {                                   \\ 被调用的时机 当一个请求接收完成,并且被解析之后 或重启之后 触发
             set req.backend_hint = mycluster.backend();   \\ 调用自定义mycluster集群
         }
     # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082   \\ 进入Vcl语言编辑
         vcl.load test6 test.vcl
         vcl.list
         vcl.use test6


注:
     1 三种缓存的模式
       file       单个文件      不支持持久机制 重启服务就会都没有了 不能随便重启
       malloc     内存          不建议太大空间
       persistent 基于文件的持久存储
     2 官方网站https://www.varnish-cache.org
       比较好的文章 https://www.jianshu.com/p/1d4918cc58e8
     3 varnish    squid   缓存服务器 缓存首先要是 反向代理
       CDN公司 网速  蓝迅  帝联        CDN是缓存网络
       能力的三个核心 知识  技能  才干
     4 Vcl简介
       Varnish配置语言VCL是一种“域”专有类型的配置语言,用于描述Varnish Cache的请求处理和文档高速缓存策略.
       当加载新配置时,Manager进程会创建VCC进程,然后将VCL代码转换为C代码,C代码被gcc编译成共享对象,
       然后共享对象被加载到cacher进程中.
       VCL有多个状态引擎(state engine),状态之间存在相关性,但状态引擎彼此间互相隔离.
       每个状态引擎可使用return(x)指明关联至哪个下一级引擎,每个状态引擎对应于vcl文件中的一个配置段,即为subroutine.


VMware 虚拟化

VMware vSphere 虚拟化

VMware vSphere 安装流程步骤
     一 安装 ESXi
         1 在服务器上安装 VMware-VMvisor-Installer-6.7.0.update03-14320388.x86_64.iso    vSphere 可以理解为 ESXi
         2 F2 设置  --> Configure Management Network --> ipv4 设置网络
         3 http://192.168.100.237   用户名root 密码Teo@1234    登录管理界面 要有多块硬盘  存储 --> 新建数据存储

     二 安装win2012
         在 192.168.100.237新建虚拟机 win2012 在光驱选择-->位置选择本地客户端-->选择镜像  作为跳板安装VMware-vCenter

     三 安装 vCenter
         1 在win2012 关闭防火墙 光驱加载镜像 VMware-VCSA-all-6.7.0-14367737.iso --> vcsa-ui-installer --> win32 --> installer安装
         2 填入ESXi信息   要开启ssh选项 FQDN填写 192.168.100.239 同自己的ip一样即可
         3 第一阶段安装完成后退出 登录100.237 启动控制台 
           F2 --> Configure Management Network --> DNS Configuration --> Hostname改为192.168.100.239
           按提示安装即可 如果主机名对应不上安装到60%会报错
         4 win2012浏览器进入192.168.100.239:5480第二阶段 主要看主机名字是否是192.168.100.239
         5 第二阶段 域名 vsphere.local  用户名 administrator  密码 Teo@1234
         6 登录192.168.100.239 使用户名adminsitrator@vsphere.local登录

     四 Vcenter 简单配置
         1 添加证书-->菜单-->系统管理-->许可证-->添加许可证   许可证可使用 vSphere6.注册机.exe 生成
             vCenter Server 6 Standard    1C2H2-D709H-48EH8-WC8NP-33A60  
             VMware vSphere with Operations Management 6 Enterprise Plus for vSphere (CPU)  0Z4JA-AHK1Q-H8999-9H0QM-CK00A
         2 点击192.168.100.239-->配置-->许可-->分配许可证
         3 创建数据中心
         4 添加主机ESXi 192.168.100.237  关联新的许可证 或点击-->配置-->许可-->分配许可证


VMware ESXi界面配置详解
     Configure Locakdown Network           \\ 锁定模式 不允许vspthere host直接来管理 可用使用此项目取消锁定模式
     Configure Management network           \\ 配置管理网络 
         VLAN                                \\ 如果上一项目选择使用两个网卡 需要连接交换机的trunk接口 需要配置vlan
         DNS configuration                    \\ dns服务器
             Hostname   esx37.heinfo.edu.cn    \\ 主机名 可以配合 hosts文件 解析到此地址
         Custom DNS Suffixes 
             Suffixes  heinfo.edu.cn  \\ dns搜索里设置
     Restart Management Network        \\ 重启网络
     Test Management Network            \\ 测试 ping 网络是否正常
     Troubleshooting Options             \\ 配置是否启用shell命令行 使用ctrl+alt+F1进入 alt+F2退出 
     Reset System Configuration           \\ 恢复默认配置

重启的时候会出现错误530的情况
     可登录192.168.100.237-->vCenter控制台    \\ 也可以使用ssh登录192.168.100.239
     Ctrl+Alt+F1  进入 shell 界面
     Command> shell
     # service-control --start vsphere-client
     Alt+F2        退出

安装系统的时候不支持mbr格式 需要转成gpt格式
     Shift+F10
     list disk
     select disk 0
     clean
     convert gpt
     exit

ESXi硬盘安装
     1 集成自定义网卡驱动 待整理
     2 只需把镜像拷贝到U盘自定义目录即可 选择自定义镜像启动

注:
     1 镜像名称
         VMware-VMvisor-Installer-6.7.0.update03-14320388.x86_64.iso  \\ ESXI 6.7 U3
         VMware-VCSA-all-6.7.0-14367737.iso                            \\ Vcenter 6.7预装好的Linux版本
         VMware-VIM-all-6.7.0-13010631.iso                              \\ Vcenter server Windows版本
         ESXi-6.7.0-816992-RTL8168_8111Custom.iso                        \\ 已经集成RTL8168网卡驱动 ESXi

     2 驱动网址
         https://vibsdepot.v-front.de                              \\ 可以下载网卡
         https://esxi-customizer.v-front.de                         \\ 网卡定制工具下载及使用
         https://www.v-front.de/p/esxi-customizer.html               \\ 网卡定制工具下载及使用
         https://www.vmware.com/resources/compatibility/search.php    \\ 硬件兼容列表

     3 服务器 二层的虚拟 需要 一层的虚拟交换机 开启混杂模式   二层才能通
       时间服务器设置 管理 系统 时间日期 操作 编辑设置 使用网络时间协议 随主机启动和停止

     4 NTP 服务器   
         a. 0.vmware.pool.ntp.org
         b. 1.vmware.pool.ntp.org
         c. 2.vmware.pool.ntp.org
         d. 3.vmware.pool.ntp.org