主頁 > 作業系統 > 010.Nginx正反代理

010.Nginx正反代理

2020-09-14 09:29:58 作業系統

一 Nginx代理

1.1 Nginx代理概述

nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器,同時也是一個IMAP、POP3、SMTP代理服務器,nginx可以作為一個HTTP服務器進行網站的發布處理,同時nginx可以作為反向代理進行負載均衡的實作,

1.2 Nginx代理模式

Nginx通常有如下三種代理模式:
  • 正向代理(forward proxy)
  • 反向代理(reverse proxy)
  • 透明代理

1.3 正向代理

正向代理(forward)是一個位于客戶端和原始服務器(origin server)之間的服務器,即代理服務器,為了從原始服務器取得內容,客戶端向代理服務器發送一個請求并指定目標原始服務器,然后代理服務器向原始服務器轉交請求并將獲得的內容回傳給客戶端, clipboard 場景一:客戶端訪問本來無法訪問的原始服務器的資源 clipboard 假設最初客戶端要訪問原始服務器需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障(或存在禁止訪問的安全策略等),那么就無法訪問原始服務器了, 但是如果客戶端讓代理服務器去代替自己訪問原始服務器,由于代理服務器沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問的原始服務器,那么客戶端就可以得到原始服務器的資料了, 場景二:加速訪問原始服務器的資源 clipboard 假設客戶端要訪問原始服務器,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低帶寬鏈路,而客戶端到代理服務器,從代理服務器到原始服務器都是高帶寬鏈路,那么使用正向代理則可以加速訪問, 場景三:Cache作用 clipboard Cache(快取)技術和代理服務技術是緊密聯系的(不光是正向代理,反向代理也使用了Cache(快取)技術), 如上圖所示,假設客戶端要訪問原始服務器某資料A之前,代理服務器已經通過訪問原始服務器資料A,那么代理服務器會把資料A保存一段時間,此時再次通過代理服務器訪問資料A,那么代理服務器不再訪問原始服務器,而把快取的資料A直接發給客戶端,這一技術在Cache中術語就叫Cache命中, 場景四:代理服務器實作授權控制 clipboard 如上圖所示,防火墻作為網關,用來過濾外網對其的訪問,假設局域網內部客戶端A和客戶端B都設定了代理服務器,可通過代理服務器配置客戶端A允許訪問互聯網,而客戶端B不允許訪問互聯網,從而實作不通客戶端的訪問代理授權控制, 場景五:隱藏客戶端蹤跡 clipboard 如上圖所示,原始服務器并不知道訪問自己的實際的客戶端,因為代理服務器代替客戶端去直接與原始服務器進行互動,從而對于原始服務器而言,客戶端的蹤跡被隱藏了,

1.4 反向代理

反向代理正好與正向代理相反,對于客戶端而言代理服務器就像是原始服務器,并且客戶端不需要進行任何特別的設定,客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始服務器)轉交請求,并將獲得的內容回傳給客戶端, 場景一:隱藏原始服務器蹤跡 clipboard 客戶端始終認為它訪問的是原始服務器而不是代理服務器,但實用際上反向代理服務器接受客戶端的應答,從原始資源服務器中取得客戶端的需求資源,然后發送給客戶端,由于防火墻的作用,只允許代理服務器訪問原始資源服務器,對于此環境下,防火墻和反向代理的共同作用保護了原始資源服務器,對于客戶端而言是透明的, 場景二:負載均衡器 clipboard 當反向代理服務器存在多個,從而部署為集群,當多個客戶端訪問原始服務器(原始服務器也可以是集群)的時候,不同的代理服務器應答不同的客戶端,然后發送不同的客戶端所需的資源,從而實作負載均衡效果, 提示:Nginx基于反向代理實作負載均衡配置參考《012.Nginx負載均衡》, 場景三:Cache作用 同時反向代理服務器類似正向代理服務器一樣擁有Cache的作用,可以快取原始資源服務器的資源,而不是每次都要向原始資源服務器組請求資料,特別對于一些靜態的資料,比如圖片和普通檔案,如果這些反向代理服務器能夠做到和客戶端來自同一個網路,那么客戶端訪問反向代理服務器,就會得到很高質量的速度,這正是CDN技術的核心,場景四:正方代理混合場景 clipboard 實際專案操作時,正向代理和反向代理很有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標服務器,目標服務器是一個反向代理服務器,反向代理了多臺真實的業務處理服務器,

