友情提示: 緩存模塊是在動靜分離的環境基礎上搭建,動靜分離可以參考http://www.cnblogs.com/dahuandan/p/6759212.html
介紹
提高網站響應速度是web應用不容忽視的目標,在之前動靜分離的基礎上,我們已經降低了后端服務器壓力,提高了處理請求的性能,但是用戶請求的靜態資源是從硬盤讀取,相比內存的性能還有很大的提高;
Nginx自帶的緩存模塊可以把靜態資源緩存到內存中,提高了用戶請求靜態資源的速度,並且nginx自帶緩存模塊配置簡單,使用靈活,搭配第三方插件可以實現手動清除指定的緩存。
配置
添加緩存模塊
#創建緩存目錄 mkdir /dev/shm/demo #進入nginx安裝的conf目錄 cd /usr/local/nginx/conf/ #打開nginx.conf文件添加以下內容: proxy_temp_path /dev/shm/transfer/proxy_temp_path; proxy_cache_path /dev/shm/transfer/proxy_cache_path levels=1:2 keys_zone=cache_one:6072m inactive=7d max_size=30g; proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; proxy_cache cache_one; proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 7d; proxy_cache_key $host$uri$is_args$args; add_header X-Cache '$upstream_cache_status from $host';
完整的配置文件

#工作進程個數:多開幾個可以減少io帶來的影響, #根據 lscpu查出來的cpus設置(一般為當前機器核心數的1-2倍,最大不超過8), worker_processes 2; #worker_cpu_affinity需要結合worker_processes使用,一個worker_processes綁定一個CPU, #比如兩核是01,四核是0001,下面是8核綁定8個worker_processes的示例 worker_cpu_affinity 01 10; #error_log logs/error.log info; events { #使用epoll模型提高性能 use epoll; #單個進程連接數(最大連接數=連接數*進程數) worker_connections 65535; } http { #文件擴展名與文件類型映射表 include mime.types; #默認文件類型 default_type application/octet-stream; #開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設為 on, #如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。 #注意:如果圖片顯示不正常把這個改成off sendfile on; #長連接超時時間,單位是秒 keepalive_timeout 65; #gzip 是告訴nginx采用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。 gzip on; gzip_min_length 1k; #最小1K gzip_buffers 16 64K; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain application/x- text/css application/xml application/; gzip_vary on; #header設置:用戶真實的ip地址轉發給后端服務器 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; #緩沖 client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; ##########################緩存##################### #設置緩存臨時目錄,要配合linux的內存目錄/dev/shm使用的話,必須給賦予目錄權限,因為默認root權限 proxy_temp_path /dev/shm/demo/proxy_temp_path; #設置緩存目錄,並設置Web緩存區名稱為cache_one,內存緩存空間大小為128m,7天沒有被訪問的內容自動清除,硬盤緩存空間大小為5GB。 proxy_cache_path /dev/shm/demo/proxy_cache_path levels=1:2 keys_zone=cache_one:128m inactive=7d max_size=5g; #啟用html、jsp...<meta>標簽不緩存的設置 proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; ################################################集群 ################################################### #動態資源集群 upstream dynamic_server { #服務器配置 weight是權重的意思,權重越大,分配的概率越大。 server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.111:8081 weight=1 max_fails=2 fail_timeout=30s; } #靜態資源集群(一般由nginx管理,因為nginx處理靜態資源性能好,如果服 #務器有限,也可以部署在代理服務器本地) upstream static_server { server 192.168.1.111:808 weight=1; } ################################################Nginx代理################################################### server { #監聽80端口,可以改成其他端口 listen 80; #nginx服務的域名,通過域名就可以訪問應用 server_name localhost; ##靜態資源存放在nginx服務器的地址 #root /opt/static/demo; #用於清除緩存的url設置 #假設一個URL為demo/test.gif,那么就可以通過訪問demo/purge/test.gif清除該URL的緩存。 location ~ /purge(/.*) { #設置只允許指定的IP或IP段才可以清除URL緩存 allow 127.0.0.1; allow 10.74.147.91; deny all; proxy_cache_purge cache_one $host$1$is_args$args; } #反向代理:網頁、視頻、圖片文件從nginx服務器讀取 location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { ##########################緩存##################### #使用web緩存區cache_one proxy_cache cache_one; #對200 304 302狀態碼設置緩存時間5天,其他的7天 proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 7d; #以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希,存儲緩存內容到二級緩存目錄內 proxy_cache_key $host$uri$is_args$args; #如果后端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一台服務器,實現故障轉移 #proxy_next_upstream http_502 http_504 error timeout invalid_header; #增加一個header字段方便在瀏覽器查看是否擊中緩存(生產中可注釋) add_header X-Cache '$upstream_cache_status from $host'; #反向代理,靜態的由nginx來處理(不配置默認nginx的html目錄,靜態資源的目錄結構必須和tomcat的web工程一致) proxy_pass http://static_server; #瀏覽器中緩存30天 expires 30d; } #反向代理: 其他動態文件轉發到后端的tomcat集群 location ~ .*$ { proxy_pass http://dynamic_server; } #錯誤提示頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #靜態資源服務器,這里監聽本地808端口,因為靜態資源服務器和代理服務器是同一台機器,所以有如下配置 #如果是獨立的服務器,直接在集群upstram配置即可。 server{ listen 808; server_name static; #反向代理:網頁、視頻、圖片文件從nginx服務器讀取 location / { #瀏覽器中緩存30天 expires 30d; } } }
重新加載配置文件
/usr/local/nginx/sbin/nginx -s reload
測試
添加測試圖片
在/usr/local/nginx/html/demo目錄下添加測試圖片test.png
測試緩存
1、當我們第一次訪問測試圖片地址 http://192.168.1.111/demo/test.png 是沒有緩存命中的:
2、再次訪 問http://192.168.1.111/demo/test.png 我們可以看到命中緩存了:
3、清除之前訪問url的緩存: