Nginx詳解-伺服器叢集 原文章位址:http://www.cnblogs.com/jiekzou/p/4486447.html
Nginx是什麼
代理伺服器:一般是指區域網路内部的機器通過代理伺服器發送請求到網際網路上的伺服器,代理伺服器一般作用在用戶端。應用比如:GoAgent,FQ神器.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcNTSU1EeVdVYxZFWlFTOtVmdRhlW1VTaitmTzkVdjJjYzpkMMZ3bENGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3P4EDM3UjMwMjM5ITMxQTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
一個完整的代理請求過程為:用戶端首先與代理伺服器建立連接配接,接着根據代理伺服器所使用的代理協定,請求對目标伺服器建立連接配接、或者獲得目标伺服器的指定資源。 Web代理(proxy)伺服器是網絡的中間實體。 代理位于Web用戶端和Web伺服器之間,扮演“中間人”的角色。HTTP的代理伺服器即是Web伺服器又是Web用戶端。
代理伺服器是介于用戶端和Web伺服器之間的另一台伺服器,有了它之後,浏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器送出請求,信号會先送到代理伺服器,由代理伺服器來取回浏覽器所需要的資訊并傳送給你的浏覽器。
正向代理 :是一個位于用戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。用戶端必須要進行一些特别的設定才能使用正向代理。
反向代理伺服器:在伺服器端接受用戶端的請求,然後把請求分發給具體的伺服器進行處理,然後再将伺服器的響應結果回報給用戶端。Nginx就是其中的一種反向代理伺服器軟體。
Nginx:Nginx ("engine x") ,Nginx (“engine x”) 是俄羅斯人Igor Sysoev(塞索耶夫)編寫的一款高性能的 HTTP 和反向代理伺服器。也是一個IMAP/POP3/SMTP代理伺服器;也就是說,Nginx本身就可以托管網站,進行HTTP服務處理,也可以作為反向代理伺服器使用。
說明:用戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP位址,還有代理程式的端口。
反向代理正好與正向代理相反,對于用戶端而言代理伺服器就像是原始伺服器,并且用戶端不需要進行任何特别的設定。用戶端向反向代理的命名空間(name-space)中的内容發送普通請求,接着反向代理将判斷向何處(原始伺服器)轉交請求,并将獲得的内容傳回給用戶端。
使用者A始終認為它通路的是原始伺服器B而不是代理伺服器Z,但實用際上反向代理伺服器接受使用者A的應答,從原始資源伺服器B中取得使用者A的需求資源,然後發送給使用者A。由于防火牆的作用,隻允許代理伺服器Z通路原始資源伺服器B。盡管在這個虛拟的環境下,防火牆和反向代理的共同作用保護了原始資源伺服器B,但使用者A并不知情。
Nginx的應用現狀
Nginx 已經在俄羅斯最大的門戶網站── Rambler Media(www.rambler.ru)上運作了3年時間,同時俄羅斯超過20%的虛拟主機平台采用Nginx作為反向代理伺服器。在國内,已經有 淘寶、新浪部落格、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社群、豆瓣、YUPOO、海内、迅雷線上 等多家網站使用 Nginx 作為Web伺服器或反向代理伺服器。
Nginx的特點
- 跨平台:Nginx 可以在大多數 Unix like OS編譯運作,而且也有Windows的移植版本。
- 配置異常簡單:非常容易上手。配置風格跟程式開發一樣,神一般的配置
- 非阻塞、高并發連接配接:資料複制時,磁盤I/O的第一階段是非阻塞的。官方測試能夠支撐5萬并發連接配接,在實際生産環境中跑到2~3萬并發連接配接數.(這得益于Nginx使用了最新的epoll模型)
- 事件驅動:通信機制采用epoll模型,支援更大的并發連接配接。
Nginx的事件處理機制
對于一個基本的web伺服器來說,事件通常有三種類型,網絡事件、信号、定時器。
首先看一個請求的基本過程:建立連接配接---接收資料---發送資料 。
再次看系統底層的操作 :上述過程(建立連接配接---接收資料---發送資料)在系統底層就是讀寫事件。
1)如果采用阻塞調用的方式,當讀寫事件沒有準備好時,必然不能夠進行讀寫事件,那麼久隻好等待,等事件準備好了,才能進行讀寫事件。那麼請求就會被耽擱 。阻塞調用會進入核心等待,cpu就會讓出去給别人用了,對單線程的worker來說,顯然不合适,當網絡事件越多時,大家都在等待呢,cpu空閑下來沒人用,cpu使用率自然上不去了,更别談高并發了 。
2)既然沒有準備好阻塞調用不行,那麼采用非阻塞方式。非阻塞就是,事件,馬上傳回EAGAIN, 告訴你,事件還沒準備好呢,你慌什麼,過會再來吧。好吧,你過一會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然後再 來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀态,你可以做更多的事情了,但帶來的開銷也是不小的
小結:非阻塞通過不斷檢查事件的狀态來判斷是否進行讀寫操作,這樣帶來的開銷很大。
3)是以才有了異步非阻塞的事件處理機制。具體到系統調用就是像select/poll/epoll/kqueue這樣的系統調用。他們提供了一種機制,讓你可以同時監控多個事件,調用他們是阻塞的,但可以設定逾時時間,在逾時時間之内,如果有事件準備好了,就傳回。這種機制解決了我們上面兩個問題。
以epoll為例:當事件沒有準備好時,就放入epoll(隊列)裡面。如果有事件準備好了,那麼就去處理;如果事件傳回的是EAGAIN,那麼繼續将其放入epoll裡面。進而,隻要有事件準備好了,我們就去處理她,隻有當所有時間都沒有準備好時,才在epoll裡 面等着。這樣,我們就可以并發處理大量的并發了,當然,這裡的并發請求,是指未處理完的請求,線程隻有一個,是以同時能處理的請求當然隻有一個了,隻是在 請求間進行不斷地切換而已,切換也是因為異步事件未準備好,而主動讓出的。這裡的切換是沒有任何代價,你可以了解為循環處理多個準備好的事件,事實上就是 這樣的。
4)與多線程的比較:
與多線程相比,這種事件處理方式是有很大的優勢的,不需要建立線程,每個請求占用的記憶體也很少,沒有上下文切換,事件處理非常的輕量級。并發數再多也不會導緻無謂的資源浪費(上下文切換)。
小結:通過異步非阻塞的事件處理機制,Nginx實作由程序循環處理多個準備好的事件,進而實作高并發和輕量級。
master/worker結構:一個master程序,生成一個或多個worker程序
記憶體消耗小:處理大并發的請求記憶體消耗非常小。在3萬并發連接配接下,開啟的10個Nginx 程序才消耗150M記憶體(15M*10=150M) 成本低廉:Nginx為開源軟體,可以免費使用。而購買F5 BIG-IP、NetScaler等硬體負載均衡交換機則需要十多萬至幾十萬人民币
内置的健康檢查功能:如果 Nginx Proxy 後端的某台 Web 伺服器當機了,不會影響前端通路。
節省帶寬:支援 GZIP 壓縮,可以添加浏覽器本地緩存的 Header 頭。
穩定性高:用于反向代理,當機的機率微乎其微
Nginx的不為人知的特點
1、nginx代理和後端web伺服器間無需長連接配接;
2、接收使用者請求是異步的,即先将使用者請求全部接收下來,再一次性發送後後端web伺服器,極大的減輕後端web伺服器的壓力
3、發送響應封包時,是邊接收來自後端web伺服器的資料,邊發送給用戶端的
4、網絡依賴型低。NGINX對網絡的依賴程度非常低,理論上講,隻要能夠ping通就可以實施負載均衡,而且可以有效區分内網和外網流量
5、支援伺服器檢測。NGINX能夠根據應用伺服器處理頁面傳回的狀态碼、逾時資訊等檢測伺服器是否出現故障,并及時傳回錯誤的請求重新送出到其它節點上
Nginx的内部(程序)模型
nginx是以多程序的方式來工作的,當然nginx也是支援多線程的方式的,隻是我們主流的方式還是多程序的方式,也是nginx的預設方式。nginx采用多程序的方式有諸多好處 .
(1) nginx在啟動後,會有一個master程序和多個worker程序。master程序主要用來管理worker程序,包含:接收來自外界的信号,向各worker程序發送信号,監控 worker程序的運作狀态,當worker程序退出後(異常情況下),會自動重新啟動新的worker程序。而基本的網絡事件,則是放在worker程序中來處理了 。多個worker程序之間是對等的,他們同等競争來自用戶端的請求,各程序互相之間是獨立的 。一個請求,隻可能在一個worker程序中處理,一個worker程序,不可能處理其它程序的請求。 worker程序的個數是可以設定的,一般我們會設定與機器cpu核數一緻,這裡面的原因與nginx的程序模型以及事件處理模型是分不開的 。
(2)Master接收到信号以後怎樣進行處理(./nginx -s reload )?首先master程序在接到信号後,會先重新加載配置檔案,然後再啟動新的程序,并向所有老的程序發送信号,告訴他們可以光榮退休了。新的程序在啟動後,就開始接收新的請求,而老的程序在收到來自master的信号後,就不再接收新的請求,并且在目前程序中的所有未處理完的請求處理完成後,再退出 .
(3) worker程序又是如何處理請求的呢?我們前面有提到,worker程序之間是平等的,每個程序,處理請求的機會也是一樣的。當我們提供80端口的http服務時,一個連接配接請求過來,每個程序都有可能處理這個連接配接,怎麼做到的呢?首先,每個worker程序都是從master程序fork過來,在master程序裡面,先建立好需要listen的socket之後,然後再fork出多個worker程序,這樣每個worker程序都可以去accept這個socket(當然不是同一個socket,隻是每個程序的這個socket會監控在同一個ip位址與端口,這個在網絡協定裡面是允許的)。一般來說,當一個連接配接進來後,所有在accept在這個socket上面的程序,都會收到通知,而隻有一個程序可以accept這個連接配接,其它的則accept失敗,這是所謂的驚群現象。當然,nginx也不會視而不見,是以nginx提供了一個accept_mutex這個東西,從名字上,我們可以看這是一個加在accept上的一把共享鎖。有了這把鎖之後,同一時刻,就隻會有一個程序在accpet連接配接,這樣就不會有驚群問題了。accept_mutex是一個可控選項,我們可以顯示地關掉,預設是打開的。當一個worker程序在accept這個連接配接之後,就開始讀取請求,解析請求,處理請求,産生資料後,再傳回給用戶端,最後才斷開連接配接,這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由worker程序來處理,而且隻在一個worker程序中處理。
(4):,nginx采用這種程序模型有什麼好處呢?采用獨立的程序,可以讓互相之間不會影響,一個程序退出後,其它程序還在工作,服務不會中斷,master程序則很快重新啟動新的worker程序。當然,worker程序的異常退出,肯定是程式有bug了,異常退出,會導緻目前worker上的所有請求失敗,不過不會影響到所有請求,是以降低了風險。當然,好處還有很多,大家可以慢慢體會。
(5).有人可能要問了,nginx采用多worker的方式來處理請求,每個worker裡面隻有一個主線程,那能夠處理的并發數很有限啊,多少個worker就能處理多少個并發,何來高并發呢?非也,這就是nginx的高明之處,nginx采用了異步非阻塞的方式來處理請求,也就是說,nginx是可以同時處理成千上萬個請求的 .對于IIS伺服器每個請求會獨占一個工作線程,當并發數上到幾千時,就同時有幾千的線程在處理請求了。這對作業系統來說,是個不小的挑戰,線程帶來的記憶體占用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不去了,而這些開銷完全是沒有意義的。我們之前說過,推薦設定worker的個數為cpu的核數,在這裡就很容易了解了,更多的worker數,隻會導緻程序來競争cpu資源了,進而帶來不必要的上下文切換。而且,nginx為了更好的利用多核特性,提供了cpu親緣性的綁定選項,我們可以将某一個程序綁定在某一個核上,這樣就不會因為程序的切換帶來cache的失效
Nginx是如何處理一個請求
首先,nginx在啟動時,會解析配置檔案,得到需要監聽的端口與ip位址,然後在nginx的master程序裡面,先初始化好這個監控的socket(建立socket,設定addrreuse等選項,綁定到指定的ip位址端口,再listen),然後再fork(一個現有程序可以調用fork函數建立一個新程序。由fork建立的新程序被稱為子程序 )出多個子程序出來,然後子程序會競争accept新的連接配接。此時,用戶端就可以向nginx發起連接配接了。當用戶端與nginx進行三次握手,與nginx建立好一個連接配接後,此時,某一個子程序會accept成功,得到這個建立好的連接配接的socket,然後建立nginx對連接配接的封裝,即ngx_connection_t結構體。接着,設定讀寫事件處理函數并添加讀寫事件來與用戶端進行資料的交換。最後,nginx或用戶端來主動關掉連接配接,到此,一個連接配接就壽終正寝了。
當然,nginx也是可以作為用戶端來請求其它server的資料的(如upstream子產品),此時,與其它server建立的連接配接,也封裝在ngx_connection_t中。作為用戶端,nginx先擷取一個ngx_connection_t結構體,然後建立socket,并設定socket的屬性( 比如非阻塞)。然後再通過添加讀寫事件,調用connect/read/write來調用連接配接,最後關掉連接配接,并釋放ngx_connection_t。
說明:nginx在實作時,是通過一個連接配接池來管理的,每個worker程序都有一個獨立的連接配接池,連接配接池的大小是worker_connections。這裡的連接配接池裡面儲存的其實不是真實的連接配接,它隻是一個worker_connections大小的一個ngx_connection_t結構的數組。并且,nginx會通過一個連結清單free_connections來儲存所有的空閑ngx_connection_t,每次擷取一個連接配接時,就從空閑連接配接連結清單中擷取一個,用完後,再放回空閑連接配接連結清單裡面。
在這裡,很多人會誤解worker_connections這個參數的意思,認為這個值就是nginx所能建立連接配接的最大值。其實不然,這個值是表示每個worker程序所能建立連接配接的最大值,是以,一個nginx能建立的最大連接配接數,應該是worker_connections * worker_processes。當然,這裡說的是最大連接配接數,對于HTTP請求本地資源來說,能夠支援的最大并發數量是worker_connections * worker_processes,而如果是HTTP作為反向代理來說,最大并發數量應該是worker_connections * worker_processes/2。因為作為反向代理伺服器,每個并發會建立與用戶端的連接配接和與後端服務的連接配接,會占用兩個連接配接。
Nginx典型的應用場景
負載均衡技術在現有網絡結構之上提供了一種廉價、有效、透明的方法,來擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的 靈活性和可用性。它有兩方面的含義:首先,大量的并發通路或資料流量分擔到多台節點裝置上分别處理,減少使用者等待響應的時間;其次,單個重負載的運算分擔 到多台節點裝置上做并行處理,每個節點裝置處理結束後,将結果彙總,傳回給使用者,系統處理能力得到大幅度提高
Nginx的應用
1、到官網下載下傳Windows版本,下載下傳位址:http://nginx.org/en/download.html
2、解壓到磁盤任一目錄
3、修改配置檔案:具體參考備注。
4、啟動服務:直接運作nginx.exe,缺點控制台視窗關閉,服務關閉。守護程序的方式啟動:start nginx.exe
5、停止服務:nginx -s stop
重新加載配置:nginx -s reload
Nginx常見配置說明
worker_processes 8;
#nginx程序數,建議設定為等于CPU總核心數
worker_connections 65535;
#單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)
client_header_buffer_size 32k; #上傳檔案大小限制
large_client_header_buffers 4 64k; #設定請求緩
client_max_body_size 8m; #設定請求緩
autoindex on; #開啟目錄清單通路,合适下載下傳伺服器,預設關閉。
tcp_nopush on; #防止網絡阻塞
tcp_nodelay on; #防止網絡阻塞
keepalive_timeout 120; #長連接配接逾時時間,機關是秒
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮檔案大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
upstream blog.ha97.com {
#upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被配置設定到的幾率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虛拟主機的配置
server
{
#監聽端口
listen 80;
#域名可以有多個,用空格隔開
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
子產品參數
#定義Nginx運作的使用者和使用者組
user www www;
#nginx程序數,建議設定為等于CPU總核心數。
worker_processes 8;
#全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log ar/loginx/error.log info;
#程序檔案
pid ar/runinx.pid;
#一個nginx程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(系統的值ulimit -n)與nginx程序數相除,但是nginx配置設定請求并不均勻,
是以建議與ulimit -n的值保持一緻。
worker_rlimit_nofile 65535;
#工作模式與連接配接數上限
events
{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本核心中的高性能網絡I/O模型,
如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)
worker_connections 65535;
}
#設定http伺服器
http
{
include mime.types; #檔案擴充名與檔案類型映射表
default_type application/octet-stream; #預設檔案類型
#charset utf-8; #預設編碼
server_names_hash_bucket_size 128; #伺服器名字的hash表大小
client_header_buffer_size 32k; #上傳檔案大小限制
large_client_header_buffers 4 64k; #設定請求緩
client_max_body_size 8m; #設定請求緩
sendfile on; #開啟高效檔案傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出檔案,對于普通應用設為 on,如果用來進行下載下傳等應用磁盤IO重負載應用,
可設定為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖檔顯示不正常把這個改成off。
autoindex on; #開啟目錄清單通路,合适下載下傳伺服器,預設關閉。
tcp_nopush on; #防止網絡阻塞
tcp_nodelay on; #防止網絡阻塞
keepalive_timeout 120; #長連接配接逾時時間,機關是秒
#FastCGI相關參數是為了改善網站的性能:減少資源占用,提高通路速度。下面參數看字面意思都能了解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip子產品設定
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮檔案大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;
#壓縮類型,預設就已經包含textml,是以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連接配接數的時候需要使用
upstream blog.ha97.com {
#upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被配置設定到的幾率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虛拟主機的配置
server
{
#監聽端口
listen 80;
#域名可以有多個,用空格隔開
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖檔緩存時間設定
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS緩存時間設定
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式設定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛拟主機的通路日志
access_log ar/loginx/ha97access.log access;
#對 "/" 啟用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#後端的Web伺服器可以通過X-Forwarded-For擷取使用者真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選。
proxy_set_header Host $host;
client_max_body_size 10m; #允許用戶端請求的最大單檔案位元組數
client_body_buffer_size 128k; #緩沖區代理緩沖使用者端請求的最大位元組數,
proxy_connect_timeout 90; #nginx跟後端伺服器連接配接逾時時間(代理連接配接逾時)
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理發送逾時)
proxy_read_timeout 90; #連接配接成功後,後端伺服器響應時間(代理接收逾時)
proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩沖區大小
proxy_buffers 4 32k; #proxy_buffers緩沖區,網頁平均在32k以下的設定
proxy_busy_buffers_size 64k; #高負荷下緩沖大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#設定緩存檔案夾大小,大于這個值,将從upstream伺服器傳
}
#設定檢視Nginx狀态的位址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd檔案的内容可以用apache提供的htpasswd工具來産生。
}
#本地動靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
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_pass http://127.0.0.1:8080;
}
#所有靜态檔案由nginx直接讀取不經過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}
更詳細的子產品參數請參考:http://wiki.nginx.org/Main
案例
配置靜态資源
location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
{
expires 30d;
root /nginx-1.4.7;#root:
break;
}