web緩存位於內容源Web服務器和客戶端之間,當用戶訪問一個URL時,Web緩存服務器會去後端Web源服務器取回要輸出的內容,而後,當下一個請求到來時,若是訪問的是相同的URL,Web緩存服務器直接輸出內容給客戶端,而不是向源服務器再次發送請求.Web緩存下降了內容源Web服務器,數據庫的負載,減小了網絡延遲,提升了用戶訪問的響應速度,加強了用戶體驗.javascript
web緩存服務器中,最著名的要數Squid Cache(簡稱爲Squid),Squid是一個流浪的自由軟件的代理服務器和Web緩存服務器。
===================================================================
Squid能夠做爲網頁服務器的前置cache服務器緩存相關請求來提升Web服務器的速度;
Squid能夠爲一組人共享網絡資源而緩存萬維網,域名系統和其餘網絡搜索;
Squid能夠經過過濾流量幫助網絡安全,到局域網經過代理上網.
===================================================================
然而,當下多數公司網站的圖片,js,css等文件的緩存會選擇Nginx的web緩存服務。php
以下將對nginx的web緩存功能的總體配置進行梳理性記錄:
Nginx的Web緩存服務主要由proxy_cache相關指令集和fastcgi_cache相關指令集構成。
1)proxy_cache相關指令集用於反向代理時,對後端內容源服務器進行緩存.Nginx的proxy_cache緩存功能,十分穩定,速度不遜於Squid!css
2)fastcgi相關指令集主要用於對FastCGI的動態程序進行緩存.二者功能基本同樣.在功能上,Nginx已經具有Squid所擁有的Web緩存加速功能,清除指定URL緩存功能.而在性能上,Nginx對多核CPU的利用,賽過Squid很多.另外,在反向代理,負載均衡,健康檢查,後端服務器故障轉移,重寫,易用性上,Nginx也比Squid強大不少.這使得一臺Nginx能夠同時做爲"負載均衡服務器"與"Web緩存服務器"來使用.html
proxy_cache相關指令集
(1)proxy_cache指令
語法: proxy_cache zone_name ;
該指令用於設置哪一個緩存區將被使用,zone_name的值爲proxy_cache_path指令建立的緩存區的名稱。proxy_pass 指定獲取靜態內容的地址,其實proxy_cache的原理就是從一個指定的地址獲取內容,而後緩存。當下次訪問時,nginx會自動判斷有沒有緩存文件?若是有的話緩存文件是否是已通過期。java
(2)proxy_cache_path指令
語法 proxy_cache_path path [levels=number]node
keys_zone=zone_name:zone_size[inactive=time] [max_size=size];
該指令用於設置緩存文件的存放路徑.nginx
例如:
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g ;
解釋:
path 表示存放目錄
levels 表示指定該緩存空間有兩層hash目錄,第一層目錄爲1個字母,第二層目錄爲2個字母,
保存的文件名會相似/usr/local/nginx/proxy_cache_dir/c/29/XXXXXX ;
keys_zone參數用來爲這個緩存區起名.
500m 指內存緩存空間大小爲500MB
inactive的1d指若是緩存數據在1天內沒有被訪問,將被刪除。至關於expires過時時間的配置;
max_size的30g是指硬盤緩存空間爲30Gweb
(3)proxy_cache_methods指令
語法:proxy_cache_methods[GET HEAD POST];
該指令用於設置緩存哪些HTTP方法,默認緩存HTTP GET/HEAD方法,不緩存HTTP POST 方法數據庫
(4)proxy_cache_min_uses指令
語法:proxy_cache_min_uses the_number
該指令用於設置緩存的最小使用次數,默認值爲1vim
(5)proxy_cache_valid指令
語法: proxy_cache_valid reply_code [reply_code...] time ;
該指令用於對不一樣返回狀態碼的URL設置不一樣的緩存時間.
例如:
proxy_cache_valid 200 302 10m ;
proxy_cache_valid 404 1m ;
設置200,302狀態的URL緩存10分鐘,404狀態的URL緩存1分鐘.
(6)proxy_cache_key指令
語法: proxy_cache_key line ;
該指令用來設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存.通常根據$host(域名),$request_uri(請求的路徑)等變量組合成proxy_cache_key .
proxy_cache緩存配置的完整示例(多數nginx緩存的配置):
1)下載nginx和第三方的ngx_cache_purge模塊的編譯安裝包(官網:http://labs.frickle.com/nginx_ngx_cache_purge/),將ngx_cache_purge編譯到到Nginx中,用來清除指定URL的緩存
[root@test-huanqiu ~]# yum install -y pcre pcre-devel openssl openssl-devel gcc //首先安裝依賴
[root@test-huanqiu ~]# cd /usr/local/src
[root@test-huanqiu src]# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
[root@test-huanqiu src]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
[root@test-huanqiu src]# tar -zxvf ngx_cache_purge-2.3.tar.gz
[root@test-huanqiu src]# tar zxvf nginx-1.8.0.tar.gz
[root@test-huanqiu src]# cd nginx-1.8.0.tar.gz
[root@test-huanqiu nginx-1.8.0]# ./configure --user=www --group=www --add-module=../ngx_cache_purge-2.3 --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
[root@test-huanqiu src]# make && make install
2)接着,在同一分區下建立兩個緩存目錄,分別供proxy_temp_path , proxy_cache_path指令設置緩存路徑.
注意:proxy_temp_path和proxy_cache_path指定的路徑必須在同一磁盤分區,決不能跨區分,由於它們之間是硬連接的關係,避免不通文件系統之間的磁盤IO消耗。
[root@test-huanqiu src]# mkdir -p /usr/local/nginx/proxy_cache_path #注意,這兩個目錄的權限必定要是www.www,便是nginx進程權限
[root@test-huanqiu src]# mkdir -p /usr/local/nginx/proxy_temp_path #這是緩存文件的臨時存放目錄
3)在配置文件nginx.conf中對擴展名爲gif,jpg,jpeg,png,bmp,swf,js,css的圖片,flash,javascript , css文件開啓Web緩存,其餘文件不緩存。
[root@test-huanqiu src]# vim /usr/local/nginx/conf/nginx.conf user www; worker_processes 8; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; charset utf-8; log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_cookie" $host $request_time'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #要想開啓nginx的緩存功能,須要添加此處的兩行內容! #設置Web緩存區名稱爲cache_one,內存緩存空間大小爲500M,緩存的數據超過1天沒有被訪問就自動清除;訪問的緩存數據,硬盤緩存空間大小爲30G proxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g; #建立緩存的時候可能生成一些臨時文件存放的位置 proxy_temp_path /usr/local/nginx/proxy_temp_path; fastcgi_connect_timeout 3000; fastcgi_send_timeout 3000; fastcgi_read_timeout 3000; fastcgi_buffer_size 256k; fastcgi_buffers 8 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; client_header_timeout 600s; client_body_timeout 600s; client_max_body_size 100m; client_body_buffer_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; gzip_vary on; include vhosts/*.conf; }
[root@test-huanqiu src]# ulimit -n 65535
[root@test-huanqiu src]# mkdir /usr/local/nginx/conf/vhosts
若是執行"nginx -t"檢查配置文件的時候,報錯: nginx: [emerg] unknown directive " proxy_temp_path" in /usr/local/nginx/conf/nginx.conf:21 nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed nginx: [emerg] unknown directive " proxy_cache_path" in /usr/local/nginx/conf/nginx.conf:21 nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed 可能緣由:nginx.conf裏關於這兩行的配置有誤,好比這兩行前面的空格有誤。能夠先刪除空格,而後再空格鍵設置空格,防止不規範空格。
[root@test-huanqiu src]# vim /usr/local/nginx/conf/vhosts/wang.conf
upstream LB-WWW { ip_hash; server 192.168.1.101:80 max_fails=3 fail_timeout=30s; #max_fails = 3 爲容許失敗的次數,默認值爲1 server 192.168.1.102:80 max_fails=3 fail_timeout=30s; #fail_timeout = 30s 當max_fails次失敗後,暫停將請求分發到該後端服務器的時間 server 192.168.1.118:80 max_fails=3 fail_timeout=30s; } server { listen 80; server_name www.wangshibo.com; index index.html index.php index.htm; root /var/www/html; access_log /usr/local/nginx/logs/www-access.log main; error_log /usr/local/nginx/logs/www-error.log; location / { proxy_pass http://LB-WWW; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300; #跟後端服務器鏈接超時時間,發起握手等候響應時間 proxy_send_timeout 300; #後端服務器回傳時間,就是在規定時間內後端服務器必須傳完全部數據 proxy_read_timeout 600; #鏈接成功後等待後端服務器的響應時間,已經進入後端的排隊之中等候處理 proxy_buffer_size 256k; #代理請求緩衝區,會保存用戶的頭信息以供nginx進行處理 proxy_buffers 4 256k; #同上,告訴nginx保存單個用幾個buffer最大用多少空間 proxy_busy_buffers_size 256k; #若是系統很忙時候能夠申請最大的proxy_buffers proxy_temp_file_write_size 256k; #proxy緩存臨時文件的大小 proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_max_temp_file_size 128m; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { #使用Web緩存區cache_one,已在nginx.conf的緩存配置中命名的。 proxy_cache cache_one ; #對不一樣HTTP狀態碼緩存設置不一樣的緩存時間 proxy_cache_valid 200 304 12h ; proxy_cache_valid 301 302 1m ; proxy_cache_valid any 1m ; #設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存,這裏根據"域名,URI, #參數"組合成Key proxy_cache_key $host$uri$is_args$args; } #用於清除緩存的url設置 #假設一個URL爲http://www.wangshibo.com/test.gif,那麼就能夠經過訪問http://www.wangshibo.com/purge/test.gif清除該URL的緩存。 location ~ /purge(/.*) { #設置只容許指定的IP或IP段才能夠清除URL緩存 allow 127.0.0.1 ; allow 192.168.0.0/16 ; deny all ; proxy_cache_purge cache_one $host$1$is_args$args ; } }
fastcgi_cache相關指令集
(1)fastcgi_cache指令
語法:fastcgi_cache zone_name;
該指令用於設置哪一個緩存區將被使用,zone_name的值爲fastcgi_cache_path指令建立的緩存區名稱.
(2)fastcgi_cache_path指令
語法:fastcgi_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
該指令用於設置緩存文件的存放路徑,
例如:
fastcgi_cache_path /usr/local/nginx/fastcgi_cache_dir levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g ;
注意這個指令只能在http標籤內配置,
levels指定該緩存空間有兩層hash目錄,第一層目錄爲1個字母,第二層爲2個字母,保存的
文件名會相似/usr/local/nginx/fastcgi_cache_dir/c/29/XXXX;
keys_zone參數用來爲這個緩存區起名,
500m指內存緩存空間大小爲500MB;
inactive的1d指若是緩存數據在1天內沒有被訪問,將被刪除;
max_size的30g是指硬盤緩存空間爲30GB
(3)fastcgi_cache_methods指令
語法:fastcgi_cache_methods [GET HEAD POST] ;
該指令用於設置緩存哪些HTTP方法,默認緩存HTTP GET/HEAD 方法,不緩存HTTP POST方法
(4)fastcgi_cache_min_uses指令
語法:fastcgi_cache_min_uses the_number;
該指令用於設置緩存的最小使用次數,默認值爲1.
(5)fastcgi_cache_valid指令
fastcgi_cache_valid reply_code [reply_code...] time;
該指令用於對不一樣返回狀態碼的URL設置不一樣的緩存時間.
fastcgi_cache_valid 200 302 10m ;
fastcgi_cache_valid 404 1m ;
設置200,302狀態的URL緩存10分鐘,404狀態的URL緩存1分鐘.
若是不指定狀態碼,直接指定緩存時間,則只有200,301,302狀態的URL緩存5分鐘.
(6)fastcgi_cache_key指令
語法:fastcgi_cache_key line ;
該指令用來設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存.通常根據FastCGI服務器的地址和端口,$request_uri(請求的路徑)等變量組合成fastcgi_cache_key。
fastcgi_cache緩存配置的完整示例
1)首先,在同一分區下建立兩個緩存目錄,分別供fastcgi_temp_path,fastcgi_cache_path指令設置緩存路徑.
注意:兩個指定設置的緩存路徑必須爲同一磁盤分區,不能跨分區.
[root@test-huanqiu src]# mkdir -p /usr/local/nginx/fastcgi_temp_path
[root@test-huanqiu src]# mkdir -p /usr/local/nginx/fastcgi_cache_path
2)配置文件nginx.conf對擴展名爲gif,jpg,jpeg,png,bmp,swf,js,css的圖片,Flash,JavaScript,CSS文件開啓Web緩存,其餘文件不緩存.
[root@test-huanqiu src]# vim /usr/local/nginx/conf/nginx.conf ........ http{ #fastcgi_temp_path和fastcgi_cache_path指定的路徑必須在同一分區 fastcgi_temp_path /usr/local/nginx/fastcgi_temp_path ; #設置Web緩存區名稱爲cache_one,內存緩存空間大小爲500MB,自動清除超過1天沒有被 #訪問的緩存數據,硬盤緩存空間大小爲30G fastcgi_cache_path /usr/local/nginx/fastcgi_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g ; ........ }
[root@test-huanqiu src]# vim /usr/local/nginx/conf/vhosts/wang.conf server{ ....... location ~ .*\.(php|php5)$ { #使用Web緩存區cache_one fastcgi_cache cache_one ; #對不一樣的HTTP狀態碼緩存設置不一樣的緩存時間 fastcgi_cache_valid 200 10m ; fastcgi_cache_valid 301 302 1h ; fastcgi_cache_valid an 1m ; #設置Web緩存的key值,Nginx根據key值md5哈希存儲緩存,這裏根據"FastCGI服務 #器的IP,端口,請求的URI"組合成Key。 fastcgi_cache_key 127.0.0.1:9000$requet_uri ; #FastCGI服務器 fastcgi_pass 127.0.0.1:9000 ; fastcgi_index index.php ; include fcgi.conf ; } }
ngx_cache_purge 是 nginx 的第三方那個模塊,用於清除 FastCGI, proxy, SCGI and uWSGI 緩存,nginx默認安裝就會帶有反向代理的功能,但想要更好的使用,還得配備frickle.com的ngx_cache_purge模塊,用於清除指定URL的緩存。
proxy_cache和fastcgi_cache構成了Nginx的緩存,proxy_cache主要用於反向代理時,對後端內容源服務器進行緩存,fastcgi_cache主要用於對FastCGI的動態程序進行緩存。二者的功能基本上同樣。
-> proxy_cache的做用是緩存後端服務器的內容,多是任何內容,包括靜態的和動態。
-> proxy_cache緩存減小了nginx與後端通訊的次數,節省了傳輸時間和後端寬帶。
-> fastcgi_cache的做用是緩存fastcgi生成的內容,不少狀況是php生成的動態的內容。
-> fastcgi_cache緩存減小了nginx與php的通訊的次數。
在單機上部署nginx的cache緩存服務操做記錄
根據業務部門需求,申請一臺文件的cache服務器。以下記錄在單臺機器上部署Nginx緩存服務過程: nginx緩存配置(緩存配置的參數這裏就不作過多解釋了,在前面的文檔中已說明過,這裏只作簡單記錄) [root@storage01 ~]# cat /data/nginx/conf/nginx.conf|grep -v "^$"|grep -v "#" user www; worker_processes 8; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; charset utf-8; log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_cookie" $host $request_time'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; proxy_temp_path /data/nginx/proxy_temp; proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g; client_header_timeout 600s; client_body_timeout 600s; client_max_body_size 50m; client_body_buffer_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; gzip_vary on; include vhosts/*.conf; } 注意:緩存目錄/proxy_cache和/proxy_temp必定要在同一個分區下,而且權限必定要和nginx程序權限一致(即要有寫入權限,不然不能生產緩存文件)! [root@storage01 ~]# mkdir /data/nginx/proxy_cache [root@storage01 ~]# mkdir /data/nginx/proxy_temp [root@storage01 ~]# chown -R www.www /data/nginx/proxy_cache [root@storage01 ~]# chown -R www.www /data/nginx/proxy_temp [root@storage01 ~]# chmod -R 777 /data/nginx/proxy_cache [root@storage01 ~]# chmod -R 777 /data/nginx/proxy_temp [root@storage01 ~]# cat /data/nginx/conf/vhosts/8888.conf server { listen 8888; server_name localhost; access_log /data/nginx/logs/8888-access.log main; error_log /data/nginx/logs/8888-error.log; location / { index index.html index.htm; root /data/img/; } } [root@storage01 ~]# cat /data/nginx/conf/vhosts/img.conf upstream cache { server localhost:8888 max_fails=3 fail_timeout=30s; } server { listen 80; server_name img.wang.com; access_log /data/nginx/logs/img-access.log main; error_log /data/nginx/logs/img-error.log; location / { proxy_pass http://cache; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_cache cache_one ; proxy_cache_valid 200 304 12h ; proxy_cache_valid 301 302 1m ; proxy_cache_valid any 1m ; proxy_cache_key $host$uri$is_args$args; } location ~ /purge(/.*) { allow all ; proxy_cache_purge cache_one $host$1$is_args$args ; error_page 405 =200 /purge$1; } }
訪問域名測試
[root@storage01 ~]# ll -d /data/img/ drwxr-xr-x 3 www www 4096 Aug 21 14:56 /data/img/ [root@storage01 ~]# ll /data/img/ total 8 -rwxr-xr-x 1 www www 31 Aug 16 15:44 index.html drwxr-xr-x 2 www www 4096 Aug 21 14:57 upload [root@storage01 ~]# cat /data/img/index.html 緩存服務器!!!!! [root@storage01 ~]# ll /data/img/upload/ total 140 -rw-r--r-- 1 www www 140935 Aug 17 09:31 test.jpg
查看緩存文件
[root@storage01 ~]# ll /data/nginx/proxy_cache/ total 24 drwx------ 3 www www 4096 Aug 21 16:57 2 drwx------ 3 www www 4096 Aug 21 16:56 3 drwx------ 3 www www 4096 Aug 21 17:05 4 drwx------ 3 www www 4096 Aug 21 16:55 6 drwx------ 3 www www 4096 Aug 21 16:55 7 drwx------ 3 www www 4096 Aug 21 16:57 b [root@storage01 ~]# ll /data/nginx/proxy_cache/2 total 4 drwx------ 2 www www 4096 Aug 21 16:57 fc [root@storage01 ~]# ll /data/nginx/proxy_cache/3 total 4 drwx------ 2 www www 4096 Aug 21 17:08 05 上面緩存文件的結構是由levels=1:2決定的,即第一層目錄是一個字母命名,第二層目錄是兩個字母表示 緩存文件強磁盤打滿該怎麼辦? 因爲寫入路徑爲一個單一目錄,只能寫入一塊磁盤。一塊磁盤很快就會被打滿,解決該問題有以下兩種方法: 1)將多塊磁盤作磁盤陣列? 缺點是:減少了實際的存儲空間。 2)巧妙得運用proxy_cache_path的目錄結構,因爲levels=1:2,這致使緩存文件的目錄結構爲兩層,每層目錄名,都是由hash函數生成。 如上,能夠將/data/nginx/proxy_cache/下的一級目錄統統軟連接到大空間的分區下。
若是nginx緩存配置後,proxy_cache_path緩存目錄下不能生成緩存文件的緣由:
1)/data/nginx/proxy_cache和/data/nginx/proxy_temp的權限問題(如上,這倆目錄權限要是www.www,最好777權限) 2)proxy_cache_valid和proxy_pass這兩條,就算在單機部署,也要經過proxy_pass代理到本身的對應訪問端口下。 proxy_pass指定獲取靜態內容的地址,其實proxy_cache的原理就是從一個你指定的地址獲取內容,而後緩存。當下次你訪問時,nginx會自動判斷有沒有緩存文件? 若是有的話緩存文件是否是已通過期(緩存文件的有效期就是第一條設置的)?若是前面兩條任何一條成立就會從proxy_pass的地址從新獲取頁面信息。
手動清除緩存(用到模塊ngx_cache_purge)。經過http://img.wang.com/purge/upload/test.jpg手動清理緩存
再次訪問http://img.wang.com/purge/upload/test.jpg進行緩存清理,因爲上面已經清理過一次了,因此再次使用這個url進行清理的話,就會報404
須要再次訪問http://img.wang.com/upload/test.jpg(若是如上清理緩存後,訪問這個失敗,就嘗試徹底清理瀏覽器緩存),就會再次生成緩存,由此再可使用上面的purge的url路徑進行緩存清理!
[root@storage01 ~]# cd /data/nginx/proxy_cache/ [root@storage01 proxy_cache]# ll total 8 drwx------ 3 www www 4096 Aug 21 17:23 3 drwx------ 3 www www 4096 Aug 21 17:23 b [root@storage01 proxy_cache]# rm -rf ./* [root@storage01 proxy_cache]# ll total 0 [root@storage01 proxy_cache]# /data/nginx/sbin/nginx -s reload 而後訪問http://img.wang.com/upload/test.jpg,強制刷新幾回。隨後就會發現緩存文件就會自動生成了! [root@storage01 proxy_cache]# ll total 8 drwx------ 3 www www 4096 Aug 21 17:26 3 drwx------ 3 www www 4096 Aug 21 17:26 b [root@storage01 proxy_cache]# ll b total 4 drwx------ 2 www www 4096 Aug 21 17:26 a1
nginx代理中的緩衝緩存優化說明
Nignx反向代理的一個問題是代理大量用戶時會增長服務器進程的性能衝擊影響。在大多數狀況下,能夠很大程度上能經過利用Nginx的緩衝和緩存功能減輕。 當代理到另外一臺服務器,兩個不一樣的鏈接速度會影響客戶的體驗: -> 從客戶機到Nginx代理的鏈接。 -> 從Nginx代理到後端服務器的鏈接。 Nginx具備優化這些鏈接調整其行爲的能力。 -> 若是沒有緩衝,數據從代理的服務器發送並當即開始被髮送到客戶。若是假定客戶端很快,緩衝能夠關閉而儘快使數據到客戶端. -> 有了緩衝,Nginx代理將暫時存儲後端的響應,而後按需供給數據給客戶端。若是客戶端是緩慢的,容許Nginx服務器關閉到後端的鏈接。而後,它能夠處理數據分配到客戶端,以任何可能的速度。 Nginx默認有緩衝設計,由於客戶端每每有很大的不一樣的鏈接速度。能夠用如下指令調節緩衝行爲。能夠在HTTP,server或location位置來設置。重要的是要記住,大小size指令是針對每一個請求配置的, 因此增長超出你需求會影響你的性能,若是這時有許多客戶端請求: 1)proxy_buffering:該指令控制緩衝是否啓用。默認狀況下,它的值是"on"。 2)proxy_buffers:該指令控制代理響應緩衝區的數量(第一個參數)和大小(第二個參數)。默認配置是8個緩衝區大小等於一個內存頁(4K或者8K)。增長緩衝區的數目可讓你緩衝更多信息。 3) proxy_buffer_size:從後端服務器的響應頭緩衝區大小,它包含headers,和其餘部分響應是分開的。該指令設置響應部分的緩衝區大小。默認狀況下,它和proxy_buffers是相同的尺寸, 但由於這是用於頭信息,這一般能夠設置爲一個較低的值。 4)proxy_busy_buffers_size:此指令設置標註"client-ready"緩衝區的最大尺寸。而客戶端能夠一次讀取來自一個緩衝區的數據,緩衝被放置在隊列中,批量發送到客戶端。此指令控制容許是在這種狀態下的緩衝空間的大小。 5)proxy_max_temp_file_size:這是每一個請求能用磁盤上臨時文件最大大小。這些當上遊響應太大不能裝配到緩衝區時被建立。 6)proxy_temp_file_write_size:這是當被代理服務器的響應過大時Nginx一次性寫入臨時文件的數據量。 7)proxy_temp_path:當上遊服務器的響應過大不能存儲到配置的緩衝區域時,Nginx存儲臨時文件硬盤路徑。 Nginx提供了至關多不一樣的指令來調整緩衝行爲。大多數時候沒必要擔憂太多,但它對於調整一些值多是有用的。可能最有用的調整是proxy_buffers和proxy_buffer_size指令,好比: proxy_busy_buffers_size 8k; proxy_max_temp_file_size 2048m; proxy_temp_file_write_size 32k; proxy_pass http://www.wang.com; -----------------------------配置Nginx代理服務緩存來減小響應時間----------------------------- 儘管緩衝能夠幫助釋放後端服務器以處理更多的請求,Nginx還提供了一種方法來緩存從後端服務器的內容,對於許多請求無需鏈接到上游。 配置代理緩存,要設置緩存用於代理內容,可使用proxy_cache_path指令。這將建立區域保存來自被代理服務器返回的數據。該proxy_cache_path指令必須在HTTP上下文部分進行設置。 好比下面的例子中,咱們將配置一些相關的指令來創建緩存系統。 # http context proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=backcache:8m max_size=50m; proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args"; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; 用proxy_cache_path指令,首先應該已經定義在文件系統中但願存儲緩存的目錄。在這個例子中,選擇在/var/nginx/cache目錄。若是該目錄不存在,能夠用正確的權限和全部權建立它: mkdir -p /var/nginx/cache chown www /var/nginx/cache chmod 700 /var/nginx/cache levels=參數指定緩存將如何組織。 Nginx將經過散列鍵(下方配置)的值來建立一個緩存鍵。選擇了上述的levels決定了單個字符目錄(這是散列值的最後一個字符)配有兩個字符的子目錄 (下兩個字符取自散列值的末尾)將被建立。你一般沒必要對這個細節關注,但它能夠幫助Nginx快速找到相關的值。 keys_zone=參數定義緩存區域的名字,咱們稱之爲backcache。這也是咱們定義多少元數據存儲的地方。在這個例子裏,存儲8MB的key。對於每兆字節,Nginx可存儲8000左右的條目。 MAX_SIZE參數設置實際緩存數據的最大尺寸。 使用上面的另外一個指令是proxy_cache_key。這個設置將設置用於存儲緩存值的鍵。此鍵用於檢查是否一個請求能夠從高速緩存提供服務。將它設置成方案(http或https),HTTP請求方法, 以及被請求的主機和URI的組合。 proxy_cache_valid指令能夠被指定屢次。它依賴於狀態代碼值使咱們可以配置多長時間存儲。在咱們的例子中,咱們對於後端返回200和302存儲10分鐘,404響應的一分鐘過時。 如今,已經配置了緩存區,但仍然須要告訴Nginx何時使用緩存。在代理到後端的location位置,咱們能夠配置使用這個緩存: # server context location /proxy-me { proxy_cache backcache; proxy_cache_bypass $http_cache_control; add_header X-Proxy-Cache $upstream_cache_status; proxy_pass http://backend; } 使用proxy_cache指令,就能夠指定該backcache緩存區被用於這個位置。 Nginx會在這裏檢查傳遞給後端有效的條目。 上述proxy_cache_bypass指令被設置爲$ http_cache_control變量。這將包含一個指示器,用以指示該客戶端是否被明確地請求一個最新的,非緩存版本。設置此指令容許Nginx正確處理 這些類型的客戶端請求。無需進行進一步的配置。 此外還增長了被稱爲X-Proxy-Cache的額外頭,設置這個頭部爲$upstream_cache_status變量的值。這個設置頭能夠看到,若是請求致使高速緩存命中,高速緩存未命中,或者高速緩存被 明確旁路。這是對於調試特別有價值,也對客戶端是有用的信息。 =========================關於緩存結果的注意事項================================ 高速緩存可以極大地提升代理服務器的性能。不過,也須要明確的考慮配置緩存時候,要記住。 -> 首先,任何用戶相關的數據不該被高速緩存。這可能致使一個用戶的數據被呈現給其餘用戶。若是你的網站是徹底靜態的,這可能不是一個問題。 若是網站有一些動態元素,將不得不考慮到這一點。如何處理要看是什麼應用程序或服務器處理的後端處理。 對於私人的內容,應該設置Cache-Control頭爲「no-cache」,「no-sotre」,或者「private」依賴於數據的性質: no-cache: 請求: 告知緩存者,必須原本來本的轉發原始請求,並告知任何緩存者,須要去轉發請求,並驗證緩存(若是有的話).對應名詞:端對端重載. 響應: 容許緩存者緩存副本.那麼其實際價值是,老是強制緩存者,校驗緩存的新鮮度.一旦確認新鮮,則可使用緩存副本做爲響應。no-cache,還能夠指定某個包含字段, 好比一個典型應用,no-cache=Set-Cookie. 這樣作的結果,就是告知緩存者,對於Set-Cookie字段,你不要使用緩存內容.而是使用新滴.其餘內容則可使用緩存 no-store:表示在任什麼時候候收到的數據不被緩存。這對於私人數據是最安全,由於它意味着,該數據必須從服務器每次進行檢索。 private:這代表共享的緩存空間不能緩存此數據。這能夠用於指示用戶的瀏覽器高速緩存數據,但代理服務器不該當考慮隨後的請求數據有效。 public:這代表該響應是可在鏈接的任何點被高速緩存的公共數據。 一個相關的能夠控制此行爲報頭是max-age頭,其指示,任何資源應該緩存的秒數。 根據內容的敏感性,正確設置這些頭,會幫助你利用緩存優點,同時保持你的私人數據安全,並使您的動態數據最新。 若是後端也使用Nginx,你能夠設置使用過時指令,設置max-age來實現Cache-Control: location / { expires 60m; } location /check-me { expires -1; } 在上面的例子中,第一個塊容許緩存一個小時的內容。第二塊設置Cache-Control頭爲「無緩存」。要設置其餘值,可使用add_header指令,就像這樣: location /private { expires -1; add_header Cache-Control "no-store"; }
本機緩存配置(80端口轉8080,不使用ngx_cache_purge模塊)
1)nginx正常編譯安裝(不須要ngx_cache_purge模塊)。下載地址:http://nginx.org/en/download.html
[root@test ~]# yum install -y pcre pcre-devel openssl openssl-devel gcc
[root@test ~]# cd /data/software
[root@test software]# tar zxvf nginx-1.10.3.tar.gz
[root@test software]# cd nginx-1.10.3
[root@test nginx-1.10.3]# ./configure --prefix=/data/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
[root@test nginx-1.10.3]# make && make install
[root@test nginx-1.10.3]# /data/nginx/sbin/nginx
[root@test nginx-1.10.3]# ls /data/nginx/
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
2) 進行cache緩存配置。緩存文件在tomcat程序裏,即配置80代理到8080(tomcat程序端口)
[root@test nginx-1.10.3]# cat /data/nginx/conf/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; upstream backend_servers { server 127.00.0.1:8080; } proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=mycache:500m inactive=1h max_size=30g; server { listen 80; server_name localhost 192.168.1.19; #charset koi8-r; #access_log logs/host.access.log main; location = /apollo/1.html { root /usr/local/nginx/html; } location / { # root html; # index index.html index.htm; proxy_pass http://backend_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache mycache; proxy_cache_valid 200 304 12h; proxy_cache_valid any 1m; client_max_body_size 100m; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
[root@test nginx-1.10.3]# mkdir /data/nginx/proxy_cache //建立上面配置中的cache目錄,注意:這裏只是配置了一個cache路徑,temp路徑採用默認的。
[root@test nginx-1.10.3]# /data/nginx/sbin/nginx -t
nginx: the configuration file /data/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data/nginx/conf/nginx.conf test is successful
[root@test nginx-1.10.3]# /data/nginx/sbin/nginx -s reload
==============緩存效果測試===============
有上面能夠看出,80代理到8080的配置已經生效!下面看下緩存文件是否生成:
[root@test nginx-1.10.3]# ll /data/nginx/
total 40
drwx------ 2 nginx root 4096 Sep 1 17:54 client_body_temp
drwxr-xr-x 2 root root 4096 Sep 1 20:22 conf
drwx------ 2 nginx root 4096 Sep 1 17:54 fastcgi_temp
drwxr-xr-x 2 root root 4096 Sep 1 17:54 html
drwxr-xr-x 2 root root 4096 Sep 1 18:30 logs
drwxr-xr-x 6 nginx root 4096 Sep 1 20:22 proxy_cache
drwx------ 10 nginx root 4096 Sep 1 20:24 proxy_temp
drwxr-xr-x 2 root root 4096 Sep 1 18:01 sbin
drwx------ 2 nginx root 4096 Sep 1 17:54 scgi_temp
drwx------ 2 nginx root 4096 Sep 1 17:54 uwsgi_temp
[root@test nginx-1.10.3]# ll /data/nginx/proxy_cache/
total 16
drwx------ 3 nginx nginx 4096 Sep 1 20:22 2
drwx------ 4 nginx nginx 4096 Sep 1 20:22 7
drwx------ 3 nginx nginx 4096 Sep 1 19:48 8
drwx------ 3 nginx nginx 4096 Sep 1 19:48 f
[root@test nginx-1.10.3]# ll /data/nginx/proxy_temp/ #默認的temp目錄
total 32
drwx------ 3 nginx nginx 4096 Sep 1 19:48 1
drwx------ 3 nginx nginx 4096 Sep 1 19:48 2
drwx------ 3 nginx nginx 4096 Sep 1 19:48 3
drwx------ 3 nginx nginx 4096 Sep 1 20:22 4
drwx------ 3 nginx nginx 4096 Sep 1 20:22 5
drwx------ 3 nginx nginx 4096 Sep 1 20:22 6
drwx------ 3 nginx nginx 4096 Sep 1 20:23 7
drwx------ 3 nginx nginx 4096 Sep 1 20:24 8
能夠看出,緩存文件已經生成!要是清理緩存的話,就清空上面兩個目錄便可!
========================================================================
再看下結合purge模塊的緩存配置: [root@storage01 ~]# cat /data/nginx/conf/nginx.conf #user nobody; worker_processes 4; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; charset utf-8; log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_cookie" $host $request_time'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; proxy_temp_path /data/nginx/proxy_temp; proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=mycache:500m inactive=1d max_size=30g; client_header_timeout 600s; client_body_timeout 600s; client_max_body_size 50m; client_body_buffer_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; gzip_vary on; include vhosts/*.conf; } [root@storage01 ~]# mkdir proxy_cache [root@storage01 ~]# mkdir proxy_temp [root@storage01 ~]# chown -R nginx.nginx proxy_cache [root@storage01 ~]# chown -R nginx.nginx proxy_temp [root@storage01 ~]# chmod -R 777 proxy_cache [root@storage01 ~]# chmod -R 777 proxy_temp [root@storage01 ~]# cat /data/nginx/conf/vhosts/cache.conf upstream backend_servers { server 127.0.0.1:8080; } server { listen 80; server_name localhost 192.168.1.25; access_log /data/nginx/logs/80-access.log main; error_log /data/nginx/logs/80-error.log; location / { # root html; # index index.html index.htm; proxy_pass http://backend_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache mycache; proxy_cache_valid 200 304 12h; proxy_cache_valid any 1m; proxy_cache_key $host$uri$is_args$args; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /purge(/.*) { allow all ; proxy_cache_purge mycache $host$1$is_args$args ; error_page 405 =200 /purge$1; } } 訪問http://192.168.1.25/storage/ 反向代理到 http://192.168.1.25:8080/storage/ 清理緩存的正確方式:http://192.168.1.25/purge/storage/