nginx开启gzip模块后ETAG丢失

0 条评论

为节省网页的传输时间,页面生成的时候,后端 PHP 给 nginx 返回了 ETAG 这个 HTTP 头。

这样一来,如果页面的内容没有变化的话,通过直接返回304可以大大地节省所需的传输时间,从而实现某种程度上的加速。

本来这个流程是可以正常工作的,但是突然某一天发现,页面不再有304这个状态了,无论怎么刷新,内容没有变化一样是200。

通过查看 HTTP 头发现,服务器根本没有返回 ETAG 这个头,而 PHP 却是确定有返回 ETAG 的,这就奇怪了。

一切的证据都指向 nginx 弄丢了 ETAG 这个 HTTP 头。

Google 一下,果然是这样,nginx 在开启了 gzip 之后,如果有 ETAG 则会调用 ngx_http_clear_etag 将其清除。

nginx开启gzip模块后ETAG丢失 图1

而同时 Google 得知,从 nginx 1.7.3 这个版本之后,nginx 不再强硬地清除 ETAG 了,而是换了一种 weak ETAG 的策略。

这个策略就是,如果 PHP 返回了一个 weak ETAG,则 nginx 不处理直接返回给客户端,如果 PHP 返回了强 ETAG,则 nginx 会将其转换为 weak ETAG。ngx_http_core_module.c 中约 1854行 的 ngx_http_weak_etag 函数完成了这个过程。

nginx开启gzip模块后ETAG丢失 图2

解决的办法很简单,只要 PHP 返回的 ETAG 是 weak ETAG,那么就一切都会正常起来了。

而所谓的 weak ETAG,也就是弱 ETAG,它是相对于正常 ETAG 而言的,表现形式就是 ETAG 前面加上 W/,例如:

ETAG: zhetenga.com 这是正常 ETAG,ETAG: W/zhetenga.com 就是 weak ETAG(弱 ETAG),ETAG保证文件内容完全相同,而 weak ETAG 则只保证文件内容是意义上相同的,例如 gzip 过了。

2015年05月26日阅读全文

shell中指定代码段的EOF加与不加引号有何不同

0 条评论

在 shell 中,可以通过 EOF 来指定一个多行的代码段,例如:

cat < ./zhetenga.sh

# do something

EOF

同时还有一样写法,就是给 EOF 加一个单引号:

cat <<'EOF' > ./zhetenga.sh

# do something

EOF

其实区别在于,如果加了引号,里面的内容不会再解析表达式,如果不加引号,表达式就会解析。

例如

cat <<'EOF' > ./zhetenga.sh

echo $0

EOF

zhetenga.sh 的内容将是 echo $0,而

cat < ./zhetenga.sh

echo $0

EOF

zhetenga.txt的内容将会是 echo -bash。

2015年05月15日阅读全文

scp stalled 断点续传

0 条评论

用 scp 从服务器拉文件下来,因为网络不稳定,状态突然变成了 stalled,然后就没有然后了。

这个时候就算网络恢复了也可能不会再重试续传,唯一的办法就是手动中断,但中断了再传就会从头开始并不能续传。

如果是小文件还好,如果是几个G的大文件,就只有器的份了。

而解决办法也是有的,就是扔掉 scp,改用 rsync 大法。

命令如下:rsync -avP --rsh=ssh user@host:/path/file .

当然最好的办法就是不用 scp ,直接用 rsync 传文件。

2015年03月30日阅读全文

mac osx删除文件提示Operation not ...

0 条评论

在 mac osx 下删除一个文件,却提示删除失败:Operation not permitted。

从提示上看就是没有权限删除这个文件,但用了 sudo 之后仍然是 Operation not permitted。

root 都没有权限,那就肯定有其它的原因导致文件无法删除了,Google一下发现是 FreeBSD 系统的文件 flag 在作怪。

通过 ls 命令可以看到文件的 flag,例如 ls -lhdO zhetenga.com.txt:

drwxr-xr-x 3 root staff schg,uchg 0B Mar 25 2014 zhetenga.com.txt

上面的 schg,uchg 就是所谓的 flag了,前面是系统锁文件属性,后面是用户锁文件属性。

现在需要将这些 flag 清除了,修改文件 flag 的命令是chflags,如下:

chflags noschg zhetenga.com.txt

chflags nouchg zhetenga.com.txt

2015年03月25日阅读全文

Unbound配置递归DNS泛解析记录

0 条评论

Unbound 是一个强大且易于配置的递归 DNS 软件。

