Submitted by admin on 2012, December 3, 9:27 PM
watchdog 通常是一段物理电路,但这里讲的是linux 内核的实现,也就是softdog ,其原理详见IBM developerworks
watchdog非常强健,是内核的一个模块,能够在系统资源耗尽之际实现系统软重启,防止硬重启带来的巨大损失。
Watchdog 默认的动作是每隔1分钟往/dev/watchdog设备执行写操作,以证明系统运行正常,发现异常就主动发出重启信号。这种功能在高负荷的系统中很有用。虽然重启系统常常是包治百病的“明智之举“,但总让管理员们无法接受。除了重启系统,watchdog真的就没有用武之地了吗?
watchdog 强大的地方在于提供了两个接口test和repair 。
test选项提供了测试机制,一旦测试失败,watchdog就会采取行动挽救,也就是repair 。
repair 选项提供了挽救系统的办法,默认是重启系统,但可以定制,通常是一个shell 脚本。这就是本文的要点。
Watchdog配置文件示例
#ping = 172.31.14.1
#ping = 172.26.1.255
#interface = eth0
#file = /var/log/messages
#change = 1407
# Uncomment to enable test. Setting one of these values to ’0′ disables it.
# These values will hopefully never reboot your machine during normal use
# (if your machine is really hung, the loadavg will go much higher than 25)
#max-load-1 = 24
#max-load-5 = 18
#max-load-15 = 12
# Note that this is the number of pages!
# To get the real size, check how large the pagesize is on your machine.
#min-memory = 1
#repair-binary = /usr/sbin/repair
#test-binary =
#test-timeout =
#watchdog-device = /dev/watchdog
# Defaults compiled into the binary
#temperature-device =
#max-temperature = 120
# Defaults compiled into the binary
#admin = root
#interval = 10
#logtick = 1
# This greatly decreases the chance that watchdog won’t be scheduled before
# your machine is really loaded
realtime = yes
priority = 1
# Check if syslogd is still running by enabling the following line
#pidfile = /var/run/syslogd.pid
如果你安装并运行了watchdog,配置文件中的几个基本选项是要打开的,有益无害。
Min-memory = 1
watchdog-device = /dev/watchdog
从上面可以得到,watchdog的配置文件里可以监控网络、负载、内存、进程的pid号等,这不就是管理员们日常监控的内容吗?
现在我们进入智能监控主题。所谓智能监控,就是无人值守的监控行为,发现问题,自动修复,如果不能自动修复,还可以通知管理员手动修复。
以监控网络接口eth0 为例,我们开启选项 interface = eth0,接下来开启选项repair-binary= /etc/watchdog.d/repair.sh ,这里我把修复行为指向了一个脚本,repair.sh
,内容如下
#!/usr/bin/env bash
ifconfig eth0 >/dev/null
if [$? != “0”];then
ifup eth0
fi
模拟故障,手动停止eth0,过一会儿,就会看到奇迹发生了,o(∩∩)o…哈哈!!
由于把修复动作交给了脚本,那么一切变得皆有可能!只要其他条件允许,发邮件,发短信、放音乐、看CCAV,总之,完全由你自己决定。
同理,配置文件中的其他监控选项可以举一反三。
假如我有一些定制的服务,平时都是用脚本循环进行监控,用watchdog怎么监控呢?这就要靠test 选项了,watchdog默认的检测行为是每隔一分钟往/dev/watchdog 设备里执行一次写操作,这是个闲活,test选项可以让看门狗执行其他一些检测,以发现异常。
开启选项test = /etc/watchdog.d/test.sh,以监控进程abc为例
#!/usr/bin/env bash
process_number=`pgrep abc |wc -l`
if [ $process_number == “0” ];then
echo “process abc is not running”
exit 1
fi
按照脚本的意思,如果abc 进程数为0,那么就返回值1,检测到了异常!
相应的,watchdog会尝试修复异常。至于repair 脚本怎么写,你懂的!
你还在用while 循环吗? out 了!
附:
最简单的安装教程(CentOS)
yum install watchdog -y
modprobe softdog
chkconfig watchdog on
/etc/init.d/watchdog start
补充内容 (2012-6-6 21:20):
如果repair 失败的话,watchdog依然会重启系统,这个需要注意!
补充内容 (2012-6-15 16:08):
可以通过在repair 脚本中加入 exit 0 来防止watchdog 重启系统,即无论修复是否成功,都返回成功,骗过watchdog 的重启机制
linux | 评论:0
| Trackbacks:0
| 阅读:1007
Submitted by admin on 2012, December 3, 9:26 PM
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。VPSee 前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题:D,以下操作在 SUN FIre X2100 M2 服务器+ 64位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上执行。
什么是中断
中文教材上对 “中断” 的定义太生硬了,简单的说就是,每个硬件设备(如:硬盘、网卡等)都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就可称为硬件中断,就像你正在工作的时候受到 QQ 干扰一样,一次 QQ 摇头就可以被称为中断。
中断是一种比较好的 CPU 和硬件沟通的方式,还有一种方式叫做轮询(polling),就是让 CPU 定时对硬件状态进行查询然后做相应处理,就好像你每隔5分钟去检查一下 QQ 看看有没有人找你一样,这种方式是不是很浪费你(CPU)的时间?所以中断是硬件主动的方式,比轮询(CPU 主动)更有效一些。
好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设备同时中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ 号码都不相同吗?同样的,系统上的每个硬件设备都会被分配一个 IRQ 号,通过这个唯一的 IRQ 号就能区别张三和李四了。
在计算机里,中断是一种电信号,由硬件产生,并直接送到中断控制器(如 8259A)上,然后再由中断控制器向 CPU 发送信号,CPU 检测到该信号后,就中断当前的工作转而去处理中断。然后,处理器会通知操作系统已经产生中断,这样操作系统就会对这个中断进行适当的处理。现在来看一下中断控制器,常见的中断控制器有两种:可编程中断控制器 8259A 和高级可编程中断控制器(APIC),中断控制器应该在大学的硬件接口和计算机体系结构的相关课程中都学过。传统的 8259A 只适合单 CPU 的情况,现在都是多 CPU 多核的 SMP 体系,所以为了充分利用 SMP 体系结构、把中断传递给系统上的每个 CPU 以便更好实现并行和提高性能,Intel 引入了高级可编程中断控制器(APIC)。
光有高级可编程中断控制器的硬件支持还不够,Linux 内核还必须能利用到这些硬件特质,所以只有 kernel 2.4 以后的版本才支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术被称为 SMP IRQ Affinity. 更多介绍请参看 Linux 内核源代码自带的文档:linux-2.6.31.8/Documentation/IRQ-affinity.txt
如何使用
先看看系统上的中断是怎么分配在 CPU 上的,很显然 CPU0 上处理的中断多一些:
# cat /proc/interrupts
CPU0 CPU1
0: 918926335 0 IO-APIC-edge timer
1: 2 0 IO-APIC-edge i8042
8: 0 0 IO-APIC-edge rtc
9: 0 0 IO-APIC-level acpi
12: 4 0 IO-APIC-edge i8042
14: 8248017 0 IO-APIC-edge ide0
50: 194 0 IO-APIC-level ohci_hcd:usb2
58: 31673 0 IO-APIC-level sata_nv
90: 1070374 0 PCI-MSI eth0
233: 10 0 IO-APIC-level ehci_hcd:usb1
NMI: 5077 2032
LOC: 918809969 918809894
ERR: 0
MIS: 0
为了不让 CPU0 很累怎么把部分中断转移到 CPU1 上呢?或者说如何把 eth0 网卡的中断转到 CPU1 上呢?先查看一下 IRQ 90 中断的 smp affinity,看看当前中断是怎么分配在不同 CPU 上的(ffffffff 意味着分配在所有可用 CPU 上):
# cat /proc/irq/90/smp_affinity
7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff
在进一步动手之前我们需要先停掉 IRQ 自动调节的服务进程,这样才能手动绑定 IRQ 到不同 CPU,否则自己手动绑定做的更改将会被自动调节进程给覆盖掉。如果想修改 IRQ 90 的中断处理,绑定到第2个 CPU(CPU1):
# /etc/init.d/irqbalance stop
# echo "2" > /proc/irq/90/smp_affinity
(上面的 echo “2″ 是怎么来的?为什么是 ”2“?请参考这篇:计算 SMP IRQ Affinity)过段时间在看 /proc/interrupts,是不是 90:eth0 在 CPU1 上的中断增加了(145)、在 CPU0 上的中断没变?不断打印 /proc/interrupts 就会发现 eth0 在 CPU0 上的中断数始终保持不变,而在 CPU1 上的中断数是持续增加的,这正是我们想要的结果:
# cat /proc/interrupts
CPU0 CPU1
0: 922506515 0 IO-APIC-edge timer
1: 2 0 IO-APIC-edge i8042
8: 0 0 IO-APIC-edge rtc
9: 0 0 IO-APIC-level acpi
12: 4 0 IO-APIC-edge i8042
14: 8280147 0 IO-APIC-edge ide0
50: 194 0 IO-APIC-level ohci_hcd:usb2
58: 31907 0 IO-APIC-level sata_nv
90: 1073399 145 PCI-MSI eth0
233: 10 0 IO-APIC-level ehci_hcd:usb1
NMI: 5093 2043
LOC: 922389696 922389621
ERR: 0
MIS: 0
有什么用
在网络非常 heavy 的情况下,对于文件服务器、高流量 Web 服务器这样的应用来说,把不同的网卡 IRQ 均衡绑定到不同的 CPU 上将会减轻某个 CPU 的负担,提高多个 CPU 整体处理中断的能力;对于数据库服务器这样的应用来说,把磁盘控制器绑到一个 CPU、把网卡绑定到另一个 CPU 将会提高数据库的响应时间、优化性能。合理的根据自己的生产环境和应用的特点来平衡 IRQ 中断有助于提高系统的整体吞吐能力和性能
linux | 评论:0
| Trackbacks:0
| 阅读:1110
Submitted by admin on 2012, December 1, 6:57 PM
vsftp 本身不支持虚拟目录,软链接失效。但可以通过linux mount 命令来实现。
例如:
ftp 用户 panmanni根目录为
/var/www/pages/flashgame/
panmanni 需要访问/var/www/flashupload目录
ln -s /var/www/flashupload /var/www/pages/flashgame/flashupload这样做无效
正确使用:
mkdir -p /var/www/pages/flashgame/flashupload
mount --bind /var/www/flashupload /var/www/pages/flashgame/flashupload
在使用mount --bind olderdir newerdir命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。如下所示:
挂载前:
drwxr-xr-x 2 root root 4096 Mar 12 12:01 pub
drwx------ 3 staffs staffs 4096 Mar 15 14:08 staffs
挂载:
# mount --bind staffs/ pub/
挂载后:
drwx------ 3 staffs staffs 4096 Mar 15 14:08 pub
drwx------ 3 staffs staffs 4096 Mar 15 14:08 staffs
从上可以看出,挂载后的目录继承了被挂载目录的所有属性,除了名称
linux | 评论:0
| Trackbacks:0
| 阅读:1409
Submitted by admin on 2012, November 29, 11:10 PM
MySQL may use temporary tables during query execution. Ideally you would want to avoid this, since its an expensive and slow operation. It can be avoided by optimizing queries. Sometimes it can’t be completely avoided – in that case you want to make sure the temporary table is created as a “memory” storage engine table, since its very fast, as it is never written to disk and remains, as the name states, in memory. But, as the manual explains, there are some conditions, such as TEXT/BLOB columns, or a combination of GROUP BY/ORDER BY clauses that makes MySQL write the temporary table to disk as a MyISAM table. One can spot these queries by the EXPLAIN output:
[...] Using where; Using temporary; Using filesort
In that case performance depends on disk I/O speed. If there are multiple similar queries running simultaneously, they try to read/write a lot of information to the disk, and will become extremely slow.
Solution? TMPFS!
tmpfs is a filesystem, that resides in RAM/Swap, so if your server has enough available RAM, files written there will bypass disk I/O completely, and will perform significantly faster.
Now, “High Performance MySQL, Second Edition” claims that this solution is still not as good as a MEMORY table, since it requires MySQL to use some expensive OS calls to write & read the temporary table, but it is still faster than the disk based temporary table.
To set it up, just mount a tmpfs system on an empty directory (you should also add this to fstab):
mount tmpfs /tmpfs -t tmpfs
and edit my.cnf to make MySQL use that directory as a temporary directory:
tmpdir = /tmpfs
Be careful though, there is a bug in some versions that prevents this from working properly.
For more information, see this blog.
mysql/db | 评论:0
| Trackbacks:0
| 阅读:1027
Submitted by admin on 2012, November 19, 4:46 PM
在CentOS 6.2的64位系统里,xcache 3用不了,不生效
xcache 2.0.1可以用,但不与zend op3.3不兼容,无法同是使用
linux | 评论:0
| Trackbacks:0
| 阅读:906
Submitted by admin on 2012, November 15, 11:17 AM
养肝大法就是闭眼睛
人的神明,都可以从眼神耗出去。古代有一个养生大法:眼睛一闭,就养肝。因为“肝主藏血”,肝主目。比如眼睛干涩、眼睛迎风流泪,都是肝病,迎风流泪属于肝的收敛功能不足;眼睛干涩是肝的精血不足,所以养肝大法就是闭眼睛。
闭目降气,食指轻压眼睑,微微揉搓到眼珠发热发胀,便觉得燥怒平息
转转眼球
双目同时以远处某一大型固定物体为目标,由左经上方再至右到下方回到左方,眼动头不动,旋转运目10圈。然后再由右经上方至左到下方回到右侧,旋转运目10圈。有清除眼疲劳、提高视力的功效。
踮脚尖
每日踮脚尖,补肾又养生。工作间隙做些转颈、前俯、后仰的头部运动,或用空拳轻轻叩击头部,不仅能解除颈部肌肉疲劳,还能改善大脑血氧供应,健脑提神,治疗由神经衰弱引起的失眠等。
摇头转颈
工作间隙做些转颈、前俯、后仰的头部运动,或用空拳轻轻叩击头部,不仅能解除颈部肌肉疲劳,还能改善大脑血氧供应,健脑提神,治疗由神经衰弱引起的失眠等。
15~25岁需多吃白菜、韭菜、豆芽、瘦肉等豆类食品,使皮肤红润有弹性,尤其是豆类食物,既能满足人体需要的优质蛋白质,又能供给多种维生素和无机盐。
女人怕衰老,女人衰老的原因一是缺气,二是寒气、三是肾亏。每天早上三片生姜、一杯蜂蜜水、三颗红枣,两天一瓶酸奶,平时多吃亚足额、血猪血。
梳头
各式梳子或手指皆可,每日梳数十至百下,具有按摩头皮,醒脑开窍的功效,对视力、听力也很有帮助。
叩齿
齿对齿轻叩,或牙齿空咬,可防止牙龈退化、牙周病等口腔问题;此法还可促进脸颊肌肉活动,使脸颊丰润,防止双颊下垂。
拍肩
左手自然上甩拍右肩,右手拍左肩交替,也可用手掌自然交替拍腿。
握拳
双手紧握后放松,反复数回,直立或坐姿时均可进行。
生活闲谈 | 评论:0
| Trackbacks:0
| 阅读:874
Submitted by admin on 2012, October 25, 12:28 PM
在写一些常用的脚本中,经常会用到sed,但是这东西,不经常用,就会忘掉,现在记在这里,以后想找sed了就来这里看看。
*替换
sed ‘s/word1/word2/2′ file 将第2行中的word1替换为word2
sed ‘s/word1/word2/g’ file word1全局替换为word2
sed -n ‘s/word1/word2/p’ file 全局替换并打印
sed ‘s/word1/word2/w test’ file 全局替换并写入文件test
sed ‘s/\/bin\/bash/\/bin\/sh/’ /etc/passwd 路径替换 特殊字符需要转义
sed ‘s!/bin/bash!/bin/sh!’ /etc/passwd 同上 感叹号被用作定界符
sed ‘ns/word1/word2/’ file 指定替换file文件中的第n行
sed ‘m,ns/word1/word2′ file 指定替换file文件中的第m到n行
sed ‘n,$s/word1/word2′ file 指定替换file文件中的第n到最后一行
sed ‘/word1/s/bash/sh/’ file 指定替换出现word1行的bash替换为sh
sed ‘n{
>s/word1/word2
>s/word3/word4
}’ file 指定替换第n行中的word1为word2 word3为word4
sed ‘s/word1/word2/;s/word3/word4/’ file 同上
sed ‘n,${
>s/word1/word2
>s/word3/word4
}’ file 指定替换从第n开始到最后一行结束的word1为word2 word3为word4
sed -e ‘n,$s/word1/word2/;s/word3/word4/’ file 同上
*删除
sed ‘d’ file 清空所有数据流(不是清空file文件内容)
sed ‘nd’ file 删除第n行
sed ‘m,nd’ file 删除第m到n行
sed ‘n,$d’ file 删除从n到最后一行
sed ‘/word1/d’ file 删除匹配word1的行
*插入
sed ‘nirhel007′ file 将rhel007插入到第n行之前
sed ‘nathis is a test’ file 将this is a test 插入到第n行之后
sed ‘$irhel007′ file 插入到最后一行之前
sed ‘$arhel007′ file 插入到最后一行之后
*更改
sed ‘ncthis is a test’ file 将第n行更改为this is a test
sed ‘/this is a test/cthat is a test’ file 匹配更改
*变换
sed ‘y/123/456/’ test
匹配修改 1-4,2-5,3-6 单个字符进行全局匹配
*打印
sed -n ‘/word/p’ file 全局匹配打印
sed -n ‘m,np’ file 打印m到n行
sed ‘=’ file 打印行号
sed -n ‘l’ file 打印不可打印的ANSIC字符
sed -n ‘np’ file 打印第n行
sed -n ‘$p’ file 打印最后一行
*文件操作
sed ‘m,nw test’ file 将file的m到n行写入到test中
sed -n ‘/word/w test’ file 匹配将包含word字符的写入test文件
sed ‘nr test’ file 将test文件中的内容写入file文件的第n行之后
sed ‘/word/r test’ file 将test文件中的内容匹配到word内容之后
sed ‘$r test’ file 将test文件中的内容追加到file的最后
sed -n ‘{
1!G
h
$p
}’ file 行逆序
sed -n ‘s/cat/”cat”/’ file 给文本中的cat增加双引号
sed -n ‘s/.at/”&”/g’ file 给文本中的.at的原单词上增加双引号
sed ‘G’ file 增加一行空行
sed ‘$!G’ file 在文本的最后一行不再增加空行
sed ‘/^$/d;$!G’ file 文本中的空行不增加行距
sed ‘=’ file 行计数
sed ‘=’ file | sed ‘N;s/\n/ /’ 计数和行在同一行上
sed -n ‘s/<[^>]*>//g;/^$/d’ file 去除html中的标签和空行
*sed正则表达式
1. .*{}[]^$\+?| 这些特殊的字符需要用\转义
2. 定位符
sed -n ‘/^test/p’ file 匹配test开头的行
sed -n ‘/test$/p’ file 匹配test结尾的行
sed -n ‘/^this is a test$/p’ 匹配以test开头和结尾的行
sed -n ‘/^$/d’ file 去掉空行
3 点字符
sed -n ‘/.li/p’ file 匹配除了换行之外的所有字符
4 字符类
[]代表或者的意思
sed -n ‘/[ch]at/p’ file 匹配hat或者cat的单词
sed -n ‘/[Yy][Ee][Ss]/p’ 匹配任何形式的yes
sed -n ‘/[c-h]at/p’ file
sed -n ‘/[a-ch-m]/p’ file 匹配a-c,h-m开头的单词
sed -n ‘/^[0-9][0-9][0-9][0-9][0-9][0-9]$/p’ 匹配邮编,电话
5 否定字符类
sed -n ‘/[^ch]at/p’ 不匹配以cat和hat开头的单词
sed -n ‘/cat/!p’ 不匹配匹配cat的行
6 * 前面的字符不出现或者出现多次
-------------------------------
搜索并替换
sed -i '/memory_limit/s/128/64/' /www/wdlinux/etc/php.ini
shell | 评论:0
| Trackbacks:0
| 阅读:1395
Submitted by admin on 2012, October 22, 3:38 PM
Expires(过期时间)
Http 头信息设置过期时间,一般是设置一个时间点,例如:
Expires:Tue Jul 28 11:00:00 CST 2011 (2011/7/28)
一般使用在静态文件,例如img、js、css等。
要注意的:如果设置的过期时间是一个固定的时间,在返回内容的时候又没有连带更新下次过期的时间,那么之后都会请求服务器,反而增加了负载和响应时间。
Cache-Control(缓存控制)
缓存控制,使用起来更为灵活、功能更强大。
l max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
l s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
l public — 标记认证内容也可以被缓存,一般来说:经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
l private — 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
l no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);
l no-store — 强制缓存在任何情况下都不要保留任何副本
l must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
l proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用
l min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
l max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
可以在ajax返回结果中加缓存,以及一些请求加缓存,这个需要程序实现。
Last-Modified
在第一次请求时服务器会返回一个200状态以及响应正文,同时在响应头中会有Last-Modified 信息,例如:Last-Modified: Mon, 25 Jul 2011 02:01:46 GMT
在第二次请求该URL时浏览器会在请求头信息中发送If-Modified-Since 信息,例如:
If-Modified-Since: Wed, 20 Jul 201106:31:59 GMT,如果服务器资源没有发生变化则返回304状态,如果有变化则返回响应正文。
Etag
Etag是配合If-None-Match来使用的,在服务器响应头信息中加入Etag,如:
Etag W/"1795-1310539468000",在请求头信息中加入If-None-Match发送etag信息到服务器,如:If-None-Match W/"1795-1310539468000",可以通过服务器配置来实现,也可以通过程序来实现。
对静态文件生成版本引用
封装成标签来统一生成html代码,基本思路是根据文件的名称(包括路径)当做key,文件的最后更新时间当做value存储在内存中,每次的html代码都从内存中获取版本信息来生成引用的html代码。
可以优化
1. 现有的static服务器缓存设置似乎有点问题,静态文件应该直接在客户端获取缓存,而不应该每次去服务器去校验返回304状态码。
HTTP/1.0304 Not Modified
Date:Sun, 24 Jul 2011 15:49:13 GMT
Content-Type:application/x-javascript; charset=utf-8
Expires: Sun, 24 Jul 2011 16:49:06 GMT
Last-Modified: Tue, 14 Dec 2010 03:22:35 GMT
Cache-Control:max-age=3600
X-Via:1.0 shnh222:8106 (Cdn Cache Server V2.0)
Age:142178
Warning:113 proxy1.staff.woyo.com (squid/3.1.9) This cache hit is still fresh and morethan 1 day old, 110 squid/3.1.9 "Response is stale", 111 squid/3.1.9"Revalidation failed"
X-Cache:HIT from proxy1.staff.woyo.com
Via: 1.0proxy1.staff.woyo.com (squid/3.1.9)
Connection: keep-alive
可以看出设置应该在2011年7月24 16:49:06 过期,也就是说现在访问该缓存已经过期!
为什么是304状态呢?
因为在响应头信息中Last-Modified: Tue, 14 Dec 2010 03:22:35 GMT,而在请求头信息中有:If-Modified-SinceTue,14 Dec 2010 03:22:35 GMT,也就说客户端实际去访问了服务器,服务器检测到该文件并没有修改过所以返回304状态码。
我们想要做到的是,一些js、css、img等静态文件信息直接在客户端缓存。
2. 在ajax以及页面的请求响应中加入Cache-Control 来控制缓存。
3. Etag可以使用在静态文件也可以用在页面请求,静态文件可以直接nginx中配置,页面请求的需要程序来完成。
Nginx配置 http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx
总结
1. Last-Modified, Etag条件缓存控制参数,需要和服务器请求查看资源是否改变,可以减少资源的下载量,但是不会减少请求数。
2. Expires,Cache-Control过期时间设置,同时设置时Cache-Control会覆盖Expires(只限于普通请求,如:链接点击跳转、用JS脚本打开新页面、使用iframe时),如果F5或者Ctrl+F5则忽略过期时间的设定。
3. 如果同时设置了过期时间和控制参数,在未过期时间内读取缓存不发起请求,过期后则发起请求,过期时间级别高于控制参数。
4. no-cache在IE中有效,no-store在firefox中有效,一般同时设置2个,如:
Cache-Control: no-cache, no-store。
附
表1 Cache-Control可设置值
值
说明
max-age=xxx
缓存的内容将在 xxx 秒后失效 , 这个选项只在 HTTP 1.1 可用 , 并如果和 Expires、Last-Modified 一起使用时 , 优先级较高
must-revalidation/
proxy-revalidation
如果缓存的内容失效,请求必须发送到服务器 / 代理以进行重新验证
no-store
所有内容都不会被缓存到缓存或 Internet 临时文件中
no-cache
所有内容都不会被缓存
private
内容只缓存到私有缓存中
public
所有内容都将被缓存
总结:
打开新窗口
如果指定 cache-control 的值为 private 、 no-cache 、 must-revalidate, 那么打开新窗口访问时都会重新访问服务器。而如果指定了 max-age 值 , 那么在此值内的时间里就不会重新访问服务器 , 例如: Cache-control: max-age=5 表示当访问此网页后的 5 秒内再次访问不会去服务器
在地址栏回车
如果值为 private 或 must-revalidate, 则只有第一次访问时会访问服务器 , 以后就不再访问。如果值为 no-cache, 那么每次都会访问。如果值为 max-age, 则在过期之前不会重复访问。
按后退按扭
如果值为 private 、 must-revalidate 、 max-age, 则不会重访问 , 而如果为 no-cache, 则每次都重复访问
按刷新按扭
无论为何值 , 都会重复访问
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:1118