1.5 透明代理

參考:https://www.cnblogs.com/gbq-dog/p/10653054.html,

1.6 常見代理軟體

通常大多數開源代理軟體,都能實作正反代理兩種方式,開源軟體中如squid,既可以做正向代理,也可以實作反向代理,MS ISA也可以用來在Windows平臺下做正向代理,反向代理中最主要的實踐就是WEB服務,如Nginx,

二 代理配置項

2.1 配置語法

語法:proxy_buffering on | off; 默認值:proxy_buffering on; 可配置段:http, server, location 作用:配置proxy緩沖區, 擴展:
  • proxy_buffer_size:設定緩沖區大小(記憶體頁大小)
  • proxy_buffers:設定緩沖區數量和大小(記憶體頁數量和大小)
  • proxy_busy_buffers_size:設定最大緩沖區大小

語法:proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement; 默認值:proxy_redirect default; 可配置段:http, server, location 作用:配置proxy重定向, 擴展:
語法:proxy_buffering on | off; 默認值:proxy_buffering on; 可配置段:http, server, location 作用:配置proxy緩沖區, 擴展:
語法:proxy_set_header field value; 默認值:proxy_set_header Host $proxy_host; proxy_set_header Connection close; 可配置段:http, server, location 作用:配置proxy頭資訊, 擴展:
  • proxy_hide_header:設定隱藏頭資訊欄位;
  • proxy_set_body:設定請求體回傳資訊,

語法:proxy_connect_timeout time; 默認值:proxy_connect_timeout 60s; 可配置段:http, server, location 作用:配置proxy超時, 擴展:
  • proxy_hide_header:設定隱藏頭資訊欄位;
  • proxy_set_body:設定請求體回傳資訊,

三 配置正向代理

3.1 正向代理配置

  1 [root@proxy ~]# vi /etc/nginx/conf.d/reverse.conf
  2 server{
  3     resolver 8.8.8.8;				#配置DNS決議IP地址
  4     resolver_timeout 30s;				#超時時間(5秒)
  5     listen 8080;
  6     access_log  /var/log/nginx/reverse.access.log  main;
  7     error_log   /var/log/nginx/reverse.error.log  warn;
  8     location / {
  9         proxy_pass http://$http_host$request_uri;	#配置正向代理引數
 10         proxy_set_header Host $http_host;		#解決如果URL中帶"."后Nginx 503錯誤
 11         proxy_buffers 256 4k; 			#配置快取大小
 12         proxy_max_temp_file_size 0;			#關閉磁盤快取讀寫減少I/O
 13         proxy_connect_timeout 30;			#代理連接超時時間
 14         proxy_cache_valid 200 302 10m;
 15         proxy_cache_valid 301 1h;
 16         proxy_cache_valid any 1m;			#配置代理服務器快取時間
 17     }
 18 }
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@proxy ~]# nginx -s reload				#多載組態檔
配置釋義: 不能有hostname, 必須有resolver, 即dns,超時時間(30秒)可選, 配置正向代理引數,均是由 Nginx 變陣列成, 提示:配置好后,重啟nginx,以瀏覽器為例,若需要使用這個代理服務器,則只需將瀏覽器代理設定為http://+服務器ip地址+:+80即可使用了, clipboard 參考檔案:https://www.cnblogs.com/gbq-dog/p/10653054.html

四 反向代理配置

4.1 環境預設

主機 作用 備注
proxy2.odocker.com 代理服務器 反向代理服務器
www.landiannews.com 原始服務器 模擬原始服務器

