Nginx負載均衡中的Memcached緩存模塊
Nginx 的 ngx_http_memcached_module 模塊本身并沒有提供緩存功能,它只是一個將用戶請求轉(zhuǎn)發(fā)到 Memcached 服務(wù)器的代理模塊。
在以 Memcached 服務(wù)器為緩存應(yīng)用的方案中,Memcached 作為內(nèi)容緩存的存儲服務(wù)器,用戶通過 URL 為 Memcached 的 key 將 Web 請求數(shù)據(jù)緩存到 Memcached 服務(wù)器中,在客戶端發(fā)起請求時,Nginx 通過一致的 URL 為 key,快速地從 Memcached 服務(wù)器中將緩存的內(nèi)容作為用戶的請求響應(yīng)數(shù)據(jù)返回給客戶端。
Memcached 是一個開源、高性能的內(nèi)存對象緩存系統(tǒng),使用 Memcached 服務(wù)器作為緩存存儲服務(wù)器,充分利用了 Memcached 的高效緩存功能,減少了 Nginx 服務(wù)器磁盤 I/O 的操作,也可以通過 upstream 指令對多臺 Memcached 做分布式集群負載,以便整體提升 Nginx 緩存服務(wù)器的性能。
Memcached 緩存模塊配置指令如下表所示:
指令名稱 | 指令值格式 | 默認值 | 指令說明 |
---|---|---|---|
memcached_bind | address[transparent] 或 off | -- | 設(shè)置從指定的本地 IP 地址及端口與 Memcached 服務(wù)器建立連接,指令值可以是變量。指令值參數(shù)為 transparent 時,允許將客戶端的真實 IP 透傳給被代理服務(wù)器,并以客戶端真實 IP 為訪問被代理服務(wù)器的源 IP,指令值為 off 時,則取消上一層指令域同名指令的配置 |
memcached_buffer_size | size | 4k 或 8k | 設(shè)置用于讀取 Memcached 服務(wù)器,讀取響應(yīng)數(shù)據(jù)緩沖區(qū)的大小,當 Nginx 收到響應(yīng)數(shù)據(jù)后,將同步傳遞給客戶端 |
memcached_connect_timeout | time | 60s | Nginx 與 Memcached 服務(wù)器建立連接的超時時間,通常不應(yīng)超過 75s |
memcached_force_ranges | on 或 off | off | 啟用來自 Memcached 服務(wù)器的緩存和未緩存響應(yīng)的 byte-range 請求支持,而不考慮這些響應(yīng)頭中的 Accept-Ranges 字段 |
memcached_gzip_flag | flag | -- | 啟用對 Memcached 服務(wù)器緩存數(shù)據(jù) fags 的測試,flags 為客戶端寫入緩存時的自定義標記,此處用以判斷緩存數(shù)據(jù)是否被壓縮存儲,如果數(shù)據(jù)被壓縮存儲,則將響應(yīng)頭字段 Content-Encoding 設(shè)置為 gzip |
memcached_next_upstream | error、timeout、 invalid_header、 not found 或 off... | error timeout | 當出現(xiàn)指令值中指定的條件時,將未返回響應(yīng)的客戶請求傳遞給 upstream 中的下一個服務(wù)器 |
memcached_next_upstream_timeout | time | 0 | 設(shè)置將符合條件的客戶端請求傳遞給 upstream 中下一個服務(wù)器的超時時間。0 為不做超時限制,遍歷完所有上游服務(wù)器組中的服務(wù)器為止 |
memcached_next_upstream_tries | number | 0 | 設(shè)置符合條件的客戶端請求傳遞給upstream中下一個服務(wù)器的嘗試次數(shù),包括第一次失敗的次數(shù)。0為不做嘗試次數(shù)限制,遍歷完所有上游服務(wù)器組中的服務(wù)器為止 |
memcached_pass | address | -- | 設(shè)置 Memcached 服務(wù)器的地址及端口,地址可以是 IP、域名或 UNIX 套接字 |
memcached_read_timeout | time | 60s | 在連續(xù)兩個從 Memcached 服務(wù)器接收數(shù)據(jù)的讀操作之間的間隔時間超過設(shè)置的時間時,將關(guān)閉連接 |
memcached_send_timeout | time | 60s | 在連續(xù)兩個發(fā)送到 Memcached 服務(wù)器的寫操作之間的間隔時間超過設(shè)置的時間時,將關(guān)閉連接 |
memcached_socket_keepalive | on 或 off | off | 設(shè)置 Nginx 與 Memcached 服務(wù)器的 TCP keepalive 行為的心跳檢測機制,默認使用操作系統(tǒng)的 socket 配置,若指令值為 on,則開啟 SO_KEEPALIVE 選項進行心跳檢測 |
配置樣例如下:
server { location / { set $memcached_key "$uri?$args"; # 設(shè)置Memcached緩存key memcached_pass 127.0.0.1:11211; # 設(shè)置被代理Memcached地址 error_page 404 502 504 = @fallback; # 返回狀態(tài)碼404、502、504時跳入內(nèi)部請求 } location @fallback { proxy_pass http://backend; # 將請求轉(zhuǎn)發(fā)給后端服務(wù)器 } }
為了提高動態(tài)網(wǎng)站的響應(yīng)速度,有時會采用將動態(tài)網(wǎng)站轉(zhuǎn)換成靜態(tài)化文件的方式進行優(yōu)化,而相對于磁盤存儲,使用 Memcached 進行靜態(tài)文件的存儲則可以進一步提升網(wǎng)站的響應(yīng)速度。Memcached 是基于內(nèi)存的高性能對象緩存系統(tǒng),因為存儲數(shù)據(jù)都是在內(nèi)存中的,所以減少了系統(tǒng)的 I/O 操作,從而避免了因磁盤性能帶來的影響。
使用 Memcached 作為緩存存儲服務(wù)器,可以直接利用 Memcached 緩存的過期機制實現(xiàn)緩存的自動化過期管理,且利用 Nginx 的負載機制和 Memcached 分布式特性,可以非常方便地橫向擴展,以提升處理性能。Memcached 緩存應(yīng)用場景如下圖所示。
Web 服務(wù)器將動態(tài)文件以請求 URI 作為 Memcached 的 key 初始化到 Memcached 服務(wù)器中;Nginx 將用戶請求轉(zhuǎn)發(fā)到 Memcached 服務(wù)器中,并將以請求 URI 作為 Memcached key 的數(shù)據(jù)返回給用戶;當 Memcached 的請求失敗后,則將請求轉(zhuǎn)發(fā)給后端 Web 服務(wù)器的接口動態(tài)生成對應(yīng)的靜態(tài)文件,返回響應(yīng)數(shù)據(jù)并更新 Memcached。
Memcached 的安裝非常簡單,在 CentOS 7 系統(tǒng)下使用 yum 安裝即可,安裝方法如下:
yum -y install memcached cat /etc/sysconfig/memcached PORT="11211" # 端口 USER="memcached" MAXCONN="1024" # 最大連接數(shù) CACHESIZE="64" # 使用內(nèi)存大小為64M OPTIONS="" systemctl start memcached
Nginx 服務(wù)器配置樣例如下:
upstream backend { server 192.168.2.145:8190; # 后端PHP服務(wù)器IP } upstream memcached { hash $host$request_uri consistent; # 一致性hash server 192.168.2.145:11211; # Memcached服務(wù)器IP server 192.168.2.109:11211; # Memcached服務(wù)器IP } server { listen 8181; access_log logs/mem_access.log; set $memcached_key $host$request_uri; # 設(shè)置Memcached的key location / { memcached_connect_timeout 5s; # 與Memcached建立連接超時時間為5s memcached_read_timeout 2s; # 連續(xù)兩次讀的超時時間為2s memcached_send_timeout 2s; # 連續(xù)兩次寫的超時時間為2s memcached_pass memcached; # 代理到Memcached集群 add_header X-Cache-Satus HIT; # 顯示緩存命中狀態(tài) add_header Content-Type 'text/html; charset=utf-8'; # 強制響應(yīng)數(shù)據(jù)格式為html } error_page 404 502 504 = @fallback; location @fallback { proxy_set_header X-Memcached-Key $memcached_key; # 將memecached key傳遞 # 給PHP服務(wù)器 proxy_pass http://backend; # PHP服務(wù)器 } }
到此這篇關(guān)于Nginx負載均衡之Memcached緩存模塊的文章就介紹到這了,更多相關(guān)Nginx Memcached緩存模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項目整合FastDFS+Nginx實現(xiàn)圖片上傳功能
FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題,對SpringBoot整合FastDFS實現(xiàn)圖片上傳功能,感興趣的朋友一起看看吧2022-05-05Nginx?Gunicorn?flask項目部署思路分析詳解
這篇文章主要為大家介紹了Nginx?Gunicorn?flask項目部署思路分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Nginx?Rewrite及Location的使用與區(qū)別
rewrite和location的功能有點相像,都能實現(xiàn)跳轉(zhuǎn),本文主要介紹了Nginx?Rewrite及Location的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下2023-08-08nginx版本號隱藏(附405 not allowed解決辦法)
版本號泄露時攻擊者會利用相應(yīng)軟件版本的當前漏洞,進行有效的相應(yīng)攻擊,本文主要介紹了nginx版本號隱藏,具有一定的參考價值,感興趣的可以了解一下2023-10-10Nginx worker_connections配置太低導致500錯誤案例
這篇文章主要介紹了Nginx worker_connections配置太低導致500錯誤案例,需要的朋友可以參考下2015-04-04通過Nginx+Tomcat+Redis實現(xiàn)持久會話
這篇文章主要介紹了通過Nginx+Tomcat+Redis實現(xiàn)持久會話的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11