1. 程式人生 > >nginx反向代理功能及常用配置

nginx反向代理功能及常用配置

反向代理指的是用代理伺服器來響應客戶端的請求,然後根據一定的排程演算法將請求傳送到後端伺服器,當後端伺服器處理完請求後,再將請求處理的結果傳送給反向代理伺服器,由代理伺服器將處理結果傳送給客戶端的一種資料請求模式。
Nginx作為近年來比較火的反向代理伺服器,主要用於轉發客戶機請求,後臺有多個http伺服器提供服務,nginx的功能就是把請求轉發給後面的伺服器,決定哪臺目標主機來處理當前請求。

nginx反向代理功能及常用配置
後端的伺服器我們在這裡稱為upstream server,在上圖所示中,中間的反向代理伺服器,首先自己扮演一個使用者所請求的資源伺服器,比如http伺服器,然後接受客戶端的請求,將請求報文拆解封裝,根據請求的內容,再把自己扮演成客戶端將請求傳送到後端upstream server進行資源獲取。取得資源之後,反向代理伺服器將反饋回來的的資源資料包進行拆除,然後由自己進行封裝反饋給客戶端。客戶端看來就是反向代理伺服器自己在響應資源請求。
反向代理伺服器是工作在應用層的,所以它能夠取得使用者所請求的URL,然後根據請求檔案的字尾名決定將請求排程到哪一種伺服器上面去。 nginx工作在應用層面, 通訊需要藉助套接字,最大併發能力大概在65535的一半。
其中為了保持反向代理伺服器的正常執行可以基於DNS域名解析做輪詢排程,也可以用keepalived做高可用性。
在nginx反向代理的組織架構中日誌分析記錄應該怎樣實現?
客戶端將請求傳送給反向代理伺服器,此時源IP為cip目標IP為pip,代理伺服器通過nginx程序對資料包進行拆包,分析使用者請求的資源,然後將資料包封裝起來發送給後端的upstream server,此時源IP為lip,目標IP為uip,此時後端的upstream server伺服器日誌記錄的所有請求ip應該都為反向代理伺服器的lip地址,無法獲取到客戶端的真實IP地址。所以日誌分析可以加在代理伺服器上面,對客戶端的請求做使用者行為分析。當然代理伺服器在向後端傳送資料包的時候可以給它加一個自定義的首部;在自定義的首部說明對應的請求客戶端的ip地址,後端伺服器在記錄日誌時只記錄新新增的首部的ip資訊,這樣就可以獲取到客戶端的真時ip地址。

nginx反向代理伺服器的定義格式及常用配置引數
ngx_httpproxy module模組:nginx反向代理模組
格式為:

server{
            listen   port#;
            server_name
            location  /  {
                    proxy_pass http://upstream_server:port/;         //port可以省略
                        }
            }

例如將客戶端的請求通過反向代理伺服器傳送到後端的web1主機,只需要在nginx的主配置檔案的location欄位中定義

location  /   {
                porxy_pass  http://web1/;
                proxy_set_header Host  $host;
        proxy_set_header X-Real-IP $remote_adrr;      //同時將客戶端的真實IP地址與主機名新增在資料包首部,傳遞給後端伺服器。
                    }

url的重定向

location /url {
            proxy_pass http://upstream_server:port/newurl;  表示客戶端請求的是一個URL,然後排程器排程到一個新的URL上面去
                }

使用正則表示式進行url的匹配

location ~* \.(jpg|png|gif)$ {
                proxy_pass http://upstream_port;    //無論正則表示式匹配到的是什麼都會自動補到ip地址的後面
                }

例如在後端伺服器上的web目錄下上傳一張.jpg格式的檔案,然後在nginx反向代理伺服器的主配置檔案中用正則表示式定義url

location ~* \.(jpg|png|gif)$ {
                proxy_pass   http://upstream_server;  
                }

upstream負載均衡模組:只能定義在http中,內部使用server指令
例如我們有多臺upstream server主機,此時反向代理伺服器需要在http欄位定義

upstream up_name {
            server upstream_server1;
            server upstream_server2;
            server upstream_server3;
            ……;
        }

當我們定義了upstream功能之後在呼叫時只需要在location中使用upstream定義欄位的名字即可

location / {
                proxy_pass  http://up_name/;      //這樣定義反向代理伺服器在接收到客戶端的請求之後會根據排程演算法將請求傳遞給所有定義在upstream中的伺服器。
        }

nginx反向代理的快取功能定義
作業系統的快取靠鍵值儲存,其中鍵是存放在記憶體中的,值存放在磁碟中,記憶體中存放的鍵其實就是url加上磁碟存放的值對應的節點號,反向代理可以定義快取在磁碟中存放時可以使用多少級子目錄來存放值。
如果啟用反向代理伺服器的快取功能需要在nginx的主配置檔案中的http欄位來定義,格式為

proxy_cache_path  path    levels=num:num keys_zone=cache_name:#m
具體事例
proxy_cache_path  /cache/ngxin  levels=1:1 keys_zone=mycache:32m   //表示定義一個名稱為mycache的2級快取,每級快取使用1個字元進行標識,快取路徑為/cache/nginx,快取空間大小為32M

使用快取只需要在location中引用名稱以及一些引數即可

location  /  {
                proxy_cache  mycache;
                proxy_cache_valid 200 1d;  //返回結果為200的快取時間為1天;
                proxy_cache_valid  301 302 10m;  //返回結果為301,302的快取時間為10分鐘;
                prixy_cache_valid  ant 1m; //其它的快取時間為1分鐘;
                proxy_cache_use_stale  error  timeout; //如果返回結果為錯誤,或者請求超時則返回給客戶端一個陳舊的快取資訊
                proxy_pass   http://up_upstream/;
        }

反向代理伺服器為upstream server伺服器做健康狀態檢查

upstream up_name  {
            server upstream_server1 max_fails=2 fail_timeout=1;   //單位週期為1的時間內,達到2次請求失敗則標記為節點不可用,並等待下一個週期的檢查,判斷其是否恢復正常。
            server upstream_server2 max_fails=2 fail_timeout=1;
        }

備用伺服器的標記

upstream up_name  {
            server upstream_server1 ;   
            server upstream_server2 backup;    //標記此伺服器為備用伺服器,只有主伺服器出現故障時,此伺服器才會工作,否則處於待機狀態。

其它一些配置定義在location的引數

proxy_connect_tineout:會話超時時長
proxy_read_tineout:等待響應會話時長
proxy_hide_header:隱藏由反向代理伺服器響應給客戶端時指定的首部