在 Unbound 的配置文件里,我们也可以很轻松地配置某个域名的指向,也就是记录的本地劫持。

例如,只需要添加两行配置即可将 zhetenga.com 劫持到 127.0.0.1。

local-zone: "zhetenga.com" static

local-data: "zhetenga.com 86400 IN A 127.0.0.1"

但是,如果需要将所有的子域名都指向 127.0.0.1 应该怎么做呢?

但测试发现,简单地增加一条新的 local-data: "*.zhetenga.com 86400 IN A 127.0.0.1" 是行不通的。

解决办法是将上面的 static 改为 redirect,也就是:

local-zone: "zhetenga.com" redirect

local-data: "zhetenga.com 86400 IN A 127.0.0.1"

这样配置的结果是所有 zhetenga.com 的记录都将重定向到 127.0.0.1 这条记录上了,从而实现了泛解析。

2015年03月24日阅读全文

centos的yum update和yum upgra...

0 条评论

centos 的包管理工具 yum 提供了两个命令来升级包:yum update和yum upgrade。

从字面上看基本上没有办法看出来它们有什么区别,但是区别肯定是有的。

yum upgrade 会升级包到最新的版本,举个例子,foo 新版改名为 foo2,那么它会安装 foo2 并且把 foo 删除,而 yum update 只会升级 foo,不会将包更新到 foo2。

其实 yum upgrade = yum --obsoletes update。

因此,yum update 可以更保守地管理包,但 yum upgrade 才会将所有的包保持最新,虽然可能改名会引起一起麻烦。

2015年03月19日阅读全文

python在mysql中建表出现警告 Warning...

0 条评论

用python在mysql中创建表格,明明已经使用了:CREATE TABLE IF NOT EXISTS,它依然会出现警告:Warning: Table 'table' already exists。

这样的警告虽然并不会影响代码的执行,但是有的时候却很烦人,所以需要禁止它显示出来。

办法是有的,python提供了warning过滤的库,可以直接使用。

import warnings

warnings.filterwarnings('ignore')

2015年03月16日阅读全文

utf-8中的bom u+feff与json deco...

0 条评论

今天用python调用别人的一个API,结果在读取到返回并尝试json.loads时,无论怎么试都抛出No JSON object could be decoded。

于是果断将返回结果打印出来调试一下,结果发现打印出来的字符串没有任何问题,并且直接复制过去完全可以loads的。

折腾了很久各种试,最后尝试在python命令行中获取结果,这时候没加print,问题终于看出来了:返回的字符串最前面是一个\ufeff,这不就是很明显的utf-8 bom吗?问题终于找到了。

所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space。

然后了解到对方的接口是php写的,马上想到了是他们在windows下编辑php代码,编辑器给自动加上了bom头了。

解决办法就是找到这个文件并把bom头干掉,可是文件那么多,怎么办呢?

grep -r -I -l $'^\xEF\xBB\xBF' ./

文件找到,删除bom头,问题解决。

2015年03月13日阅读全文

mysql执行insert into select时出...

0 条评论

现在有一个mysql表格内容合并的需求,需要将表b合并到a中。

mysql提供了一个现成的解决办法,那就是insert into b select from a。

但是在执行的时候发现了一个问题,那就是a和b有些记录是重复的,导致出现了:Duplicate Entry for key 'primary'。

mysql很强大,只需要将以上sql改一下,就不会有问题了,insert ignore into b select from a。

对于mysql的Duplicate Entry for key,mysql提供了两种解决方法:

REPLACE INTO 如果存在Duplicate Entry for key,则替换掉原来的记录。

IGNORE INTO 如果存在Duplicate Entry for key,则扔掉新的记录。

2015年02月28日阅读全文

golang抓取gzip网页不自动解码

0 条评论

用golang的net/http库去抓取网页,发现得到的突然是乱码了,一看http头,发现返回的是gzip。

根据文档,http库是会自动解码gzip返回的,而这里不管怎么折腾返回就是乱码。

只好看了一下golang的源码实现(http://golang.org/src/pkg/net/http/transport.go),发现事实居然是这样的:

如果代码中指定了Accept-Encoding=gzip,那么它就不会自动解码了,而是直接返回,只有不指定的时候才会自动解码。

解决办法就是去掉指定Accept-Encoding=gzip的代码或者自己根据返回进行gzip。

2014年10月28日阅读全文
  1. «
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14
  16. 15
  17. ...
  18. 17
  19. »