Linux自學筆記——nginx應用進階
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_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
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 string
;
作用:緩存中用於“鍵”的內容;
示例:定義調用緩存機制;
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. 測試;
Linux自學筆記——nginx應用進階