1. nginx模組
--add-module=../modules/ngx_devel_kit-0.2.18 --add-module=../modules/set-misc-nginx-module-0.22rc8 --add-module=../modules/srcache-nginx-module-0.22 --add-module=../modules/redis-nginx-module-0.3.6 --add-module=../modules/redis2-nginx-module-0.10
2. redis安裝配置
daemonize yespidfile /var/run/redis-6379.pidport 6379bind 127.0.0.1timeout 0tcp-keepalive 0loglevel noticelogfile stdoutdatabases 16stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbslave-serve-stale-data yesslave-read-only yesrepl-disable-tcp-nodelay noslave-priority 100maxmemory 8096mbmaxmemory-policy volatile-ttlappendonly noappendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mblua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes
由於只把redis當做緩衝使用,因此沒有啟用持久化。
3. nginx配置
http{ include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"$gzip_ratio" $request_time $bytes_sent $request_length'; log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" ' '"$status" $body_bytes_sent $request_time $bytes_sent $request_length ' '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]'; set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; include vhosts/test.jb51.net.conf;}
# vim vhosts/test.jb51.net.conf
upstream redis { server 127.0.0.1:6379; keepalive 512;} server { listen 80; server_name test.jb51.net; index index.html index.htm index.php; root /data/test.jb51.net/webroot; location ~ .*\.php { srcache_store_private on; srcache_methods GET; srcache_response_cache_control off; if ($uri ~ /jb51.net/pp.php$){ set $key $request_uri; set_escape_uri $escaped_key $key; srcache_fetch GET /redis $key; srcache_default_expire 172800; srcache_store PUT /redis2 key=$escaped_key&exptime=$srcache_expire; #add_header X-Cached-From $srcache_fetch_status; #set_md5 $md5key $key; #add_header X-md5-key $md5key; #add_header X-Cached-Store $srcache_store_status; #add_header X-Key $key; #add_header X-Query_String $query_string; #add_header X-expire $srcache_expire; access_log /data/httplogs/test.jb51.net-photo-access.log srcache_log; } include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; } location = /redis { internal; set_md5 $redis_key $args; redis_pass redis; } location = /redis2 { internal; set_unescape_uri $exptime $arg_exptime; set_unescape_uri $key $arg_key; set_md5 $key; redis2_query set $key $echo_request_body; redis2_query expire $key $exptime; redis2_pass redis; } error_log /data/httplogs/test.jb51.net-error.log; access_log /data/httplogs/test.jb51.net-aceess.log main; }
4. 測試
沒有做緩衝狀態:
有做緩衝狀態:
5. 回應標頭狀態
第一次請求:
再次請求:
6. 查看redis是否緩衝以及到期時間
PS:srcache-nginx-module模組指令說明:
srcache_fetch
文法:srcache_fetch <method> <uri> <args>?
預設值:no
配置段:http, server, location, location if
查詢快取。返回200說明快取命中,直接從緩衝響應用戶端請求。非200需要後端程式處理。
srcache_fetch_skip
文法:srcache_fetch_skip <flag>
預設值:srcache_fetch_skip 0
配置段:http, server, location, location if
<flag>支援nginx變數。當這個參數值不為空白和不等於0,則從緩衝取資料過程被無條件跳過。
srcache_store
文法:srcache_store <method> <uri> <args>?
預設值:no
配置段:http, server, location, location if
將當前請求的響應存入緩衝。可以使用srcache_store_skip和srcache_store_max_size指令禁用緩衝。不管是響應狀態行,回應標頭,響應體都會被緩衝。預設情況下,下列特殊回應標頭不會被緩衝:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- TE
- Trailers
- Transfer-Encoding
- Upgrade
- Set-Cookie
可以使用srcache_store_pass_header、srcache_store_hide_header指令來控制哪些頭要緩衝哪些不要。
注意:即使所有的響應資料被立即發送,當前的nginx請求生命週期未必完成,直到srcache_store子請求完成。這意味著伺服器端延遲關閉TCP串連,或下一個請求服務發送同一個TCP串連。
srcache_store_max_size
文法:srcache_store_max_size <size>
預設值:srcache_store_max_size 0
配置段:http, server, location, location if
當響應體超過該值,將不會緩衝。
當後端緩衝儲存有對快取資料做硬限制,這個指令非常有用。比如memcached伺服器,上限是1M。
預設值0,不限制。
srcache_store_skip
文法:srcache_store_skip <flag>
預設值:srcache_store_skip 0
配置段:http, server, location, location if
<flag>支援nginx變數。當這個參數值不為空白和不等於0,則從存入緩衝過程被無條件跳過。
srcache_store_statuses
文法:srcache_store_statuses <status1> <status2> ..
預設值:srcache_store_statuses 200 301 302
配置段:http, server, location, location if
該指令控制那些狀態代碼響應被緩衝。
srcache_header_buffer_size
文法:srcache_header_buffer_size <size>
預設值:srcache_header_buffer_size 4k/8k
配置段:http, server, location, location if
在序列化回應標頭時控制頭緩衝大小。預設大小為頁面大小,通常為4k或8k,取決於具體平台。
注意:該大小是以每個頭的,因此,需要足夠大來容納最大回應標頭。
srcache_store_hide_header
文法:srcache_store_hide_header <header>
預設值:no
配置段:http, server, location, location if
預設情況下,除了以下頭緩衝所有回應標頭:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- TE
- Trailers
- Transfer-Encoding
- Upgrade
- Set-Cookie
可以隱藏多個回應標頭,不區分大小寫。如
srcache_store_hide_header X-Foo;srcache_store_hide_header Last-Modified;
srcache_store_pass_header
文法:srcache_store_pass_header <header>
預設值:no
配置段:http, server, location, location if
預設情況下,除了以下頭緩衝所有回應標頭:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- TE
- Trailers
- Transfer-Encoding
- Upgrade
- Set-Cookie
可以緩衝多個回應標頭,不區分大小寫。如
srcache_store_pass_header Set-Cookie;srcache_store_pass_header Proxy-Autenticate;
srcache_methods
文法:srcache_methods <method>...
預設值:srcache_methods GET HEAD
配置段:http, server, location
srcache_ignore_content_encoding
文法:srcache_ignore_content_encoding on|off
預設值: srcache_ignore_content_encoding off
配置段:http, server, location, location if
內容是否編碼。
建議後端伺服器禁用gzip/deflate壓縮。在nginx.conf配置:
proxy_set_header Accept-Encoding "";
srcache_request_cache_control
文法:srcache_request_cache_control on|off
預設值:srcache_request_cache_control off
配置段:http, server, location
當該指令為on時,要求標頭Cache-Control和Pragma按照下面的方法處理:
1. srcache_fetch查詢快取操作時,當要求標頭Cache-Control: no-cache 、 Pragma: no-cache 將跳過。
2. srcache_store存入快取作業時,當要求標頭Cache-Control: no-store將跳過。
當該指令為off時,將禁用此功能,對於繁忙的網站依賴緩衝加速被認為是最安全的。
srcache_response_cache_control
文法:srcache_response_cache_control on|off
預設值:srcache_response_cache_control on
配置段:http, server, location
當該指令為on時,回應標頭Cache-Control和Expires按照下面的方法處理:
Cache-Control: private skips srcache_store,Cache-Control: no-store skips srcache_store,Cache-Control: no-cache skips srcache_store,Cache-Control: max-age=0 skips srcache_store,Expires: <date-no-more-recently-than-now> skips srcache_store.
該指令優先順序比srcache_store_no_store,srcache_store_no_cache,srcache_store_private高。
srcache_store_no_store
文法:srcache_store_no_store on|off
預設值:srcache_store_no_store off
配置段:http, server, location
開啟該指令,將強制回應標頭Cache-Control: no-store。預設為關閉。
srcache_store_no_cache
文法:srcache_store_no_cache on|off
預設值:srcache_store_no_cache off
配置段:http, server, location
開啟該指令,將強制回應標頭Cache-Control: no-cache。預設為關閉。
srcache_store_private
文法:srcache_store_private on|off
預設值:srcache_store_private off
配置段:http, server, location
開啟該指令,將強制回應標頭Cache-Control: private。預設為關閉。
srcache_default_expire
文法:srcache_default_expire <time>
預設值:srcache_default_expire 60s
配置段:http, server, location, location if
控制預設到期時間。當回應標頭既沒有Cache-Control: max-age=N也沒有指定Expires時,允許的$srcache_expire變數值。
該值必須小於597hours。
srcache_max_expire
文法:srcache_max_expire <time>
預設值:srcache_max_expire 0
配置段:http, server, location, location if
控制最大緩衝時間,此設定優先權高於其他計算方法。
該值必須小於597hours。
預設為0,不限制。