概述:
Nginx的代碼是由一個核心和一系列的子產品組成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用于啟用網絡協定,建立必要的運作時環境以及確定不同的子產品之間平滑地進行互動。不過,大多跟協定相關的功能和某應用特有的功能都是由nginx的子產品實作的。這些功能子產品大緻可以分為事件子產品、階段性處理器、輸出過濾器、變量處理器、協定、upstream和負載均衡幾個類别,這些共同組成了nginx的http功能。事件子產品主要用于提供OS獨立的(不同作業系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協定子產品則負責實作nginx通過http、tls/ssl、smtp、pop3以及imap與對應的用戶端建立會話。
Nginx的核心子產品為Main和Events,此外還包括标準HTTP子產品、可選HTTP子產品和郵件子產品,其還可以支援諸多第三方子產品。Main用于配置錯誤日志、程序及權限等相關的參數,Events用于配置IO模型,如epoll、kqueue、select或poll等,它們是必備子產品。
1.安裝配置nginx反向代理伺服器:
系統環境:Centos 6.4 x86_64
軟體版本:nginx-1.5.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>[root@localhost ~]</code><code># groupadd -r nginx</code>
<code>[root@localhost ~]</code><code># useradd -r -g nginx nginx</code>
<code>[root@localhost ~]</code><code># tar zxvf nginx-1.5.2.tar.gz</code>
<code>[root@localhost ~]</code><code># cd nginx-1.5.2</code>
<code>[root@localhost nginx-1.5.2]</code><code># mkdir /var/tmp/ngnix/client -p</code>
<code>[root@localhost nginx-1.5.2]</code><code># ./configure \</code>
<code>> --prefix=</code><code>/usr/local/nginx</code> <code>\</code>
<code>> --sbin-path=</code><code>/usr/sbin/nginx</code> <code>\</code>
<code>> --conf-path=</code><code>/etc/nginx/nginx</code><code>.conf \</code>
<code>> --error-log-path=</code><code>/var/log/nginx/error</code><code>.log \</code>
<code>> --http-log-path=</code><code>/var/log/nginx/access</code><code>.log \</code>
<code>> --pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid \</code>
<code>> --lock-path=</code><code>/var/lock/nginx</code><code>.lock \</code>
<code>> --user=nginx \</code>
<code>> --group=nginx \</code>
<code>> --with-http_ssl_module \</code>
<code>> --with-http_flv_module \</code>
<code>> --with-http_stub_status_module \</code>
<code>> --with-http_gzip_static_module \</code>
<code>> --http-client-body-temp-path=</code><code>/var/tmp/nginx/client/</code> <code>\</code>
<code>> --http-proxy-temp-path=</code><code>/var/tmp/nginx/proxy/</code> <code>\</code>
<code>> --http-fastcgi-temp-path=</code><code>/var/tmp/nginx/fcgi/</code> <code>\</code>
<code>> --http-uwsgi-temp-path=</code><code>/var/tmp/nginx/uwsgi</code> <code>\</code>
<code>> --http-scgi-temp-path=</code><code>/var/tmp/nginx/scgi</code> <code>\</code>
<code>> --with-pcre</code>
<code>[root@localhost nginx-1.5.2]</code><code># make; make install</code>
2.啟動nginx服務:
<code>[root@localhost ~]</code><code># nginx</code>
<code>[root@localhost ~]</code><code># ps aux | grep nginx</code>
<code>root 13089 0.0 0.0 55152 1776 ? Ss 10:52 0:00 nginx: master process nginx</code>
<code>nginx 13194 0.0 0.0 55552 2144 ? S 11:20 0:00 nginx: worker process</code>
<code>nginx 13195 0.0 0.0 55348 1544 ? S 11:20 0:00 nginx: cache manager process</code>
<code>root 13238 0.0 0.0 103248 824 pts</code><code>/0</code> <code>S+ 11:31 0:00 </code><code>grep</code> <code>nginx</code>
3.編輯/etc/nginx/nginx.conf
http字段中添加:
<code>upstream static {</code>
<code> </code><code>server 192.168.30.116 weight=1;</code>
<code>}</code>
<code> </code><code>proxy_cache_path </code><code>/data/nginx/cache</code> <code>levels=1:2 keys_zone=one:10m inactive=24h max_size=1g;</code>
upstream子產品
與proxy子產品結合使用的子產品中,最常用的當屬upstream子產品。upstream子產品可定義一個新的上下文,它包含了一組寶島upstream伺服器,這些伺服器可能被賦予了不同的權重、不同的類型甚至可以基于維護等原因被标記為down。
upstream子產品常用的指令有:
ip_hash:基于用戶端IP位址完成請求的分發,它可以保證來自于同一個用戶端的請求始終被轉發至同一個upstream伺服器;
keepalive:每個worker程序為發送到upstream伺服器的連接配接所緩存的個數;
least_conn:最少連接配接排程算法;
server:定義一個upstream伺服器的位址,還可包括一系列可選參數,如:
weight:權重;
max_fails:最大失敗連接配接次數,失敗連接配接的逾時時長由fail_timeout指定;
fail_timeout:等待請求的目标伺服器發送響應的時長;
backup:用于fallback的目的,所有服務均故障時才啟動此伺服器;
down:手動标記其不再處理任何請求;
proxy_cache_path:定義一個用記儲存緩存響應封包的目錄,及一個儲存緩存對象的鍵及響應中繼資料的共享記憶體區域(keys_zone=name:size),其可選參數有:
levels:每級子目錄名稱的長度,有效值為1或2,每級之間使用冒号分隔,最多為3級;
inactive:非活動緩存項從緩存中剔除之前的最大緩存時長;
max_size:緩存空間大小的上限,當需要緩存的對象超出此空間限定時,緩存管理器将基于LRU算法對其進行清理;
loader_files:緩存加載器(cache_loader)的每次工作過程最多為多少個檔案加載中繼資料;
loader_sleep:緩存加載器的每次疊代工作之後的睡眠時長;
loader_threashold:緩存加載器的最大睡眠時長;
例如: proxy_cache_path /data/nginx/cache/one levels=1 keys_zone=one:10m;
proxy_cache_path /data/nginx/cache/two levels=2:2 keys_zone=two:100m;
proxy_cache_path /data/nginx/cache/three levels=1:1:2 keys_zone=three:1000m;
然後在server中location字段中添加:
<code>location / {</code>
<code> </code><code>proxy_pass http:</code><code>//static</code><code>;</code>
<code> </code><code>proxy_set_header Host $host;</code>
<code> </code><code>proxy_cache one;</code>
<code> </code><code>proxy_cache_valid 200 1d;</code>
<code> </code><code>proxy_cache_valid 301 302 10m;</code>
<code> </code><code>proxy_cache_valid any 1m;</code>
<code> </code><code>proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;</code>
<code> </code><code>add_header X-Via $server_addr;</code>
<code> </code><code>add_header X-Cache-status $upstream_cache_status;</code>
<code> </code><code>}</code>
nginx做為反向代理時,能夠将來自upstream的響應緩存至本地,并在後續的用戶端請求同樣内容時直接從本地構造響應封包。
proxy_cache zone|off:定義一個用于緩存的共享記憶體區域,其可被多個地方調用;緩存将遵從upstream伺服器的響應封包首部中關于緩存的設定,如 "Expires"、"Cache-Control: no-cache"、 "Cache-Control: max-age=XXX"、"private"和"no-store" 等,但nginx在緩存時不會考慮響應封包的"Vary"首部。為了確定私有資訊不被緩存,所有關于使用者的私有資訊可以upstream上通過"no-cache" or "max-age=0"來實作,也可在nginx設定proxy_cache_key必須包含使用者特有資料如$cookie_xxx的方式實作,但最後這種方式在公共緩存上使用可能會有風險。是以,在響應封包中含有以下首部或指定标志的封包将不會被緩存。
Set-Cookie
Cache-Control containing "no-cache", "no-store", "private", or a "max-age" with a non-numeric or 0 value
Expires with a time in the past
X-Accel-Expires: 0
proxy_cache_key:設定在存儲及檢索緩存時用于“鍵”的字元串,可以使用變量為其值,但使用不當時有可能會為同一個内容緩存多次;另外,将使用者私有資訊用于鍵可以避免将使用者的私有資訊傳回給其它使用者;
proxy_cache_lock:啟用此項,可在緩存未指令中阻止多個相同的請求同時發往upstream,其生效範圍為worker級别;
proxy_cache_lock_timeout:proxy_cache_lock功能的鎖定時長;
proxy_cache_min_uses:某響應封包被緩存之前至少應該被請求的次數;
proxy_cache_use_stale:在無法聯系到upstream伺服器時的哪種情形下(如error、timeout或http_500等)讓nginx使用本地緩存的過期的緩存對象直接響應用戶端請求;其格式為:
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off
proxy_cache_valid [ code ...] time:用于為不同的響應設定不同時長的有效緩存時長,例如:proxy_cache_valid 200 302 10m;
proxy_cache_methods [GET HEAD POST]:為哪些請求方法啟用緩存功能;
proxy_cache_bypass string:設定在哪種情形下,nginx将不從緩存中取資料;例如:
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
add_header 用于自定義http響應封包内容,這裡用于查詢是否命中緩存;
4.建立nginx緩存目錄,并重新開機nginx:
<code>[root@localhost ~]</code><code># mkdir /data/nginx/cache -p</code>
<code>[root@localhost ~]</code><code># nginx -s reload</code>
5.檢測緩存是否命中:
<code>[root@localhost ~]</code><code># curl -I http://192.168.30.115/index.html</code>
<code>HTTP</code><code>/1</code><code>.1 200 OK</code>
<code>Server: nginx</code><code>/1</code><code>.5.2</code>
<code>Date: Mon, 24 Mar 2014 03:39:44 GMT</code>
<code>Content-Type: text</code><code>/html</code>
<code>Content-Length: 7</code>
<code>Connection: keep-alive</code>
<code>Last-Modified: Mon, 24 Mar 2014 03:22:07 GMT</code>
<code>ETag: </code><code>"532fa4df-7"</code>
<code>X-Via: 192.168.30.115</code>
<code>X-Cache-status: HIT</code>
<code>Accept-Ranges: bytes</code>
<code>[root@localhost ~]</code><code># ls /data/nginx/cache/c/33/</code>
<code>71c50b7fc36aaac8ea9ebc87ae37a33c</code>
看到X-Cache-status 字段位HIT,是從後端主機192.168.30.115的内容,命中成功。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1382132,如需轉載請自行聯系原作者