自从Labs主站换Nginx方式做分布以后,一直有一个困扰着我们的问题,就是页面无法访问和找不到的时候,显示的前后多了一些数字。因为之前一直没有时间去调查这个问题,所以就这么放着,最近终于找到机会研究了一把。
结论是php在输出Transfer-Encoding:chunked类型的内容时,nginx有时会在这个chunked的外面再套上一层 chunked的内容,而这个现象一般不会出现,只会在php里调用header()里有控制使用的http协议的内容时,也就是有 header(‘HTTP 1.1 xxx’)的时候,抓包就可以看到经过nginx之后的http header里有两个Transfer-Encoding:chunked,而内容里开头也有两个紧跟着的长度值。浏览器在处理完第一个长度之后,直接把 第二个长度显示出来了,也就造成用户直接看到了页面开头有几个数字。
经过网上调查,发现nginx目前的稳定版还不能解决Transfer-Encoding为chunked时的相关问题,而最新的0.7.30版还 在开发状态中,所以只好从php这边想办法。经过小付提醒,偶然发现在设置header(‘HTTP 1.0 xxx’)的情况下,php和nginx的反应都比较正常,浏览器上也没有看到显示出来长度,所以目前这个问题就这么解决了。
不过后来又抓了一下改变php代码之后的包,结果却又是令人吃惊,虽然程序里设置http协议为1.0,而实际抓到的包的内容却是这样的:
HTTP/1.1 403 Forbidden
Server: nginx/0.6.34
Date: Sun, 04 Jan 2009 03:49:50 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: store, no-cache, must-revalidate
Pragma: no-cache
Last-Modified: Sun, 04 Jan 2009 03:49:50 GMT
Cache-Control: post-check=0, pre-check=0
Content-Encoding: gzip
a
……….
1924
.\ys.G..[D.;.
抓包显示nginx对客户端使用的还是HTTP 1.1协议,很奇怪,看看直接从apache上得到的数据如何:
HTTP/1.0 403 Forbidden
Date: Sun, 04 Jan 2009 04:17:54 GMT
Server: Apache/2.2.3 (CentOS)
Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: store, no-cache, must-revalidate
Pragma: no-cache
Last-Modified: Sun, 04 Jan 2009 04:17:54 GMT
Cache-Control: post-check=0, pre-check=0
Connection: close
Content-Type: text/html; charset=utf-8
看来nginx喜欢包办,还是自已转比较顺。
http://www.byreach.com/solr/search/nginx?q=node/326