Nginx 學習總結(5) —— 反向代理

這是 Nginx 學習總結的第五篇,上一篇介紹到了 Nginx 學習總結(4)—— Rewrite 模塊,這一篇會對 反向代理 相關知識作一些總結。php

什麼是代理?代理一般用於在多個服務器之間分配負載,無縫地顯示來自不一樣網站的內容,或經過除 HTTP 之外的協議將請求處理傳遞給應用程序服務器。

代理請求

當 Nginx 代理請求時,它會將請求發送到指定的代理服務器,獲取響應並將其發送回客戶端。容許將請求代理到 HTTP 服務器(另外一個 Nginx 服務器或任何其餘服務器),或使用一個特定的協議到非 HTTP 服務器(它能夠運行特定框架開發的應用程序,如 PHPPython),支持的協議包括 FastCGIuwsgiSCGImemcachedhtml

若是想將一個請求傳遞(反向代理)給 HTTP 代理服務器,須要在 Location 模塊中指定 proxy_pass 指令,例如:nginx

location /some/path/ {
    proxy_pass http://www.example.com;
}

# 發送以下請求
# curl 127.0.0.1:80/some/path/
# 該請求會傳遞到 www.example.com 服務器中處理

傳遞地址能夠指定爲域名或 IP 地址,使用 IP 地址時應當指定一個端口:segmentfault

location ~ \.php {
    proxy_pass http://127.0.0.1:8080;
}

若是想將一個請求傳遞(反向代理)給非 HTTP 代理服務器,應當合理選擇使用以下指令:後端

  • fastcgi_pass 將請求傳遞給 FastCGI 服務器;
  • uwsgi_pass 將請求傳遞給 uwsgi_pass 服務器;
  • scgi_pass 將請求傳遞給 SCGI 服務器;
  • memcached_pass 將請求傳遞給 memcached 服務器。
location ~ \.php$ {
    root           /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

須要注意的是,傳遞地址後面是否帶有 /,轉發的 URL 是不一樣的:緩存

location ^~ /static/ { 
    proxy_pass http://www.test.com; # 傳遞地址後面不加 "/",轉發地址將包含匹配參數
}
# 發送以下請求
# curl http://localhost/static/index.html
# 轉發到 http://www.test.com/static/index.html
location ^~ /static/ { 
    proxy_pass http://www.test.com/; # 傳遞地址後面帶有 "/",轉發地址將不包含匹配參數
}
# 發送以下請求
# curl http://localhost/static/index.html
# 轉發到 http://www.test.com/index.html

傳遞請求頭

默認狀況下, Nginx 會從新定義請求頭:Host 設置爲 $proxy_host 變量的值;Connection 設置爲 close;其餘空字符串的頭字段會被移除。經過 proxy_set_header 指令能夠改變請求頭字段的值。該指令能夠在 location 塊或更高級的塊中指定,好比 serverhttp。咱們來看一個傳遞請求頭的應用:服務器

location /some/path/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for; # 後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
    proxy_set_header Accept-Encoding "";  
    proxy_pass http://localhost:8000;
}

配置緩衝區

默認狀況下, Nginx 緩衝來自代理服務器的響應。響應存儲在內部緩衝區中,在接收到整個響應以前不會發送給客戶端。緩衝有助於優化慢速客戶端的性能,由於若是響應是從 Nginx 同步傳遞到客戶端,可能會浪費代理服務器的時間。啓用緩衝後,Nginx 容許代理服務器快速處理響應,而 Nginx 在客戶端須要下載它們時,將盡量多的緩存響應內容。框架

是否啓用緩衝使用 proxy_buffering 指令,默認是開啓的。proxy_buffers 指令控制分配給請求的緩衝區的大小和數量,來自代理服務器的響應的第一部分存儲在一個單獨的緩衝區中,其大小由 proxy_buffer_size 指令設置:curl

location /some/path/ {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8000;
}

若是緩衝被禁用,則在從代理服務器接收到響應的同時將響應同步發送到客戶端。對於須要儘快開始接收響應的快速交互式客戶端來講,這種行爲多是須要的:ide

location /some/path/ {
    proxy_buffering off;
    proxy_pass http://localhost:8000;
}

參考文章:

  1. NGINX Reverse Proxy
  2. proxy_pass 的小說明
  3. Module ngx_http_proxy_module
相關文章
相關標籤/搜索