Nginx做爲反向代理服務器時轉發請求的流程
客戶端請求處理
-
- 當客戶端請求來時,Nginx並不會馬上轉發到上游服務器,而是想完整的接收到Nginx所在的服務器,
- 而後再把緩存的客戶端的請求轉發到上游服務器。
- 優缺點
- 缺點:請求處理延遲
- 優勢:下降上游服務器的負載
- 因爲網絡,以及TCP分包的緣由;一個大的數據包,極可能須要多個TCP鏈接來接受,這樣若是一接受到就轉發,那麼傳完一個請求就須要多個TCP鏈接,對併發性提出考驗。
- Nginx先把整個請求都放到本身的內存或硬盤中,等待這個請求的全部包都過來了,而後一次性 傳到上游服務器,這樣下降了對上游服務器的併發要求,並且由Nginx於上游服務器時內網,傳輸速度更快。
使用場景
非模式匹配定義--uri 不帶入上游
location /bbs {
proxy_pass http://www.magedu.com:8080/;
}
訪問 www.localhost.com/bbs -->
代理到 www.mageedu.com:8080/
模式匹配定義--
uri帶入上游
若是location的URI是經過模式匹配定義的,其URI將直接被傳遞至上游服務器,而不能爲其指定轉換的另外一個URI。
location ^~ /bbs {
proxy_pass http://www.magedu.com;
}
訪問: www.localhost.com/bbs
代理到 www.mageedu.com/bbs
注意:此時的上游服務器是不容許有URI 的,不然URL都無效 轉至上游服務器的主頁;
而若是使用正則表達式的URI如 ~ ~* 此時上游服務器帶URI則報錯
具體報錯
"proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"
重定向--使用重定向URI 替代反向代理URI
若是在loation中使用的URL重定向,那麼nginx將使用重定向後的URI處理請求,而再也不考慮上游服務器上定義的URI。
以下面所示的例子中,傳送給上游服務器的URI爲/index.php?page=<match>,而不是/index。.
location / {
rewrite /(.*)$ /index.php?page=$1 break;
proxy_pass www.mageedu.com:8080/index;
}
訪問: www.localhost.com/index.php
代理到 www.mageedu.com:8080/index.php?page=$1
proxy模塊指令
- proxy_connect_timeout
- nginx將一個請求發送至upstream server以前等待的最大時長;
- proxy_cookie_domain:
- 將upstream server經過Set-Cookie首部設定的domain屬性修改成指定的值,
- 其值能夠爲一個字符串、正則表達式的模式或一個引用的變量;
- proxy_cookie_path:
- 將upstream server經過Set-Cookie首部設定的path屬性修改成指定的值,
- 其值能夠爲一個字符串、正則表達式的模式或一個引用的變量;
- proxy_hide_header:
- proxy_pass:
- 指定將請求代理至upstream server的URL路徑;
- proxy_set_header:
- 將發送至upsream server的報文的某首部進行重寫;
- proxy_redirect:
- 重寫location並刷新從upstream server收到的報文的首部;
- proxy_send_timeout:
- 在鏈接斷開以前兩次發送至upstream server的寫操做的最大間隔時長;
- proxy_read_timeout:
- 在鏈接斷開以前兩次從接收upstream server接收讀操做的最大間隔時長;
反向代理性能優化
在反向代理場景中,nginx有一系列指令可用於定義其工做特性,如緩衝區大小等,給這些指令設定一個合理的值,能夠有效提高其性能。
緩衝區設定
nginx在默認狀況下在將其響應給客戶端以前會盡量地接收來自upstream服務器的響應報文,它會將這些響應報文存暫存於本地並儘可能一次性地響應給客戶端。
然而,在來自於客戶端的請求或來自upsteam服務器的響應過多時,nginx會試圖將之存儲於本地磁盤中,這將大大下降nginx的性能。
所以,在有着更多可用內存的場景中,應該將用於暫存這些報文的緩衝區調大至一個合理的值。
- proxy_buffer_size size
- 設定用於暫存來自於upsteam服務器的第一個響應報文的緩衝區大小;
- proxy_buffering on|off:
- 啓用緩衝upstream服務器的響應報文,
- 不然,若是proxy_max_temp_file_size指令的值爲0,來自upstream服務器的響應報文在接收到的那一刻將同步發送至客戶端;
- 通常狀況下,啓用proxy_buffering並將proxy_max_temp_file_size設定爲0可以啓用緩存響應報文的功能,並可以避免將其緩存至磁盤中;
- proxy_buffers 8 4k|8k
- 用於緩衝來自upstream服務器的響應報文的緩衝區大小;