本文部分參照部落格http://blog.51cto.com/1992tao/1868267
Nginx除了作為web server,還具有反向代理、負載均衡和緩存的功能。
正向代理:是一個位于用戶端和原始伺服器之間的伺服器,為了從原始伺服器去的内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。用戶端必須要進行一些特别的設定才能使用正向代理。
反向代理:指以代理伺服器來接受internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給internet請求連接配接的用戶端,此時代理伺服器對外就表現為一個反向代理伺服器;
兩者差別:
1. 從用途來講:
1) 正向代理可以為在防火牆内的區域網路客戶提供通路internet的途徑。正向代理還可以使用緩沖特性減少網絡使用率;
2) 反向代理将防火牆後面的服務提供給internet使用者通路。反向代理還可以為後端的多台伺服器提供負載均衡,或為後端的伺服器提供緩存服務。
2. 從安全性講:
1) 正向代理允許用戶端通過它通路任意網站并且隐藏用戶端自身,是以你必須采取安全措施以確定僅為經過授權的用戶端提供服務。
2) 反向代理對外是透明的,通路者并不知道自己通路是一個代理伺服器。
ngx_http_proxy_module子產品:
1. proxy_pass URL

作用:将作為代理伺服器,把用戶端通路的資源的url映射到後端伺服器;
格式:
Server {
listen
server_name
location / {
proxy_pass http://host[:port]/ ;
}
location /uri {
poxy_pass http://back_server:port/newuri;
location ~* /uri {
proxy_pass http://back_server;
}
}
}
示例:
1) 實驗環境
兩台虛拟主機,一台作為nginx反向代理伺服器,另外一台作為後端web伺服器;nginx代理伺服器要有一外網網卡和外網用戶端通信,還要有一個内網網卡和後端主機通信;後端web伺服器内網和nginx在同一網段。
2) 環境搭建
a. 設定nginx反向代理伺服器的IP位址,外網位址ip:192.168.19.130,内網ip:172.16.23.1
b. 後端web伺服器IP位址為172.16.23.110;
c. 準備網頁檔案;
3) 編輯代理伺服器配置檔案并測試
a. 編輯配置檔案如下:
通路測試:
b. 我們再次編輯配置檔案,不代理整個跟,隻代理test目錄到後端伺服器;
測試通路:
Note:此次我們在proxy_pass加了根,會将其替換吊location的uri,是以通路測試的結果還是通路了後端伺服器的預設頁面檔案;
c. 我們再次編輯配置檔案,去掉proxy_pass後面的根;
測試:
Note:在proxy_pass後面不加根,會将location中的uri不到proxy的後面,及通路後端主機的test目錄下的預設頁面;
d. 編輯配置檔案,如果location是正規表達式比對的。Proxy後面一定不能帶uri,即不能帶根,否則會報錯;
2. proxy_set_header field value;
作用:将用戶端請求代理伺服器請求封包首部的值附加到代理伺服器發往後端伺服器請求封包的首部
Proxy_set_header X-Real-IP $remote_addr:直接記錄前段主機的ip位址;
Proxy_set_header X-Forward-For $proxy_add_x_forwarded_for:記錄IQ那段合租記發請求時記錄的proxy_add_x_forwarded_for的值;
1) 檢視後端伺服器日志,可以看出請求的IP位址都是代理伺服器的IP位址;
2) 編輯nginx代理伺服器配置檔案;
修改後端伺服器配置檔案的日志格式,添加以下内容:
重新通路測試:可以看出,在通路日志中出現了源位址資訊;
具體可參考https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral這篇部落格,有具體的日志格式設定;
Note:如果後端伺服器用的apache,日志格式可改成如下格式即可;
3. proxy_cache緩存
proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;
作用:定義proxy功能的緩存路徑等;
參數:
levels=levels:緩存目錄的層級數量;
例如:levels=1:2:2,表示一個一級子目錄,兩個二級子目錄,兩個三級子目錄,每一級的數量為十六進制數;
keys_zone=name:size :k/v映射的記憶體空間的名稱和大小;
inactive=time:非活動時長;
max_size=size:磁盤上用于緩存資料的緩存空間上限;
proxy_cache zone_name;
作用:指明要調用的緩存,或者關閉緩存機制;
proxy_cache_valid [code] time;
作用:定義對特定的響應碼的響應内容的緩存時長;
proxy_cache_methods
作用:指明為哪些請求方法去檢測使用緩存;一般情況下,通常是GET HEAD可以使用緩存;
proxy_cache_use_stale error timeout ...
作用:當代理伺服器于後端主機出現故障時,在後端伺服器的響應結果為哪種情況下,可以直接用緩存中的緩存項(可能是過期的内容)來響應用戶端。
proxy_cache_min_uses
作用:設定響應将被緩存的請求的數量;
proxy_cache_bypass string: 設定在何種情形下nginx将不從cache取資料的;
$cookie_nocache $arg_nocache $http_authorization
作用:定義不從緩存中響應的條件,如果參數字元串中至少有一個值不是空的,并且不等于0,name響應就不從緩存中擷取;
proxy_cache_key <code>string</code>;
作用:緩存中用于“鍵”的内容;
示例:定義調用緩存機制;
1) 建立緩存目錄;
2) 在配置檔案中定義緩存路徑(proxy_cache_path路徑隻能定義在http段)
3) 可以在其它的location段定義緩存調用;
4) 測試通路http://192.168.19.130/test,檢視緩存目錄;
ngx_http_upstream_module子產品
作用:定義伺服器組;
格式:
upstream name {
server_adress [parameters];
ip_hash;
1. server address [parameters];
作用:定義upstream中server成員的位址和其他相關參數;
address:這個位址可以指定為一個域名或者ip位址,後面加一個可選擇的端口,或者是在unix字首之後指定的unix域的套接字路徑如果沒有指定端口,則使用預設的80端口。一個域名解析到多個ip位址,同時定義多個伺服器。
parameters:
weight=number :權重,預設為1;
man_fails=number :失敗嘗試的最大次數;超出此處指定的次數時,server将被标記不可用;
fail_timeout=time :設定将伺服器标記為不可用狀态的逾時時長;
down :手動标記server不可用;
backup :标記這個伺服器為一個備用伺服器,當主伺服器不可用時,它将被傳遞請求。
示例:定義兩個upstream server,用兩台upstream server提供web測試界面,一台nginx伺服器做反向代理伺服器,實作負載均衡;
1) 編輯/etc/nginx/nginx.conf配置檔案,配置upstream servers;
2) 編輯配置檔案調用upstream server;
3) 重載服務,并測試;
Note:可以看出,通路根目錄時,實作了負載均衡,通路test目錄下頁面檔案時,都是172.16.23.210那台upserver在響應,這是因為在/test/的location下,定義了緩存機制,第一次從upstream server1上都到響應,之後的都是從緩存中擷取的。
4) 注釋掉緩存機制,重新通路測試;
重新通路測試:
5) 編輯配置檔案,設定權重,max_fails等參數;
6) 重載配置檔案,我們手動停掉172.16.23.211的web服務這台upserver測試,可以發現隻有第一台upserver響應了;
7) 再重新啟動停掉web服務的upserver的web服務,再次測試;
健康檢查:
health_check;
建議:關閉通路日記
排程算法:
1. ip_hash;
源位址hash排程方法
2. least_conn;
最少連接配接排程算法,當server擁有不同的權重是其為wlc;
3. hash key [consistent];
基于指定的的key的hash表來實作對請求的排程,此處的key可以直接是文本、變量或者二者的組合;
作用:将請求分類,同一類請求将發往同一個upstream server;
hash $request_uri consistent;一緻性hash算法;
hash $remote_addr;來自于同一個ip位址的請求,将始終被發往同一個後端伺服器;
4. keepalive connections;
為每個worker程序保留的空閑的長連接配接數量;
示範:
1. ip_hash算法;
1) 編輯配置檔案,采用ip排程方法;
2) 重載服務測試;
2. hash key算法;
1) 在172.16.23.210後端主機上準備測試網頁檔案;
2) 在172.16.23.211後端主機上準備網頁測試檔案;
3) 不添加任何算法測試;
4) 編輯配置檔案,把使用者請求的uri做哈希運算,用hash key算法;
5) 重載服務,測試;
自定義響應首部:
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
1. 編輯配置檔案,自定義響應首部;
2. 測試;