4.2 配置反向代理

  1 [root@proxy ~]# vi /etc/nginx/conf.d/forward.conf
  2 server {
  3     listen  80;
  4     server_name  forward.linuxds.com;
  5     access_log  /var/log/nginx/forward.access.log  main;
  6     error_log   /var/log/nginx/forward.error.log  warn;
  7     location / {
  8         proxy_pass https://www.landiannews.com/;
  9         index index.html;
 10         proxy_redirect     off;
 11 #        proxy_set_header   Host             $host;
 12         proxy_set_header   X-Real-IP        $remote_addr;
 13         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 14         client_max_body_size       10m;		#允許客戶端請求的最大單檔案位元組數
 15         client_body_buffer_size    128k;	        #緩沖區代理緩沖用戶端請求的最大位元組數
 16         proxy_connect_timeout      300;		#nginx跟后端服務器連接超時時間(代理連接超時)
 17         proxy_send_timeout         300;		#后端服務器資料回傳時間(代理發送超時)
 18         proxy_read_timeout         300;		#連接成功后,后端服務器回應時間(代理接收超時)
 19         proxy_buffer_size          4k;		#設定代理服務器(nginx)保存用戶頭資訊的緩沖區大小
 20         proxy_buffers              4 32k;	        #proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設定
 21         proxy_busy_buffers_size    64k;		#高負荷下緩沖大小(proxy_buffers*2)
 22         proxy_temp_file_write_size 64k;		#設定快取檔案夾大小,大于這個值,將從upstream服務器傳
 23     }
 24 }
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@proxy ~]# nginx -s reload				#多載組態檔
配置釋義: proxy_set_header X-Real-IP $remote_addr:把源IP【$remote_addr,建立HTTP連接header里面的資訊】賦值給X-Real-IP,從而通過$X-Real-IP來獲取源IP; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:在nginx作為代理服務器時,設定的IP串列,會把經過的機器ip,代理機器ip都記錄下來,用【,】隔開,

4.3 測驗反向代理

瀏覽器訪問:http://forward.linuxds.com/ clipboard 參考檔案:https://www.runoob.com/w3cnote/nginx-proxy-balancing.html

4.4 其他代理配置陳述句

proxy_pass:設定代理服務器的地址,可以是主機名稱、IP地址加埠號等形式, proxy_pass URL 提示: 1:當代理的是一組服務器時可以使用 upstream 指令來設定, 2:當URL中含有uri時,(例如 "http://127.0.0.1:8080/"、"http://127.0.0.1:8080/demo.html")不管客戶端訪問的是地址中的uri是什么,代理服務器都會代理到URL的地址;當URL中不包含uri時(例如:"http://127.0.0.1:8080"),那么當客戶端訪問服務器時,代理服務器會根據客戶端請求的uri來訪問具體的URL地址,
proxy_pass_request_body on|off:用于配置是否將客戶端請求的請求體發送給代理服務器, proxy_pass_request_headers on|off:用于配置是否將客戶端請求的頭資訊發送給代理服務器, proxy_set_header field value:可以更改nginx接收到的客戶端請求的請求頭資訊,然后將新的請求頭資訊發送給被代理的服務器, proxy_set_body value:ngin接收到客戶端的請求后使用該指令可以修改request中的body體,然后將請求轉發給代理服務器, proxy_connect_timeout time:nginx服務器與被代理服務器之間嘗試建立連接的的超時時間,默認為60s, proxy_read_timeot time:nginx服務器接收被代理服務器資料時最大的等待時間,默認為60s, proxy_send_timeout time:nginx服務器發送資料至被代理服務器的最大等待時間,例如60s內沒有發出一個位元組則默認斷開連接,默認60s, proxy_http_version 1.0|1.1:nginx服務器提供代理服務的http協議版本, proxy_method method:nginx服務器設定請求被代理服務器時使用的請求方法,一般為POST或者GET, proxy_ignore_client_abort:當客戶端中斷網路請求時,nginx服務是否中斷對代理服務器的請求,默認off,

五 四層代理配置

5.1 四層代理

nginx-1.9.0 開始支持 TCP 代理,即4層代理,編譯安裝默認不會支持,需要加上 –with-stream 引數編譯,

5.2 環境預設

