這是 Nginx 學習總結的第五篇,上一篇介紹到了 Nginx 學習總結(4)—— Rewrite 模塊,這一篇會對 反向代理
相關知識作一些總結。php
什麼是代理?代理一般用於在多個服務器之間分配負載,無縫地顯示來自不一樣網站的內容,或經過除 HTTP 之外的協議將請求處理傳遞給應用程序服務器。
當 Nginx 代理請求時,它會將請求發送到指定的代理服務器,獲取響應並將其發送回客戶端。容許將請求代理到 HTTP 服務器(另外一個 Nginx 服務器或任何其餘服務器),或使用一個特定的協議到非 HTTP 服務器(它能夠運行特定框架開發的應用程序,如 PHP
或 Python
),支持的協議包括 FastCGI
、uwsgi
、SCGI
和 memcached
。html
若是想將一個請求傳遞(反向代理)給 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
塊或更高級的塊中指定,好比 server
或 http
。咱們來看一個傳遞請求頭的應用:服務器
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; }
參考文章: