前提:

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. 学习练习 Oracle数据库小题

    Course(课程表) Score(成绩表) Teacher(教师表)

  2. SQL 如果存在就更新,如果不存在就添加,使用 Merge 函数(SQL2008版本及以上)

    USE [NationalUnion] GO /****** Object: StoredProcedure [dbo].[proc_DataSummary] Script Date: 07/03/2 ...

  3. pyhton标准库 json

    使用loads方法即可将json字符串转换成python对象,对应关系如下: #JSON Python object dict array list string unicode number (in ...

  4. C#导出

    #region  DataReader 的数据导出到Excle 中        //public string Exports(string str_sql)        //{        / ...

  5. (笔记)angular 路由

  6. Linux下Mysql主从复制(Master-Slave)与读写分离(Amoeba)实践

    一.为什么要做Mysql的主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...

  7. Check Box Select/Deselect All on Grid

    The below function is to be used on a grid with multiple check boxes. Place the code behind a FieldC ...

  8. MongoDb 2.4 beta新特性——全文索引

    期待已久的特性,但目前仍然在beta阶段,所以官方建议不要在生产环境使用.也因此需要手动打开这个特性. 在命令行指定 mongod --setParameter textSearchEnabled=t ...

  9. scala实现Netty通信

    在学习spark源码的时候看到spark在1.6之后底层的通信框架变成了akka和netty两种方式,默认的是用netty根据源码的思路用scala写了一个Demo级别的netty通信 package ...

  10. 删除linux系统服务

    #删除服务的命令,[ServiceName]需要替换为实际的服务名称 sudo update-rc.d [ServiceName] remove 有时候安装sysv-rc-conf进行服务控制,但是在 ...