前提:

1.我写了一个简单的http服务器,以下简称 httpserver

2.前端使用squid做反向代理,以下简称 squid。squid同时反向代理了2台http服务器,其中一台是httpserver,另外一台是nginx

问题:

查看access.log发现,通过squid请求httpserver上的文件时,squid的都会TCP_MISS。

但是通过同一个squid,nginx的文件可以TCP_HT,说明squid本身应该没有问题,也许是httpserver有问题。

没有头绪,抓包分析一下吧

第一次抓包(squid与httpserver之间的包):

squid向httpserver发起GET,httpserver返回了信息,httpcode 200.没有发现什么问题。

第二次抓包(squid与nginx之间的包):

squid向nginx发起了GET,nginx不是返回200,而是返回304 not modified.

查看http header,发现squid发GET请求时,http header中有一项:If-Modified-Since: Sat, 15 Feb 2014 08:36:33

nginx回复squid时,http header中有一项:Last-Modified: Sat, 15 Feb 2014 08:36:33 GMT

似乎发现了什么。。

对话大致是这样的:

squid问nginx:从15 Feb 2014 08:36:33这个时间开始,这个文件有没有被修改过?

nginx答squid:上次修改时间是15 Feb 2014 08:36:33

也就是说这个文件没有修改,这就完成了一次缓存确认的过程。

第三次抓包(抓squid与nginx之间,从未被缓存过的文件):

squid向nginx发起了GET,nginx返回200,http header中有一项为 Cache-Control: max-age=25920

这个http header说明这个文件是可缓存的,缓存时间为25920。

那么httpserver要这么改:

1.在发送文件的http header中加上Cache-Control

2.处理请求中的http header的If-Modified-Since项。

Last-Modified格式代码如下:

随手写的,格式注意改改

1
2
3
4
5
//Last-Modified: Sat, 15 Feb 2014 08:36:33 GMT\r\n
time_t tNowTime = time(NULL);
tm* tTm= localtime(&tNowTime);
char achbuff[100] = {0};
strftime(achbuff, 100, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n\r\n", tTm);

squid判断文件是否修改机制分析的更多相关文章

  1. JFS 文件系统概述及布局分析

    JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...

  2. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  3. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  4. 关于开发中 hosts 文件的修改

    这篇文章只是给自己做个笔记吧. 最近的工作经常要改 hosts 文件(C:\Windows\System32\drivers\etc\hosts),并且改完后不立即生效.小胡子哥 提到: 因为服务器设 ...

  5. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  6. Java代理和动态代理机制分析和应用

    本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息 ...

  7. linux RCU锁机制分析

    openVswitch(OVS)源代码之linux RCU锁机制分析 分类: linux内核  |  标签: 云计算,openVswitch,linux内核,RCU锁机制  |  作者: yuzhih ...

  8. Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

  9. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

随机推荐

  1. 图的最短路算法 Floyd

    多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...

  2. 学习记录 Java常见的几种字符集以及对 AscII的了解

     1.ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...

  3. pb中创建连接webservice对象实例方法

    try soapConnection conn // Define SoapConnectionHospitalServiceSoap in_hhzswebser // Declare proxyin ...

  4. CreateThread和_BeginThread的区别

    1.程序: 程序构成: (1)源代码 (2)可执行的二进制代码 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念.由操作系统加载其可执行的二进制代码,分配相应的数据结构:进程控制 ...

  5. 【MVC】关于Action返回结果类型的事儿(下)

    代码

  6. Servlet小试

    Java响应Http请求: 1.创建项目 因为对Java环境不是很熟悉,第一步卡住了好长时间, javax怎么引用, 在Java EE 5 Libraries中的javaee.jar中,项目中怎么引用 ...

  7. .NET中 使用数组的注意事项

    1.初始值问题 对于int.double.float等一些值类型数组,没有赋值的情况下, 默认值是0: 而对于String 等引用类型,初始值为null. 2.IndexOutOfRangeExcep ...

  8. MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份]

    MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份] 1.Xtrabackup的安装 percona-xtrabackup-2.2.3-4982.el6.x86_ ...

  9. C#解析JSON字符串总结

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  10. WindowsApi 解压缩文件

    .解压方法 转载自http://www.2cto.com/kf/201204/128704.html "C#解压.zip文件,网上一搜一大堆方法,有使用System.IO.Compressi ...