IP:埠 后端RS 備注
172.24.10.21:8888(nginx01) 172.24.10.22:81(nginx02) 172.24.10.23:81(nginx03) 反向代理81埠Web
172.24.10.21:2222(nginx01) 172.24.10.24:22(nginx04) 反向代理ssh
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/rs/
  2 [root@nginx02 ~]# echo '<h1>Rs172.24.10.22-81</h1>' > /usr/share/nginx/rs/index.html
  3 [root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
  4 server {
  5     listen  81;
  6     server_name 172.24.10.22;
  7     location / {
  8         root   /usr/share/nginx/rs;
  9         index  index.html;
 10         access_log  /var/log/nginx/rs.access.log  main;
 11         error_log   /var/log/nginx/rs.error.log  warn;
 12     }
 13 }
 14 EOF
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@nginx02 ~]# nginx -s reload			#多載組態檔
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/rs/
  2 [root@nginx03 ~]# echo '<h1>Rs172.24.10.23-81</h1>' > /usr/share/nginx/rs/index.html
  3 [root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
  4 server {
  5     listen  81;
  6     server_name 172.24.10.23;
  7     location / {
  8         root   /usr/share/nginx/rs;
  9         index  index.html;
 10         access_log  /var/log/nginx/rs.access.log  main;
 11         error_log   /var/log/nginx/rs.error.log  warn;
 12     }
 13 }
 14 EOF
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@nginx02 ~]# nginx -s reload			#多載組態檔

5.3 配置四層代理

  1 [root@nginx01 ~]# cat >> /etc/nginx/nginx.conf << EOF
  2 stream {
  3     upstream myweb {
  4         server 172.24.10.22:81 weight=5 max_fails=1 fail_timeout=10s;
  5         server 172.24.10.23:81;
  6     }
  7     upstream myssh {
  8         hash $remote_addr consistent;
  9         server 172.24.10.24:22;
 10     }
 11 
 12     server {
 13         listen  8888;
 14         proxy_connect_timeout 2s;
 15         proxy_timeout 900s;
 16         proxy_pass myweb;
 17     }
 18 
 19     server {
 20         listen  2222;
 21         proxy_connect_timeout 2s;
 22         proxy_timeout 900s;
 23         proxy_pass myssh;
 24     }
 25 }
 26 EOF
提示:stream和http同等級,因此如上配置需要追加至主組態檔最后,
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@proxy ~]# nginx -s reload				#多載組態檔

5.4 確認驗證

瀏覽器訪問:http://113.31.111.246:8888/, clipboard [root@proxy ~]# ssh -p 2222 172.24.9.247 #測驗ssh clipboard 提示:更多代理模塊細節,參考《附001.Nginx代理相關模塊決議》,

六 按型別反向代理配置

6.1 環境預設

