nginx之proxy、cache、upstream模組學習

wadeson發表於2017-07-24

 

nginx之proxy反向代理模組:

location ^~ /proxy_path/ {
root "/www/html"; 這裡沒必要配置
index index.html; 這裡也沒必須配置
proxy_pass http://192.168.223.137/;
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
將http://192.168.223.136/proxy_path/ 直接反向代理到http://192.168.223.137/
這個proxy_path的url並不存在代理伺服器上,它只是一個虛假的url,關注點是後端伺服器的url
當然也可以如下配置:
[root@wadeson proxy_path]# ll
total 4
-rw-r--r--. 1 root root 39 Jul 22 10:17 index.html
由於後端伺服器只有一個html檔案,當請求的http://192.168.223.136:8080/proxy_path/test.html這個url資源時,實際找的是後端的test.html,後端沒有這個檔案,所以報錯:
location ^~/proxy_path/ { 當這裡有/
proxy_pass http://192.168.223.137/proxy_path; 這裡沒有/時
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
所以,url設定時,有/時一定不要丟
當使用正規表示式做模式匹配時:
location ~* \.(jpg|jpeg|gif|png)$ {
proxy_pass http://192.168.223.137/proxy_path/;   錯誤的
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
檢測語法時,就開始報錯:
[root@wadeson nginx]# sbin/nginx -t
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/nginx/conf/nginx.conf:107
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
上面強調了做正規表示式模式匹配的時候,proxy_pass後端伺服器一定不能帶有url字尾,必須為
proxy_pass http://192.168.223.137;    right
而不是
proxy_pass http://192.168.223.137/proxy_path/;也不是   錯誤
proxy_pass http://192.168.223.137/;    錯誤
當訪問:http://192.168.223.136:8080/image.jpeg,直接請求的後端的網站根下面的該圖片檔案:
[root@wadeson htdocs]# pwd
/usr/local/apache2.4/htdocs
[root@wadeson htdocs]# ll
total 120
drwxr-xr-x. 4 root root 4096 Jul 17 11:47 api
-rw-r--r--. 1 root root 103548 Jul 22 10:40 image.jpeg
-rw-r--r--. 1 root root 32 Jul 20 22:41 index.html
-rw-r--r--. 1 root root 151 Jul 7 16:33 index.php.bak
drwxr-xr-x. 2 root root 4096 Jul 22 10:17 proxy_path
當請求為:http://192.168.223.136:8080/proxy_path/image.jpeg
因為在後端伺服器有proxy_path這個目錄,並且目錄下面有該圖片:
[root@wadeson htdocs]# ll proxy_path/
total 108
-rw-r--r-- 1 root root 103548 Jul 23 18:30 image.jpeg
-rw-r--r--. 1 root root 39 Jul 22 10:17 index.html
現在:

[root@wadeson htdocs]# ll
total 120
drwxr-xr-x. 4 root root 4096 Jul 17 11:47 api
-rw-r--r--. 1 root root 103548 Jul 22 10:40 image.jpeg.bak
-rw-r--r-- 1 root root 35 Jul 23 13:59 index.html
-rw-r--r--. 1 root root 151 Jul 7 16:33 index.php.bak
drwxr-xr-x. 2 root root 4096 Jul 23 18:30 proxy_path
[root@wadeson htdocs]# ll proxy_path/
total 108
-rw-r--r-- 1 root root 103548 Jul 23 18:30 image.jpeg
-rw-r--r--. 1 root root 39 Jul 22 10:17 index.html

再次訪問:http://192.168.223.136:8080/proxy_path/image.jpeg

而訪問:

 

 

 
nginx之cache模組:
1、建立快取的目錄
mkdir /data/cache/nginx
2、修改許可權,由於是worker程式進行訪問,而worker程式是nginx使用者
chown -R nginx:nginx /data/cache/nginx
3、配置快取目錄(http段)
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:30m;
4、然後在server段或者location段進行新增快取配置
proxy_cache one;
在配置代理服務轉發的location可以進行快取
在進行圖片的時候可以進行快取
proxy_cache_valid 200 1d; 狀態碼為200的,將它快取1天
配置如下:
[root@wadeson ~]# mkdir -pv /data/cache/nginx
[root@wadeson ~]# chown -R nginx:nginx /data/cache/nginx/
proxy_cache_path /data/cache/nginx levels=1:2 keys_zone=nginx_zone:30m;
location ~* \.(jpg|jpeg|gif|png)$ {
proxy_pass http://192.168.223.137;
proxy_cache nginx_zone;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
訪問驗證:http://192.168.223.136:8080/image.jpeg,跳轉到後端
http://192.168.223.137/image.jpeg
因為進行了快取設定,現在將後端的該圖片檔案進行操作:
[root@wadeson htdocs]# mv image.jpeg image.jpeg.bak
然後再次進行訪問:
發現快取效果已經成功了
 
這就是實際快取的內容:
[root@wadeson nginx]# ll 0/95/95690753e430af9fc5259dae96ddb950
-rw------- 1 nginx nginx 103995 Jul 23 11:39 0/95/95690753e430af9fc5259dae96ddb950
 
如果需要將快取的內容失效,那麼:
1、直接刪除該內容
2、使用purge設定(具體看文件)
 
cache還有其他設定:
proxy_cache_min_uses number;
Sets the number of requests after which the response will be cached.
請求number次之後,響應就將會被快取
proxy_connect_timeout time;
定義代理伺服器請求到後端伺服器的連線時長
 
nginx之upstream模組:
upstream backend { upstream指令在http段定義
server 192.168.223.137:80;
server 192.168.223.137:8080;
}
location ~* \.(jpg|jpeg|gif|png)$ {
#proxy_pass http://192.168.223.137;
#proxy_cache nginx_zone;
#proxy_cache_valid 200 302 1d;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
proxy_pass http://backend; 以正規表示式匹配的模式時,url後面沒有/
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
後端是httpd的80和8080埠:
代理伺服器的請求報文設定:
location ~* \.(jpg|jpeg|gif|png)$ {
#proxy_pass http://192.168.223.137;
#proxy_cache nginx_zone;
#proxy_cache_valid 200 302 1d;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
proxy_pass http://backend;
#proxy_set_header Host $host:$proxy_port;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
 
設定後端的httpd日誌格式:
LogFormat "%h %{X-Real-IP}i %{host}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
新增的都是前面代理伺服器裡面設定過了的,然後啟用
CustomLog "logs/access_log" combined
當訪問:http://192.168.223.136:8080/image.jpeg時。觀察後端日誌:
192.168.223.136 192.168.223.1 backend:80 - - [23/Jul/2017:14:22:58 +0800] "GET /image.jpeg HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.223.136 192.168.223.1 backend:80 - - [23/Jul/2017:14:22:58 +0800] "GET /image.jpeg HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
可以清晰的看到客戶端地址和後端伺服器的名稱資訊
定義排程演算法:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com;
}
upstream內部健康狀態檢測:
max_fails=number
試圖連線後端伺服器,達到該次數還是不能連線,表示該後端伺服器已經不能提供服務了
fail_timeout=time
試圖連線後端伺服器,達到多長時間後,超過該時長後,該後端伺服器將不可用
如果後端伺服器其中的某一個當機後,那麼將不會被提供服務
 
如果需要更新後端伺服器,那麼可以先將其中的一個伺服器進行down,升級成功之後然後啟用它,並能提供服務,如果升級正常,那麼再執行其他的伺服器:
upstream backend { ip_hash; 排程方法 server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; }
 
排程方法:
least_conn:最少連線
 
應用時外部的health_check健康檢測:
建議專門使用一個location,執行health_check,並關掉訪問日誌
因為health_check是每隔一段時間就去檢測web服務,所以會產生
大量日誌
server { location / { proxy_pass http://dynamic; health_check; }
 
backup
marks the server as a backup server. It will be passed requests when the primary servers are unavailable.
backup,在其他伺服器可用時將不會提供服務,如果其他服務都不可用時,那麼備用的該伺服器將會提供服務。
 
基於cookie的負載均衡排程:
基於sticky實現session繫結:
Syntax: sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];
sticky route $variable ...;
sticky learn create=$variable lookup=$variable zone=name:size [timeout=time];
sticky繫結有三種方法
 

nginx之add_header:

給響應報文加上首部:
location ~* \.(jpg|jpeg|gif|png)$ {
proxy_pass http://backend;
#proxy_set_header Host $host:$proxy_port;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Via $server_addr; $server_addr這是伺服器的ip
$server_addr:
客戶端win10向代理伺服器請求時,代理伺服器是server,為新增響應的首部資訊:
add_header X-Via $server_addr;
然後訪問:http://192.168.223.136:8080/image.jpeg,觀察響應報文:

可以清晰的看見剛剛定義的報文資訊
繼續新增首部,新增後端伺服器的首部資訊:
location ~* \.(jpg|jpeg|gif|png)$ {
#proxy_pass http://192.168.223.137;
#proxy_cache nginx_zone;
#proxy_cache_valid 200 302 1d;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
proxy_pass http://backend;
#proxy_set_header Host $host:$proxy_port;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Via $server_addr;
add_header X-Upstream $upstream_addr;
}
$upstream_addr:定義的upstream的ip
訪問:http://192.168.223.136:8080/image.jpeg,觀察響應報文如下:

 

定義快取是否命中:$upstream_cache_status
location ~* \.(jpg|jpeg|gif|png)$ {
#proxy_pass http://192.168.223.137;
#proxy_cache nginx_zone;
#proxy_cache_valid 200 302 1d;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
proxy_pass http://backend;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Via $server_addr;
add_header X-Upstream $upstream_addr;
add_header X-Upstream-Cache $upstream_cache_status;
}
訪問:http://192.168.223.136:8080/image.jpeg時,發現並沒有看見定義的首部,需要開啟快取功能
location ~* \.(jpg|jpeg|gif|png)$ {
proxy_cache nginx_zone;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
proxy_pass http://backend;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Via $server_addr;
add_header X-Upstream $upstream_addr;
add_header X-Upstream-Cache $upstream_cache_status;
}
啟用快取功能再加上add_header X-Upstream-Cache $upstream_cache_status;
觀察報文首部如下:

 

可以觀察快取已經命中了

相關文章