#### # nginx設置靜態資源壓縮和過期時間設置
可以通過Nginx對服務器上的靜態資源進行過期時間設置和對資源進行壓縮傳輸來減少服務器的帶寬開銷。
以下是nginx對靜態資源過期時間的設置方法:
location ~* .(ico|gif|bmp|jpg|jpeg|png|swf|js|css|mp3) {
root /var/www/opkeep;
expires 30d;
}
上面的配置可以對ico,gif,bmp,jpg,jpeg,swf,js,css,mp3文件進行本地緩存,不用每次訪問都重新從服務器獲取。
壓縮的配置如下:
gzip on;
gzip_min_length 1000;
gzip_buffers 4 8k;
gzip_types text/plain application/x-javascript text/css;
對文本、js和css文件進行壓縮,一般情況下,壓縮后的大小是原始大小的25%,甚至更小。
#### nginx緩存服務器加強版
因為后端服務器經常發生503錯誤,所以服務不能保證,為了避免訪問錯誤,可以在緩存服務器上做調整。一個特性是,如果緩存過期,但訪問后端服務器又不能返回正常的內容,則使用緩存內容,保證服務質量。
Nginx里面可以增加一條這個:
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; 語法: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;
默認值:
proxy_cache_use_stale off;
上下文: http, server, location
如果后端服務器出現狀況,nginx是可以使用過期的響應緩存的。這條指令就是定義何種條件下允許開啟此機制。這條指令的參數與proxy_next_upstream指令的參數相同。
此外,updating參數允許nginx在正在更新緩存的情況下使用過期的緩存作為響應。這樣做可以使更新緩存數據時,訪問源服務器的次數最少。在植入新的緩存條目時,如果想使訪問源服務器的次數最少,可以使用proxy_cache_lock指令。
#### nginx緩存頁面后,串會話問題的解決方案 估計zxtm也合適
Nginx支持頁面緩存,之前我的博客有介紹配置方案,昨天出了一個詭異的問題,別人的機器登錄后,我的機器打開應用的首頁會出現別人的用戶信息,也就是說我的瀏覽器訪問的應用會話其實是別人的會話。
經檢查,nginx會把響應頁面的頭信息也一起緩存,包括set-Cookie,導致后面訪問頁面的用戶的cookie被設置成緩存的頭。
解決方案,nginx提供proxy_hide_header的指令,可以去掉相關的響應頭信息:
proxy_hide_header Set-Cookie;
結論:配置后,串會話的問題不再出現
### nginx緩存配置實例
以下配置摘自OSChina.Net官方網站的聯通節點配置
#緩存存放路徑
proxy_cache_path /disk2/cache/data levels=1:2 keys_zone=static:1000m inactive=600m max_size=100G;
proxy_temp_path /disk2/cache/temp;
location ~ ^/(img|css|js|uploads)/ {
proxy_buffering on;
proxy_cache static;
proxy_cache_key "$host$request_uri$is_args$args";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_cache_min_uses 1;
proxy_cache_valid 200 302 304 5m;
proxy_cache_use_stale http_502 http_503 http_504;
proxy_hide_header set-Cookie;
proxy_pass http://xxx.xxx.xxx.xxx;
include proxy.conf;
}
proxy.conf配置
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
gzip.conf配置
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/x-javascript;
### Nginx Location詳細規則說明
Nginx大家都知道, 但是很多人能了解到常用的location指令的優先級別是怎么樣的,這個也許知道的人就不多了吧. 先前記得有個國人說過一個nginx的“bug”(), 就是關于location配置不當造成的, 這其實并不是nginx的bug, 而是運維人員的對nginx配置location優先級別理解不很透徹造成的.
nginx官方已經指明了location指令說明:
syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
default: —
context: server, location
讓我們先來理解下, nginx 規則處理請求是在對路徑匹配在URI規范化以后進行. 所謂規范化, 就是先將URI中形如“%XX”的編碼字符進行解碼, 再解析URI中的相對路徑“.”和“..”部分, 另外還可能會壓縮相鄰的兩個或多個斜線成為一個斜線:
= 開頭表示精確匹配, 必須完全吻合才會執行;
^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url 路徑即可, 如果最大前綴匹配的路徑以“^~”開始,那么nginx不再檢查正則表達式. nginx不對url做編碼,因此請求為/assets/20%/css.css,可以被規則^~ /assets/ /css.css匹配到(注意是空格);
~ 開頭表示區分大小寫的正則匹配;
~* 開頭表示不區分大小寫的正則匹配, 與~相反是大小寫同等對待的;
/ 通用匹配, 如果沒有其它匹配,任何請求都會匹配到.
優先級別基本可以這么認為:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~* 正則) > (location 路徑) > (/)