主機 IP 備注
nginx01 172.24.10.21 反向代理服務器
nginx02 172.24.10.22 chrmoe型別資源 firefox型別資源
nginx03 172.24.10.23 iPhone型別資源 android型別資源
nginx04 172.24.10.24 IE型別資源
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/basebrowser/
  2 [root@nginx02 ~]# echo '<h1>Chrmoe-172.24.10.22</h1>' > /usr/share/nginx/basebrowser/index01.html
  3 [root@nginx02 ~]# echo '<h1>Firefox-172.24.10.22</h1>' > /usr/share/nginx/basebrowser/index02.html
  1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/basebrowser.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.22;
  5     location / {
  6         root   /usr/share/nginx/basebrowser;
  7         index  index01.html;
  8         access_log  /var/log/nginx/chrmoebrowser.access.log  main;
  9         error_log   /var/log/nginx/chrmoebrowser.error.log  warn;
 10     }
 11 }
 12 server {
 13     listen  89;
 14     server_name 172.24.10.22;
 15     location / {
 16         root   /usr/share/nginx/basebrowser;
 17         index  index02.html;
 18         access_log  /var/log/nginx/firefoxbrowser.access.log  main;
 19         error_log   /var/log/nginx/firefoxbrowser.error.log  warn;
 20     }
 21 }
 22 EOF
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/cellphone/
  2 [root@nginx03 ~]# echo '<h1>iPhone-172.24.10.23</h1>' > /usr/share/nginx/cellphone/index01.html
  3 [root@nginx03 ~]# echo '<h1>Android-172.24.10.23</h1>' > /usr/share/nginx/cellphone/index02.html
  1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/cellphone.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.23;
  5     location / {
  6         root   /usr/share/nginx/cellphone;
  7         index  index01.html;
  8         access_log  /var/log/nginx/iphone.access.log  main;
  9         error_log   /var/log/nginx/iphone.error.log  warn;
 10     }
 11 }
 12 server {
 13     listen  89;
 14     server_name 172.24.10.23;
 15     location / {
 16         root   /usr/share/nginx/cellphone;
 17         index  index02.html;
 18         access_log  /var/log/nginx/android.access.log  main;
 19         error_log   /var/log/nginx/android.error.log  warn;
 20     }
 21 }
 22 EOF
  1 [root@nginx04 ~]# mkdir /usr/share/nginx/iebrowser/
  2 [root@nginx04 ~]# echo '<h1>IE Browser-172.24.10.24</h1>' > /usr/share/nginx/iebrowser/index.html
  1 [root@nginx04 ~]# cat > /etc/nginx/conf.d/iebrowser.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.24;
  5     location / {
  6         root   /usr/share/nginx/iebrowser;
  7         index  index.html;
  8         access_log  /var/log/nginx/iebrowser.access.log  main;
  9         error_log   /var/log/nginx/iebrowser.error.log  warn;
 10     }
 11 }
 12 EOF
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@nginx02 ~]# nginx -s reload			#多載組態檔
  3 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  4 [root@nginx03 ~]# nginx -s reload			#多載組態檔
  5 [root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  6 [root@nginx04 ~]# nginx -s reload			#多載組態檔
  1 [root@client ~]# curl 172.24.10.22:89
  2 <h1>Firefox-172.24.10.22</h1>
  3 [root@client ~]# 
  4 [root@client ~]# curl 172.24.10.22:88
  5 <h1>Chrmoe-172.24.10.22</h1>
  6 [root@client ~]# curl 172.24.10.22:89
  7 <h1>Firefox-172.24.10.22</h1>
  8 [root@client ~]# curl 172.24.10.23:88
  9 <h1>iPhone-172.24.10.23</h1>
 10 [root@client ~]# curl 172.24.10.23:89
 11 <h1>Android-172.24.10.23</h1>
 12 [root@client ~]# curl 172.24.10.24:88
 13 <h1>IE Browser-172.24.10.24</h1>

6.2 反向代理配置

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/type/
  2 [root@nginx01 ~]# echo '<h1>Type-172.24.10.21</h1>' > /usr/share/nginx/type/index.html
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/type.conf
  2 upstream chrome {
  3     server 172.24.10.22:88;
  4 }
  5 upstream firefox {
  6     server 172.24.10.22:89;
  7 }
  8 upstream iphone {
  9     server 172.24.10.23:88;
 10 }
 11 upstream android {
 12     server 172.24.10.23:89;
 13 }
 14 upstream iebrowser {
 15     server 172.24.10.24:88;
 16 }
 17 
 18 server {
 19     listen  80;
 20     server_name  type.linuxds.com;
 21     access_log  /var/log/nginx/type.access.log  main;
 22     error_log   /var/log/nginx/type.error.log  warn;
 23     proxy_set_header   Host             $host;
 24     proxy_set_header   X-Real-IP        $remote_addr;
 25     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 26     client_max_body_size       10m;	#允許客戶端請求的最大單檔案位元組數
 27     client_body_buffer_size    128k;	#緩沖區代理緩沖用戶端請求的最大位元組數
 28     proxy_connect_timeout      300;	#nginx跟后端服務器連接超時時間(代理連接超時)
 29     proxy_send_timeout         300;	#后端服務器資料回傳時間(代理發送超時)
 30     proxy_read_timeout         300;	#連接成功后,后端服務器回應時間(代理接收超時)
 31     proxy_buffer_size          4k;		#設定代理服務器(nginx)保存用戶頭資訊的緩沖區大小
 32     proxy_buffers              4 32k;	#proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設定
 33     proxy_busy_buffers_size    64k;	#高負荷下緩沖大小(proxy_buffers*2)
 34     proxy_temp_file_write_size 64k;	#設定快取檔案夾大小,大于這個值,將從upstream服務器傳
 35     location / {
 36         root  /usr/share/nginx/type/;
 37         index index.html;
 38 
 39         if ($http_user_agent ~* "chrome"){
 40                 proxy_pass http://chrome;
 41                 }
 42         if ($http_user_agent ~* "firefox"){
 43                 proxy_pass http://firefox;
 44                 }
 45         if ($http_user_agent ~* "android"){
 46                 proxy_pass http://android;
 47                 }
 48         if ($http_user_agent ~* "iphone"){
 49                 proxy_pass http://iphone;
 50                 }
 51         if ($http_user_agent ~* "MSIE"){
 52                 proxy_pass http://iebrowser;
 53                 }
 54     }
 55 }
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@nginx01 ~]# nginx -s reload			#多載組態檔

