本文爲翻譯文,原文地址:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/php
本文描述代理服務器的基本配置。你能學到如何將一個請求在不一樣的協議上從nginx轉發到被代理服務器,如何修改被轉發到被代理服務器的客戶端的請求頭,如何配置來自被代理服務器的響應的緩存。html
代理一般用於將負載分發到幾個服務器中,無縫地從不一樣的網站獲取內容,或者轉發請求到不一樣的服務器。nginx
當nginx代理一個請求,它發送這個請求到指定的被代理服務器,獲取響應,而後發送響應會客戶端。也可能使用特別的協議代理請求到一個HTTP服務器(其餘nginx服務器或其餘任意服務器)或一個非HTTP服務器(好比運行PHP或Pyhton開發的應用)。支持的協議包括FastCGI、uwsgi、SCGI、memcached。web
proxy_pass指令在一個location塊中,用於轉發一個請求到HTTP被代理服務器。好比:緩存
location /some/path/ { proxy_pass http://www.example.com/link/;}
此配置表示代理在此location處理的所有請求到指定地址的被代理服務器。此地址能夠用域名或IP表示,地址可能須要包含端口。性能優化
location ~ \.php { proxy_pass http://127.0.0.1:8000;}
請注意上面的第一個示例,被代理服務器的地址後面跟着是一個URI(統一資源標識符),/link/。若是有URI被配置在地址中,它會替換匹配location的部分。好比,請求地址爲/some/path/page.html,會被代理到http://www.example.com/link/page.html。若是地址沒有URI,或者不能肯定替換的部分,整個請求URI被轉發。服務器
**_pass指令用於轉發請求到一個非HTTP被代理服務器:網絡
請注意在這些狀況,指定地址的規則可能不相同。你可能須要轉發其它參數到服務器(請查看這裏更多細節)。app
proxy_pass指令能夠轉發到一個服務器組。在這些狀況中,請求在服務器組中根據指定的機制被分發。ide
默認狀況下,nginx在代理請求中重定義兩個請求頭,Host和Connection,而且清除值爲空的請求頭。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_pass http://localhost:8000;}
在此配置中,Host請求頭被設置爲$host變量。
爲了防止請求頭被轉發到被代理服務器,能夠將值設置爲空字符串,好比:
location /some/path/ { proxy_set_header Accept-Encoding ""; proxy_pass http://localhost:8000;}
默認請求下,nginx會緩存被代理服務器的響應。響應會被儲存在內部緩存中,直到整個響應接收完畢才發送到客戶端。緩存有助於慢的客戶端的性能優化,由於響應從nginx同步返回給客戶端會浪費被代理服務器的時間。然而,當緩存啓動後,nginx容許被代理服務器快速地返回響應,nginx存儲響應使客戶端有更多的時間下載響應。
broxy_buffering用於表示緩存是否開啓,默認是開啓的。
Proxy_buffers控制分配的緩存區的大小和數量。響應的第一部分會被存儲在一個單獨的緩存中,緩存的大小由proxy_buffer_size指令設置。這部分一般包含相對較小的響應頭。
若是設置緩衝不可用,當接收被代理服務器的響應時,響應會同步地發送到客戶端。此設置或許是但願快速互動的客戶所須要的。
想要設置緩衝不可用,將location下的proxy_buffering設爲off便可,以下所示:
location /some/path/ { proxy_buffering off; proxy_pass http://localhost:8000;}
這種狀況下,nginx只使用proxy_buffer_size配置的緩衝區去存儲當前部分的響應。
若是你的代理服務器有幾個網絡接口,你或許須要選擇一個特定的IP地址去鏈接被代理服務器或上游服務器。這在一個被代理服務器配置了只接受指定IP地址的請求時就有用了。
聲明proxy_bind和指定的網絡接口的IP:
location /app1/ { proxy_bind 127.0.0.1; proxy_pass http://example.com/app1/;} location /app2/ { proxy_bind 127.0.0.2; proxy_pass http://example.com/app2/;}
IP地址也能夠爲一個變量。好比$server_addr變量表示接收請求的網絡接口的IP:
location /app3/ { proxy_bind $server_addr; proxy_pass http://example.com/app3/;}