原文發表於cu:2016-08-25php
參考文檔:html
本文針對Nginx幾個經常使用特性作簡單驗證(高手請略過),經過簡單的驗證熟悉配置。nginx
CentOS-7-x86_64-Everything-1511web
Nginx-1.11.3: http://nginx.org/download/nginx-1.11.3.tar.gz 正則表達式
安裝配置請見:http://www.javashuo.com/article/p-zogfgooc-e.html算法
web1: vim
[root@e84e8f6ba866 ~]# echo "<h1>Welcome to test site web1!</h1>" > /usr/local/nginx/html/index.html 後端
web2: 瀏覽器
[root @56f610597bcd ~]# echo "<h1>Welcome to test site web2!</h1>" > /usr/local/nginx/html/index.html 緩存
指令:proxy_pass
語法:proxy_pass URL
使用字段:location字段
#URL能夠是被代理服務器的ip地址,ip地址+端口或者被映射的url
#被代理服務器暫時設置web1; #重要:從新加載nginx配置文件,從新加載以前能夠經過」 /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf」測試配置文件修改是否正確 [root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf location / { proxy_pass http://172.19.200.241; } [root@localhost conf]# service nginx reload
方式1:經過瀏覽器訪問代理服務器,返回結果是web1的測試頁面,以下:
方式2:經過curl命令訪問代理服務器,返回結果是web1的測試頁面,以下:
[root@localhost ~]# curl http://x.140.246.55
#從訪問日誌看到,客戶端ip都是nginx代理服務器的後端ip,後端web服務器並無捕獲到真實客戶端ip [root@e84e8f6ba866 ~]# cd /usr/local/nginx/logs/ [root@e84e8f6ba866 logs]# tail -f access.log 172.19.200.215 - - [24/Aug/2016:09:20:49 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 172.19.200.215 - - [24/Aug/2016:09:20:49 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 172.19.200.215 - - [24/Aug/2016:09:20:52 +0000] "GET / HTTP/1.0" 200 36 "-" "curl/7.29.0" 172.19.200.215 - - [24/Aug/2016:09:20:53 +0000] "GET / HTTP/1.0" 200 36 "-" "curl/7.29.0"
#」proxy_set_header X-Real-IP $remote_addr」指令將發送到被代理服務器的請求頭從新定義或者增長一些字段;此值能夠是一個文本,變量或它們的組合; #proxy_set_header在指定的字段中沒有定義時會從它的上級字段繼承。 [root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://172.19.200.241; } [root@localhost conf]# service nginx reload
#」set_real_ip_from IP」指令在http字段內,但在server字段以外,IP爲nginx代理服務器可訪問到後端web服務器的地址。 [root@e84e8f6ba866 ~]# cd /usr/local/nginx/conf/ [root@e84e8f6ba866 conf]# vim nginx.conf set_real_ip_from 172.19.200.215; [root@e84e8f6ba866 conf]# service nginx reload
#在客戶端使用curl命令訪問代理服務器,查看後端web服務器訪問日誌; #從訪問日誌看到,後端web服務器已捕獲到真實客戶端ip [root@e84e8f6ba866 logs]# tail -f access.log
upstream是Nginx的HTTP Upstream模塊,此模塊經過一個簡單的調度算法來實現客戶端ip到後端服務器的負載均衡。
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。能夠經過weight 指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用於後端每一個服務器性能不均的狀況下。
每一個請求按訪問ip的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端服務器,可有效解決動態網頁存在的session共享問題。
比上面兩個更加智能的負載均衡算法。此算法能夠依據頁面大小和加載時間長短智能地進行負載均衡,即根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx自己不支持fair,若是須要使用這種調度算法,必須下載Nginx的upstream_fair模塊。
此方法按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,可進一步提升後端緩存服務器的效率。Nginx自己不支持url_hash,若是須要使用這種調度算法,必須安裝Nginx 的hash軟件包。
在upstream模塊中,能夠在每一個後端服務器後設置負載均衡調度中的狀態。經常使用的狀態有:
表示當前的server暫時不參與負載均衡。
預留的備份機器,當其餘全部的非backup機器出現故障或者忙的時候,纔會請求backup機器,所以這臺機器的壓力最輕。
容許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
在經歷了max_fails次失敗後,暫停服務的時間,max_fails能夠和fail_timeout一塊兒使用。
[root@localhost ~]# cd /usr/local/nginx/conf/ #upstream模塊在http字段內, server模塊以外;upstream指定的負載均衡名可自定義,後面location字段中」proxy_pass」指令調用自定義的負載均衡名便可; #weight值默承認不用配置,若是後端服務器性能不均,能夠經過weight值負載調度; #能夠經過backup狀態參數預留備份服務器; #默認使用輪詢調度算法,若是使用ip_hash調度算法,後端服務器的負載均衡調度狀態不能是backup [root@localhost conf]# vim nginx.conf upstream test.backend { # ip_hash; server 172.19.200.241 weight=1; server 172.19.200.242 weight=1; # server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; } } [root@localhost conf]# service nginx reload
採用curl命令訪問代理服務器,交替返回web1與web2的測試頁面,以下:
[root@localhost ~]# date ; curl http://x.140.246.55
指令:proxy_cache_path
語法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
使用字段:http字段,server字段以外
#指令指定緩存的路徑和一些其餘參數,緩存的數據存儲在文件中,緩存文件使用代理url的哈希值做爲關鍵字與文件名;
#levels參數指定指定目錄結構,指定緩存的子目錄數,能夠使用任意的1位或2位數字做爲目錄結構,但最多隻能是三級目錄,格式如X, X:X,或X:X:X,轉換爲指令如"2", "2:2", "1:1:2"等;
#全部活動的key和元數據存儲在共享的內存池中,這個區域用keys_zone參數指定。共享池的名稱自定義,共享池的大小可用"m"表明單位;內存池的大小按照緩存頁面數的比例進行設置,一個頁面(文件)的元數據大小按照操做系統來定,如FreeBSD/i386下爲64字節,FreeBSD/amd64下爲128字節;
#inactive參數指定緩存超時時間,指定時間內沒有被請求的數據則刪除,默認inactive爲10分鐘;
#一個名爲cache manager的進程控制磁盤的緩存大小,它被用來刪除不活動的緩存與控制緩存大小,這些都在max_size參數中定義,當目前緩存的值超出max_size指定的值以後,超過其大小後最少使用數據(LRU替換算法)將被刪除。
指令:proxy_cache
語法:proxy_cache zone_name;
使用字段:http, server, location
#設置一個緩存區域的(自定義)名稱,一個相同的區域能夠在不一樣的地方使用;
#緩存指令依賴代理緩衝區(buffers),若是proxy_buffers設置爲off,緩存不會生效。
指令:proxy_cache_valid
語法: proxy_cache_valid reply_code [reply_code …] time;
使用字段: http, server, location
#爲不一樣的應答設置不一樣的緩存時間,如:"proxy_cache_valid 200 302 10m;"
即應答代碼爲200和302時,設置緩存時間爲10分鐘;
#若是隻定義時間:如:"proxy_cache_valid 5m;" 那隻對代碼爲200, 301和302的應答進行緩存;
#能夠使用any參數應答,如:" proxy_cache_valid any 1m;"
若是不在代理服務器的配置文件中配置頁面緩存變量,則驗證時查看結果不方便。
服務器地址,在完成一次系統調用後可肯定這個值;若是要繞開系統調用,則必須在listen中指定地址而且使用bind參數。
MISS:未命中
EXPIRED – expired:請求被傳送到後端
UPDATING – expired:因爲proxy/fastcgi_cache_use_stale正在更新,將使用舊的應答
STALE – expired:因爲proxy/fastcgi_cache_use_stale超期,後端將獲得過時的應答
HIT:命中
[root@localhost ~]# cd /usr/local/nginx/conf/ #緩存路徑自定義,注意key_zone定義的共享內存池與location字段中」proxy_cache」對應; #兩個」add_header」指令增長了頭部,如不設置,驗證時不方便查看結果; #」proxy_buffering」若是是」off」,則緩存不生效 [root@localhost conf]# vim nginx.conf proxy_cache_path /usr/local/nginx/cache/testcache levels=1:2 keys_zone=testcache:20m max_size=1g; upstream test.backend { # ip_hash; server 172.19.200.241; server 172.19.200.242; # server 127.0.0.1:8080 backup } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; add_header X-Via $server_addr; add_header X-Cache $upstream_cache_status; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; # proxy_buffering off; proxy_cache testcache; proxy_cache_valid 200 10m; } } #在」proxy_cache_path」中定義的路徑須要補充完整,並賦予權限 [root@localhost conf]# mkdir -p /usr/local/nginx/cache/testcache [root@localhost conf]# chown www:www /usr/local/nginx/cache [root@localhost conf]# service nginx reload
採用瀏覽器訪問代理服務器,F5不斷刷新,返回web2(或者web1)的測試頁面,以下:
重寫模塊Rewrite容許使用正則表達式從新URI,但須要PCRE庫的支持,而且可根據相關變量重定向和選擇不一樣的配置。
若是rewrite指令在server字段中指定,那麼將在被請求的location肯定以前執行;若是在指令執行後所選擇的location中有其餘的重寫規則,那麼指令也被執行。若是在location中執行這個指令產生了新的URI,那麼location又一次肯定了新的URI,這樣的循環可最多執行10次,超出後nginx將返回500錯誤。
重定向驗證方案:將客戶端到web1上的請求重定向到web2。
設計:
[root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf upstream test.backend { # ip_hash; server 172.19.200.241 weight=1; # server 172.19.200.242 weight=1; # server 127.0.0.1:8080 backup } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; } [root@localhost conf]# service nginx reload
[root@e84e8f6ba866 ~]# cd /usr/local/nginx/conf/ [root@e84e8f6ba866 conf]# vim nginx.conf location / { root html; index index.html index.htm index.php; rewrite ^/ http://172.19.200.242; } [root@e84e8f6ba866 conf]# service nginx reload