摘要:粗線條一點根據的位置,一般會有瀏覽器,服務器,和應用服務器等。比如安全,解壓縮功能對所有請求都是通用的,這是可以搞定的,它一般不會終結業務類的處理,而是將他們交給后面的應用服務器。一致性,因為是冗余的,各個節點間的失效時間是不同步的。
前言
大家都知道cache對于網站性能的重要性,提高用戶響應速度,減輕后端壓力,節省資源等等。一談到cache其實是個很大話題,從前端瀏覽器到最終響應請求的服務器可能要經過很多次跳轉,每次跳轉經過的服務器都有機會提供cache。單從成本上而言,越靠近用戶的cache越經濟,實際情況中都需要根據當前線上的業務部署情況,開發成本收益比,可維護性等因素考慮采取在哪個地方cache,如何cache。粗線條一點根據cache的位置,一般會有瀏覽器,web服務器,CDN和應用服務器cache等。這里我結合最近自己完成的nginx服務器上的cache工作,談一下nginx提供了哪些實用的cache服務。
Nginx承擔反向代理服務器的工作,一般它處理的業務都是比較通用的處理,或者說一般不會處理很個性化的請求。比如安全,解壓縮功能對所有請求都是通用的,這是nginx可以搞定的,它一般不會終結業務類的處理,而是將他們交給后面的應用服務器。正是因為Nginx的這種特性,如果在nginx節點上做cache,一般cache的是整個http請求的response。自然cache的key也一般從http請求的url和參數得來。目前我接觸到兩種nginx cache方式:
本地文件系統cache (proxy_cache )
集中的內存cache (srcache-nginx-module)
Proxy_cache這是Nginx原生的ngx_http_proxy_module自帶的cache解決方案。http response的內容以文件的形式存在了本地的文件系統,同時開了一個share memory冗余存key值可以快速判斷是否cache命中。一般會這么部署。
如何配置nginx使能proxy cache,可以參考NGINX CONTENT CACHING 和 A Guide to Caching with NGINX
因為這個方案是本地文件系統存cache,可以比較容易理解具有以下缺點:
cache冗余,不同的nginx node間分別存cache。
cache一致性,因為是冗余的,各個節點間cache的失效時間是不同步的。
cache訪問速度慢,讀磁盤自然會慢一些。
cache效率低,因為各個node各有自己的cache不共享,即使某個node cache里存了某個請求,如果另外的nginx node來處理請求還是cache miss。
基于上面的問題,有更好的方案,比如agentzhang的srcache-nginx-module模塊。
srcache-nginx-module這個模塊旨在構建一個cache中間層,cache的存儲介質是集中的,一般使用memcached或者redis。這樣解決了冗余,也就解決了上面的各種問題,同時速度也快很多。對比著,它是這樣部署的。另外集中的cache存儲可以選擇redis或者memcached(memc-nginx-module提供API),memcached集群方案需要nginx配置配合解決。
順便感謝agentzhang將Lua引入到nginx。nginx出色的擴展性已經很靈活了,lua-nginx-module將腳本語言處理文本的便捷性直接引入nginx,使得開發人員可以方便的在http request/response處理的各個階段都能嵌入定制的功能。比如我可以很方便的使用lua模塊在rewrite階段根據url和args生成定制的cache key--刨除一些參數(比如不影響response結果的那些參數)。附上兩篇不錯的lua-nginx-module的資料:
lua-nginx-module
OpenResty最佳實踐
使用memc-nginx和srcache-nginx模塊構建高效透明的緩存機制
另外附上自己的nginx.conf以備后查。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } 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""; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # # cache server 1 upstream memcache1 { server 127.0.0.1:11211; #keepalive 512 single; } # cache server 2 #upstream memcache2 { # server 127.0.0.1:11211; #} upstream_list memcache_servers memcache1; server { listen 8080; server_name localhost; #memc-nginx-module location /memc { internal; memc_connect_timeout 100ms; memc_send_timeout 100ms; memc_read_timeout 100ms; set $memc_key $query_string; set $memc_exptime 30; set_hashed_upstream $backend memcache_servers $memc_key; memc_pass $backend; } location /s { # key gerneration for cache set $args_for_key ""; rewrite_by_lua " ngx.var.args_for_key = string.gsub(ngx.var.args, "queryid=%d+","queryid=0") "; #echo $args_for_key; srcache_fetch GET /memc $uri$args_for_key; srcache_store PUT /memc $uri$args_for_key; proxy_pass http://192.168.1.100:8000; } location / { root /var/www; index index.html index.htm index.php; } } server { listen 8081; location / { default_type text/html; content_by_lua " ngx.say("hello, world
") "; } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61778.html
摘要:粗線條一點根據的位置,一般會有瀏覽器,服務器,和應用服務器等。比如安全,解壓縮功能對所有請求都是通用的,這是可以搞定的,它一般不會終結業務類的處理,而是將他們交給后面的應用服務器。一致性,因為是冗余的,各個節點間的失效時間是不同步的。 前言 大家都知道cache對于網站性能的重要性,提高用戶響應速度,減輕后端壓力,節省資源等等。一談到cache其實是個很大話題,從前端瀏覽器到最終響應請...
摘要:初始化在終端中執行。首次執行初始化操作,會有較長的時間去獲取中定義的信息,在第一次初始化后沒有信息的變化,可以跳過初始化直接開始部署。執行部署命令時,會將的列出來展示給用戶,并由用戶確定執行。則刪除由創建的容器。通過Terraform在本地運行docker nginx前置條件: 1. 安裝好windows docker 2. 安裝好terraform安裝docker安裝windows doc...
摘要:是一個注冊在指定源和路徑下的事件驅動。可以提供有效有效的離線體驗,攔截網絡請求。出于安全原因,要求必須在下才能運行。返回一個對象,的結果是對象值對象組成的數組。當事件的處理程序執行完畢后,可以認為安裝完成了。 在前端越來越重的這個時代,頁面加載速度成為了一個重要的指標。對于這個問題,業界也有一些解決方案。 瀏覽器緩存、協議緩存、強緩存 懶加載(首屏) CDN 多域名突破下載并發限制。...
摘要:是一個注冊在指定源和路徑下的事件驅動。可以提供有效有效的離線體驗,攔截網絡請求。出于安全原因,要求必須在下才能運行。返回一個對象,的結果是對象值對象組成的數組。當事件的處理程序執行完畢后,可以認為安裝完成了。 在前端越來越重的這個時代,頁面加載速度成為了一個重要的指標。對于這個問題,業界也有一些解決方案。 瀏覽器緩存、協議緩存、強緩存 懶加載(首屏) CDN 多域名突破下載并發限制。...
閱讀 2796·2021-11-16 11:44
閱讀 969·2021-10-09 09:58
閱讀 4489·2021-09-24 09:48
閱讀 4252·2021-09-23 11:56
閱讀 2408·2021-09-22 15:48
閱讀 1892·2021-09-07 10:07
閱讀 3204·2021-08-31 09:46
閱讀 504·2019-08-30 15:56