Nginx的正向代理和反向代理Nginx服務的一個重要功能——代理服務。在這里我們還得搞懂代理服務中正向代理和反向代理的區(qū)別,以及怎么使用他們,下面會進行講解。 正向代理簡介正向代理,意思是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(原始服務器),然后代理向原始服務器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端??蛻舳瞬拍苁褂谜虼?。 反向代理簡介反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網(wǎng)絡和服務器的負載,提高訪問效率。 正向代理的使用| 指令 | 值 | 作用 |
|---|
| resolver | address [valid=time] | 用于指定DNS服務器的IP地址。address=DNS服務器的IP地址(支持IPv6地址),time=設置數(shù)據(jù)包在網(wǎng)絡中的有效時間,如:resolver 8.8.8.8 114.114.114.114 valid=30s; | | resolver_timeout | time | 用于設置DNS服務器域名解析超時時間,time=超時時間 | | proxy_pass | URL | 用于設置代理服務器的協(xié)議和地址,URL=代理服務器的協(xié)議和地址,如:proxy_pass http://$http_host$request_uri; 其中$http_host和$request_uri為Nginx內(nèi)置變量 |
實例
vim /usr/local/nginx/conf/nginx.conf
添加:
server
{
resolver 8.8.8.8;
listen 81;
location /
{
proxy_pass http://$http_host$request_uri;
}
}
解釋:
#設置DNS服務器地址為8.8.8.8,使用默認的53端口作為DNS服務器的端口,代理服務的監(jiān)聽端口為81,Nginx接收到的所有請求都由location模塊處理
注意:Nginx正向代理不支持代理HTTPS協(xié)議的站點,不要在正向代理的server塊中出現(xiàn)server_name指令。 反向代理的使用| 指令 | 值 | 作用 |
|---|
| proxy_pass | URL | 設置被代理服務器的地址,可以是主機名稱、IP地址加端口號和UNIX-domain套接字形式。如:proxy_pass http://www.baidu.com/abc/、proxy_pass http://192.168.1.108:8080/abc/、proxy_pass http://unix:/tmp/abc.socket:/abc/。proxy_pass和upstream搭配使用時,看upstream中的server有沒有帶協(xié)議地址,沒有就在proxy_pass中帶,如:proxy_pass http://upstream_abc; | | proxy_hide_header | field | 設置Nginx服務器在發(fā)送HTTP響應時,隱藏一些頭部信息。field=需要隱藏的頭部信息。 | | proxy_pass_header | field | 默認情況下Nginx在發(fā)送響應報文時,報文頭中不包含“Date”、“Server”、“X-Accel”等來自代理服務器的頭部信息。該指令可以設置這些頭部信息已被發(fā)送。field=需要發(fā)送的頭部。 | | proxy_pass_request_body | on | off | 是否將客戶端請求的請求體發(fā)送給代理服務器。默認值為on(開啟)。 | | proxy_pass_request_headers | on | off | 是否將客戶端請求的請求頭發(fā)送給代理服務器。默認值為on(開啟)。 | | proxy_set_header | field value | 可以更改Nginx服務器接收到的客戶端請求的請求頭信息,然后將新的請求頭發(fā)送給被代理服務器。field=要更改的信息所在的頭域。value=更改的值,支持使用文本、變量或者變量的組合。 | | proxy_set_body | value | 可以更改Nginx服務器接收到的客戶端請求的請求體信息,然后將新的請求體發(fā)送給被代理服務器。value=為更改的信息,支持使用文本、變量或者變量的組合。 | | proxy_bind | address | 強制將與代理主機的連接綁定到指定的IP地址。address=指定主機的IP地址。 | | proxy_connect_timeout | time | 設置Nginx服務器與后端被代理服務器嘗試建立連接的超時時間。time=超時時間,默認為60s。 | | proxy_read_timeout | time | 配置Nginx服務器向后端被代理服務器發(fā)出read請求后,等待響應的超時時間。time=超時時間,默認為60s。 | | proxy_send_timeout | time | 配置Nginx服務器向后端被代理服務器發(fā)出write請求后,等待響應的超時時間。time=超時時間,默認為60s。 | | proxy_http_version | 1.0 | 1.1 | 設置Nginx服務器提供代理服務的HTTP協(xié)議版本。默認設置為1.0版本。1.1版本支持upstream服務器組設置中的keepalive指令。 | | proxy_method | method | 設置Nginx服務器請求被代理服務器時使用的請求方法。method=可以設置為POST或者GET。 | | proxy_ignore_client_abort | on | off | 設置在客戶端中斷網(wǎng)絡請求時,Nginx服務器是否中斷對被代理服務器的請求。默認值為off,當客戶端中斷網(wǎng)絡請求時,Nginx服務器中斷對被代理服務器的請求。 | | proxy_ignore_headers | field | 設置一些HTTP響應頭中的頭域,Nginx服務器接收到被代理服務器的響應數(shù)據(jù)后,不會處理被設置的頭域。field=要設置的HTTP響應頭的頭域。 | | proxy_redirect | redirect replacement | default | off | 用于修改被代理服務器返回的響應頭中的Location頭域和Refresh頭域。redirect=匹配Location頭域值的字符串,支持變量和正則表達式,replacement=用于替換redirect變量內(nèi)容的字符串,支持變量的使用,default=代表使用location塊的uri變量作為replacement,并使用proxy_pass變量做為redirect,off=將當前域下所有的proxy_redirect指令配置全部設置無效。 | | proxy_intercept_errors | on | off | 配置一個狀態(tài)是開啟還是關(guān)閉。開啟狀態(tài)時,如果被代理的服務器返回的HTTP狀態(tài)代碼為400或者大于400,則Nginx服務器使用自定義的錯誤頁(使用error_page指令)。如果是關(guān)閉狀態(tài),Nginx服務器直接將被代理服務器返回的HTTP狀態(tài)返回給客戶端。 | | proxy_headers_hash_max_size | size | 存放HTTP報文頭的hash表的容量。size=HTTP報文頭hash表的容量上限,默認為512字符。proxy_headers_hash_max_size 512; | | proxy_headers_hash_bucket_size | size | 申請存放HTTP報文頭部的hash表容量的單位大小。size=設置的容量,默認為64字符。 | | proxy_next_upstream | status | 在配置Nginx反向代理功能時,如果使用upstream指令配置了一組服務器作為被代理服務器,服務器組中各服務器的訪問規(guī)則遵循upstream指令配置的輪詢規(guī)則,同時可以使用該指令配置在發(fā)生異常情況時,將請求順次交由下一個組內(nèi)服務器處理。status=為設置的服務器返回狀態(tài),可以是一個或者多個,這些狀態(tài)有error(在建立連接、向被代理的服務器發(fā)送請求或者讀取響應頭時服務器發(fā)生連接錯誤)、timeout(在建立連接、向被代理的服務器發(fā)送請求或者讀取響應頭時服務器發(fā)生連接超時)、invalid_header(被代理服務器返回的響應頭為空或者無效)、http_500|http_502|http_503|http_504|http_404(被代理服務器返回500、502、503、504、404狀態(tài)代碼)、off(無法將請求發(fā)送給被代理服務器) | | proxy_ssl_session_reuse | on | off | 是否使用基于SSL安全協(xié)議的會話連接(“https://”)被代理的服務器 |
注意:反向代理一般都是跟負載均衡一起使用。 實例
vim /usr/local/nginx/conf/nginx.conf
添加:
... #其他配置
upstream backend{
server 192.168.1.108;
server 192.168.1.109;
}
server
{
... #其他配置
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set X-Real-IP $remote_addr;
proxy_set X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
負載均衡使用文章最下面介紹了upstream的server指令。 Nginx常見負載均衡算法和第三方負載均衡算法 動靜分離動靜分離其實很簡單,就是靜態(tài)文件交給Nginx(這里擔任了單獨處理靜態(tài)文件的WEB服務器)處理,動態(tài)的資源就交給后端的服務器,比如(Tomcat、Nginx、Apache)。 vim /usr/local/nginx/conf/nginx.conf
添加:
... #其他配置
server
{
... #其他配置
#動態(tài)資源交給后端處理
location ~.*\.(jsp|php)$ { #文件格式可以自己添加
proxy_pass http://192.168.1.109;
}
#靜態(tài)資源本臺Nginx進行處理
location ~.*\.(html|js|css|gif|jpg|jpeg|png)$ { #文件格式可以自己添加
root html;
index index.html index.htm;
#expired 10d; #如果想要靜態(tài)文件緩存的話就用此命令,緩存時間為10天
|