在web項目中,你們都已經很是熟悉其架構流程了。都說Cache是萬金油,哪裏不舒服抹哪裏。這些流程中,幾乎每一個環節都會進行cache。從瀏覽器到webserver,到cgi程序,到DB數據庫,會進行瀏覽器cache,數據cache,SQL查詢的cache等等。對於fastcgi這裏的cache,不多被使用。去年年末,我對nginx的fastcgi_cache進行摸索使用。在個人測試過程當中,發現一些WIKI以及網絡上沒被提到的注意點,這裏分享一下。php
從瀏覽器到數據庫的流程圖html
這裏是個人NGinx配置信息nginx
配置這些參數時,注意每一個參數的做用域,像fastcgi_cache_path參數,只能在http配置項裏配置,而fastcgi_cache_min_uses這個參數,能夠在http、server、location三個配置項裏配置。這樣更靈活的會每一個域名、每一個匹配的location進行選擇性cache了。具體的參數做用域,參考FASTCGI模塊的官方WIKI。我爲了調試方便,添加了一個『X-Cache-CFC』的http響應頭,$upstream_cache_status 變量表示此請求響應來自cache的狀態,分別爲:git
FASTCGI_CACHE $upstream_cache_status 結果爲miss,一次也沒命中github
程序代碼是Discuz!論壇, 隨便開啓測試了幾下,發現/dev/shm/nginx_cache/下沒有任何目錄創建,也沒有文件建立。調試的http header響應頭裏的X-Cache-CFC 結果一直是MISS。從服務器進程上來看,Nginx cache manager process 跟Nginx cache loader process 進程也正常運行:web
fastcgi_ignore_headers
Syntax: fastcgi_ignore_headers field …
Default:
Context: http
server
location
Reference: fastcgi_ignore_headers數據庫This directive forbids processing of the named headers from the FastCGI-server reply. It is possible to specify headers like 「X-Accel-Redirect」, 「X-Accel-Expires」, 「Expires」 or 「Cache-Control」.ubuntu
也就是說這個參數的值,將會被忽略掉,一樣被忽略掉的響應頭好比」X-Accel-Redirect」, 「X-Accel-Expires」, 「Expires」 or 「Cache-Control」,而nginx配置中並無fastcgi_ignore_headers參數的設定,那麼問題會不會出如今FASTCGI響應結果裏包含了相似」X-Accel-Redirect」, 「X-Accel-Expires」, 「Expires」 or 「Cache-Control」這幾個響應頭呢?用strace抓包,看了下nginx與fpm進程通信的數據後端
疑問比較多,一個一個查起,先從Nginx的fastcgi_cache沒緩存這條http響應查起。我根據測試環境nginx版本1.1.9(ubuntu 12.04默認的),到nginx官方下了對應版本的源碼,搜索了fastcgi參數使用的地方,在http\ngx_http_upstream.c找到了。雖然不能很流程的讀懂nginx的代碼,但粗略的瞭解,根據瞭解的狀況加以猜想,再動手測試實驗,也得出告終論,肯定了nginx的fastcgi_cache的規則。瀏覽器
nginx fastcgi_cache 響應expired
nginx fastcgi_cache hit命中
FASTCGI_CACHE $upstream_cache_status 結果爲miss,一次也沒命中。
還有一個無聊的問題「Expires:時間爲什麼是Thu, 19 Nov 1981 08:52:00 GMT」?我翻閱了session.c這段代碼的添加時間,版本,做者信息,在php官方版本庫中找到了此次提交的信息:
Revision 17092 – (view) (download) (as text) (annotate) – [select for diffs]
Modified Sun Dec 12 14:16:55 1999 UTC (13 years, 2 months ago) by sas
File length: 28327 byte(s)
Diff to previous 16964
Add cache_limiter and cache_expire options. Rename extern_referer_check
to referer_check.
對比session.c兩個版本的變動,果真是這塊代碼。做者是sas,也就是Sascha Schumann, http://php.net/credits.php裏能夠看到他的大名。關於這個expires過時時間的問題,有人在stackoverflow也提問過,Why is 「Expires」 1981?,別人說那天是他生日。這是真的麼?若是那天是他生日的話,而他增長session.cache_limiter時是1999年,他才17歲,17歲呀。我17歲時在幹嗎?還不知道電腦長啥樣,正在玩『超級瑪麗』呢。
好奇的不是我一我的,還有個帖子是epoch date — Expires: Thu, 19 Nov 1981 08:52:00也問了。另外兩個地址雖然沒問,也有人提到那天是他生日了。http://boinc.berkeley.edu/dev/forum_thread.php?id=2514、https://github.com/codeguy/Slim/issues/157,這些帖子都提到說原帖是http://www.phpbuilder.com/lists/php3-list/199911/3159.php ,我沒法訪問,被跳轉到首頁了。用http://web.archive.org找到了歷史快照,發現上下文關係不大,也不能證實是他生日。 我更是好奇的發了兩封郵件到他的不一樣郵箱裏問他,不過,目前他還沒回復。或許他沒收到、沒看到,或許懶得回了。N年後,「Expires:時間爲什麼是Thu, 19 Nov 1981 08:52:00 GMT」這個日期,會不會又成了一段奇聞佳話了呢?