6.3 確認驗證

不同瀏覽器分別訪問:http://type.linuxds.com/ clipboard

七 反向代理及快取

7.1 環境預設

主機 IP 備注
nginx01 172.24.10.21 反向代理及快取服務器
nginx02 172.24.10.22 后端RS01
nginx03 172.24.10.23 后端RS01
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/cache/
  2 [root@nginx02 ~]# echo '<h1>Cache-172.24.10.22</h1>' > /usr/share/nginx/cache/index.html
  3 
  1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/cache.conf <<EOF
  2 server {
  3     listen  90;
  4     server_name 172.24.10.22;
  5     location / {
  6         root   /usr/share/nginx/cache;
  7         index  index.html;
  8         access_log  /var/log/nginx/cache.access.log  main;
  9         error_log   /var/log/nginx/cache.error.log  warn;
 10     }
 11 }
 12 EOF
  1 [root@nginx02 ~]# ll /usr/share/nginx/cache
  2 total 16K
  3 -rw-r--r-- 1 root root  28 Jun 23 22:33 index.html
  4 -rw-r--r-- 1 root root 11K Jun 23 22:34 nginx.jpg	#上傳一張測驗圖片
  5 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  6 [root@nginx02 ~]# nginx -s reload			#多載組態檔
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/cache/
  2 [root@nginx03 ~]# echo '<h1>Cache-172.24.10.23</h1>' > /usr/share/nginx/cache/index.html
  1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/cache.conf <<EOF
  2 server {
  3     listen  90;
  4     server_name 172.24.10.23;
  5     location / {
  6         root   /usr/share/nginx/cache;
  7         index  index.html;
  8         access_log  /var/log/nginx/cache.access.log  main;
  9         error_log   /var/log/nginx/cache.error.log  warn;
 10     }
 11 }
 12 EOF
  1 [root@nginx03 ~]# ll /usr/share/nginx/cache
  2 total 16K
  3 -rw-r--r-- 1 root root  28 Jun 23 22:33 index.html
  4 -rw-r--r-- 1 root root 11K Jun 23 22:34 nginx.jpg	#上傳一張測驗圖片
  5 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  6 [root@nginx03 ~]# nginx -s reload			#多載組態檔

