Nginx代理服務1--正反向代理及緩衝

  代理服務是Nginx的核心所在,早期在沒有代理的時候,客戶端直接和服務端進行交互,如下圖所示:



  當有了代理之後,客戶端和服務端直接的交互方式有了改變,代理負責對請求和響應進行轉發。代理可以過濾請求也可以對響應做相應的改變,讓服務端發揮的空間更大


代理的分類:

-正向代理

  正向代理可以幫助客戶端訪問無法直接訪問的資源,當用戶想訪問國外無法直接訪問的資源時,可以先去訪問代理,然後由代理去幫忙尋找資源,然後返回給客戶端,所以它和客戶端的關係好~~如下圖所示:


-反向代理

  反向代理是爲服務端服務的,當用戶通過域名去訪問某個資源的時候,代理會自動的尋找服務端的某臺機器上的資源,這些都是對客戶端透明的,客戶端感知就只有一個服務端機器。


正向代理和反向代理的區別:

  正向代理和反向代理在形式上服務的對象不一樣。正向代理代理的對象是客戶端,爲客戶端服務,反向代理的對象是服務端,爲服務端服務。

Nginx可支持的代理協議

  Nginx支持的代理協議很多,有HTTP、Websocket、GRPC等等,我們會對常用的HTTP、Websocket、GRPC、HTTPS協議。我們可以通過下圖看到目前Nginx支持的代理協議:



  常見的Nginx作爲反向代理支持協議有HTTP、HTTPS、WS、GRPC,Nginx支持這些協議所使用的模塊如下圖所示:




總結下來反向代理模式對應的Nginx配置模塊可以用一個表格表示成這樣:
反向代理模式 Nginx配置模塊
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module

Nginx作爲反向代理支持的協議很多,但是它作爲正向代理支持的常見協議很少,往往是HTTP協議,不能支持HTTPS協議,如下圖所示:


反向代理實戰篇

語法:proxy_pass URL;可以在location,if in location ,limit_except中配置,URL可以配置成:http://localhost:8000/uri/ https://ip:port/uri http://unix:/tmp/backend.socket:/uri/
測試:我們在其中一臺服務器的nginx.conf配置文件中配置:

    location ~ /indexzzm.html$ {
        proxy_pass http://123.206.36.54;
    }

凡是以indexzzm.html結尾的訪問都到123.206.36.54上面去訪問。
我們在47.100.199.15上對indexzzm.html的訪問發生了跳轉,說明我們的反向代理配置成功。


正向代理實戰篇

現在我們有兩臺服務器,一臺服務器的IP是http://47.100.199.15,另外一臺是http://123.206.36.54,現在我們希望只能通過123.206.36.54作爲代理的機器才能訪問47.100.199.15中的頁面。下面我們通過Nginx來完成這個步驟:
步驟1:配置47.100.199.15的配置文件,只允許123.206.36.54才能訪問。

location / {
        if ( $remote_addr !~* "^123\.206\.36\.54") {
            return 403;
        }
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

步驟2:驗證配置是否成功。我們在自己本機的電腦上去訪問http://47.100.199.15,會出現以下結果:



步驟3:在123.206.36.54上配置代理

    location / {
        proxy_pass http://$http_host$request_uri;
    }

步驟4:在google中配置代理:



步驟5:訪問


Nginx緩衝使用

  如果禁止緩衝,那麼當Nginx一收到後端的反饋就同時傳給客戶端。nginx不會從被代理的服務器讀取整個反饋信息
proxy_buffering
語法: proxy_buffering on|off
默認值: proxy_buffering on
上下文: http, server, location

這個參數用來控制是否打開後端響應內容的緩衝區,如果這個設置爲off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令將會失效。 但是無論proxy_buffering是否開啓,對proxy_buffer_size都是生效的。

proxy_buffering開啓的情況下,nignx會把後端返回的內容先放到緩衝區當中,然後再返回給客戶端(邊收邊傳,不是全部接收完再傳給客戶端)。 臨時文件由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定的。如果響應內容無法放在內存裏邊,那麼部分內容會被寫到磁盤上。

如果proxy_buffering關閉,那麼nginx會立即把從後端收到的響應內容傳送給客戶端,每次取的大小爲proxy_buffer_size的大小,這樣效率肯定會比較低。
nginx不嘗試計算被代理服務器整個響應內容的大小,nginx能從服務器接受的最大數據,是由指令proxy_buffer_size指定的.
proxy_buffers
語法: proxy_buffers the_number is_size;
默認值: proxy_buffers 8 4k/8k;
上下文: http, server, location該指令設置緩衝區的大小和數量,從被代理的後端服務器取得的響應內容,會放置到這裏. 默認情況下,一個緩衝區的大小等於內存頁面大小,可能是4K也可能是8K,這取決於平臺。
proxy_buffers由緩衝區數量和緩衝區大小組成的。總的大小爲number*size。
若某些請求的響應過大,則超過_buffers的部分將被緩衝到硬盤(緩衝目錄由_temp_path指令指定), 當然這將會使讀取響應的速度減慢, 影響用戶體驗。
proxy_busy_buffers_size
語法: proxy_busy_buffers_size size;
默認值: proxy_busy_buffers_size proxy_buffer_size * 2;
上下文: http, server, location, if
proxy_busy_buffers_size不是獨立的空間,他是proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完後端響應的時候就開始向客戶端傳送數據,所以它會劃出一部分緩衝區來專門向客戶端傳送數據(這部分的大小是由proxy_busy_buffers_size來控制的,建議爲proxy_buffers中單個緩衝區大小的2倍),然後它繼續從後端取數據,緩衝區滿了之後就寫到磁盤的臨時文件中。

Nginx跳轉重定向

語法:proxy_redirect redirect replacement;可以用在http,server,location中

Nginx頭信息

語法:proxy_set_header field value;
  經過反向代理後,由於在客戶端和web服務器之間增加了中間層,因此web服務器無法直接拿到客戶端的ip,通過remote_addr變量拿到的將是反向代理服務器的ip地址”。這句話的意思是說,當你使用了nginx反向服務器後,在web端使用request.getRemoteAddr()(本質上就是獲取remote_addr),取得的是nginx的地址,即remote_addr變量中封裝的是nginx的地址,當然是沒法獲得用戶的真實ip的,但是,nginx是可以獲得用戶的真實ip的,也就是說nginx使用remote_addr變量時獲得的是用戶的真實ip,如果我們想要在web端獲得用戶的真實ip,就必須在nginx這裏作一個賦值操作,如下:
proxy_set_header X-real-ip $remote_addr;
其中這個X-real-ip是一個自定義的變量名,名字可以隨意取,這樣做完之後,用戶的真實ip就被放在X-real-ip這個變量裏了,然後,在web端可以這樣獲取:
request.getAttribute("X-real-ip")

Nginx超時設置

語法:proxy_connect_timeout time;
默認:proxy_connect_timeout 60s;
上下文:http,server,location
此配置意思是,每個從Nginx分發的請求,連接到後臺(tomcat X)的連接如果超過60秒,則視爲連接失敗
proxy_read_timeout
nginx接收upstream server數據超時, 默認60s, 如果連續的60s內沒有收到1個字節, 連接關閉
proxy_send_timeout
nginx發送數據至upstream server超時, 默認60s, 如果連續的60s內沒有發送1個字節, 連接關閉
附一個Nginx中對上述語法的配置:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章