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;
觀察報文首部如下:

可以觀察緩存已經命中了