7.2 配置代理及快取

  1 [root@nginx01 ~]# mkdir -p /data/cache			#創建快取目錄
  2 [root@nginx01 ~]# mkdir -p /data/cache_temp		#創建快取臨時目錄
  1 [root@nginx01 ~]# vi /etc/nginx/nginx.conf		#追加如下代碼日志記錄
  2 ……
  3 log_format  main  '[$remote_addr]-[$remote_user]-[$time_local]-["$request"]'
  4                       '[$status]-[$body_bytes_sent]-["$http_referer"]'
  5                       '["$http_user_agent"]-["$http_x_forwarded_for"]';
  6                       '[$upstream_addr]-[$upstream_status]-[$request_time]-[$upstream_response_time]'
  7 ……
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/cache.conf
  2 upstream cache {
  3 server 172.24.10.22:90;
  4 server 172.24.10.23:90;
  5     }
  6 
  7 proxy_temp_path /data/cache_temp;
  8 proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:20m max_size=10g inactive=60m use_temp_path=off;
  9 
 10 server {
 11     listen          80;
 12     server_name     cache.linuxds.com;
 13     access_log  /var/log/nginx/cache.access.log  main;
 14     error_log   /var/log/nginx/cache.error.log  warn;
 15 
 16     location / {
 17         expires 3d;
 18         add_header  Nginx-Cache "$upstream_cache_status";	#增加一個頭資訊
 19 
 20         proxy_cache mycache;			        #呼叫定義的cache zone
 21         proxy_pass  http://cache;		                #配置反向代理
 22         proxy_set_header  Host      $host;
 23         proxy_set_header  X-Real-IP $remote_addr;
 24         proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 25 
 26         proxy_cache_valid  200 302 304 2h;	               #200和302及304頭資訊過期時間為2小時
 27         proxy_cache_valid  any 10m;		               #其他過期時間10分鐘
 28         proxy_cache_key    $host$request_uri$uri$is_args$args;	#定義快取的key
 29         proxy_cache_bypass $cookie_nocache $arg_comment;	        #配置不快取
 30         proxy_no_cache $arg_nocache;				#配置不快取
 31         proxy_cache_lock on;
 32         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;	#一個服務報錯請求下一個
 33     }
 34     location ~ /purge(/.*) {
 35         allow       127.0.0.1;
 36         allow       172.24.10.0/24;
 37         deny        all;
 38         proxy_cache_purge mycache $1$is_args$args;
 39     }
 40 }
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查組態檔
  2 [root@nginx01 ~]# nginx -s reload			#多載配置檔案
配置釋義: proxy_cache_path:配置快取目錄,檔案目錄層級2級,空間名字20m大小,目錄最大大小10g(超過啟動nginx自己的淘汰規則),在60分鐘的時間內沒有被訪問就會被清理,并且不使用臨時目錄, proxy_no_cache:部分不設定快取,cookie_nocache上面配置的引數,cookie_nocache不為0或者空,那么是不會進行快取的, proxy_cache_lock on:如果多個客戶端請求的檔案不在快取(MISS),只有第一個這些請求是通過原始服務器的, 提示:proxy_no_cache和proxy_cache_bypass類似,其差異是proxy_no_cache用于控制什么情況下回應不被快取,比如配置“proxy_no_cache$args_nocache”,如果帶的nocache引數值至少有一個不為慷訓者為0,則回應將不被快取,而proxy_cache_bypass,控制什么情況不使用快取的內容,而是直接到后端獲取最新的內容,如果命中,則$upstream_cache_status為BYPASS, 延伸: upstream_cache_status狀態如下:
  • MISS:未命中快取,即在快取中找不到回應,因此從原始服務器獲取回應,然后快取回應;
  • HIT:命中快取,回應將直接來自有效的快取;
  • EXPIRED:快取已經過期,回應包含來自原始服務器的新內容;
  • STALE:命中了陳舊的快取,因為源服務器未正確回應但proxy_cache_use_stale已配置,
  • UPDATING:內容陳舊,因為條目當前正在更新以回應先前的請求,并且proxy_cache_use_stale updating已配置;
  • REVALIDATED:Nginx驗證了陳舊的內容依然有效;
  • BYPASS:回應是從原始服務器獲得,
注意:使用proxy_cache_purge清除快取,必須提前安裝ngx_cache_purge模塊,安裝模塊必須基于編譯安裝的Nginx,

7.3 確認驗證

客戶端訪問測驗:
  1 [root@client ~]# curl -I http://cache.linuxds.com/nginx.jpg
clipboard 結論:第一次訪問會出現MISS,沒有命中快取,第二次訪問即可直接命中快取, 參考檔案:https://blog.csdn.net/h13140995776/article/details/101174283,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/33329.html

標籤:Linux

上一篇:ubuntu系統下安裝php7.4

下一篇:Java應用服務器之tomcat基礎配置(二)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more