Nginx反向代理

辣雞小籃子發表於2019-05-15

1.簡介

 

 

 

Nginx是一個反向代理伺服器,其啟動速度極快、佔用記憶體極少、抗高併發能力強,因此大量在網際網路專案中應用。

Nginx訪問速度快的原因:

1.動靜分離,靜態資源由Nginx直接進行管理,動態請求轉發到後端。

2.Worker中的執行緒是AIO的(非同步非阻塞),當接收到請求後會將其放入到佇列中,然後繼續接收新的請求。

3.可以指定Master和Worker之間的IO多路複用模型。

 

 

2.正向代理與反向代理

 

2.1 正向代理

 

 

正向代理:代理的是客戶端,伺服器並不知道客戶端的是通過VPN進行訪問的。

 

2.2 反向代理

 

 

反向代理:代理的是伺服器,客戶端並不知道請求具體傳送到哪個伺服器中。

 

 

3.Nginx的工作模型

 

 

Nginx使用Master和Worker工作模型,一個Nginx服務由一個Master和多個Worker程式組成。

 

3.1 Master程式

Master程式負責讀取nginx.conf配置檔案以及管理Worker程式。

 

3.2 Worker程式

Worker程式負責處理連線和請求,且每個Worker程式中維護一個執行緒。

 

 

4.Nginx常用功能

 

4.1 通過Nginx管理靜態資源

location ~ \.(gif|jpg|png|js|css)$ {
    root static;
}

*使用root表示返回靜態資源,root指定資源的根目錄(相對於Nginx安裝目錄)

*當匹配到此Location後,會進入root指定的根目錄,然後根據請求的/path訪問靜態資源。 

 

4.2 通過Nginx進行反向代理到某個指定URL

location = /baidu{
    proxy_pass  http://ip:port/adserving/baidu;
}

*使用proxy_pass表示反向代理,將使用者的請求動態轉發到某個URL。 

*當使用了反向代理,那麼對於Tomcat而言使用者的IP即Nginx的地址,如果想要檢視使用者的IP,那麼需要從Nginx日誌中檢視。

 

4.3 通過Nginx實現負載均衡

upstream name{
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

location /path {
    proxy_pass  http://name;
}

*當使用了負載均衡,那麼請求在動態轉發時會攜帶請求的/path。 

*當使用了負載均衡叢集,那麼要注意叢集間Session的共享問題,可以將Session物件放入一個公共區域,當獲取Session時從公共區域中查詢。 

 

負載均衡策略:輪詢指定權重對使用者IP進行Hash

 

1.輪詢:當不指定weight時,各個伺服器的權重相同,每個請求按訪問時間的順序逐一分配到各個伺服器中,如果伺服器發生故障,能被自動剔除。

upstream name{
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

 

2.指定權重:權重與訪問率成正比,如果伺服器發生故障,能被自動剔除。

upstream name{
    server ip:port weight=1 ;
    server ip:port weight=2 ;
    server ip:port weight=3 ;
}

 

3.對使用者IP進行Hash:以元素的關鍵字k作為自變數,通過H(K)雜湊函式計算出雜湊值,以該雜湊值坐落在Hash環上的位置,找到其對應處理的節點,這裡的自變數就是使用者的IP,如果伺服器發生故障,不會自動被剔除。

upstream name{
    ip_hash ;
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

*如果使用對使用者IP進行Hash的負載均衡策略,那麼每個使用者就固定訪問後端的一個節點,就能避免叢集間Session共享問題。

 

 

5.Nginx配置

 

#Nginx全域性配置

events {
    #Event事件配置
}

http {
    #HTTP全域性配置
    server {
        #Server全域性配置
        #Location配置
    }
}

 

5.1 Nginx全域性配置

Nginx全域性配置主要包括:執行Nginx服務的所屬組、 Worker程式的數量、錯誤日誌存放路徑、Master程式ID等。

#指定執行Nginx的所屬組
user root;

#worker程式數量(建議CPU數量 x 核數)
work_processed 12;

#錯誤日誌存放路徑(相對於Nginx安裝目錄)
error_log logs/error.log;

#Master程式ID的存放路徑(相對於Nginx安裝目錄)
pid logs/nginx.pid;

 

5.2 Event事件配置

Event事件配置主要包括: Worker程式處理連線與請求的細節、事件驅動模型的選擇等。

#設定多個Worker程式接收一個新連線的方式
#當值為on時,當一個新的連線到達時,只有一個Worker程式被喚醒(預設)
#當值為off時,當一個新的連線到達時,所有的Worker程式都被喚醒,共同爭奪這個連線。
accept_mutex on;

#設定Worker程式一次是否能處理多個新的連線
#當值為on時,Worker程式一次能夠接收多個新的連線(預設)
#當值為off時,Worker程式一次只能接收一個新的連線。
multi_accept on;

#事件驅動模型選擇,可選select、poll、epoll、kqueue
use epoll;

#Worker程式最大連線數(預設512)
worker_connections 1024;

 

5.3 HTTP全域性配置

HTTP全域性配置主要包括:請求的MIME型別、是否允許sendFile方式傳輸檔案、負載均衡、長連線超時時間、長連線的最大請求數。

#指定請求的MIME型別,可以指定多個
types{
   text/html        html htm shtml;
   text/css         css;
   text/xml         xml;
   ......
}

#負載均衡
upstream name{
    ip:port;
    ip:port;
    ip:port;
}

#整個HTTP服務的訪問日誌(相對於Nginx安裝目錄),並且指定日誌列印的格式
access_log logs/access_all.log main

#定義日誌的列印格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';

#設定是否允許sendFile傳輸檔案
sendFile on;

#長連線的超時時間,若在指定時間內連線沒有傳送新的請求,那麼該連線將會被關閉
keepalive_timeout 600s;

#長連線可傳送的最大請求數,當連線累計傳送的請求數到達指定大小時,連線將會被關閉
keepalive_requests 1000;

*Nginx中預設使用長連線的方式,一個連線中可以傳送多個請求。 

 

5.4 Server全域性配置

Server全域性配置主要包括:繫結基於域名或IP的虛擬主機、監聽的TCP埠。

#繫結基於域名或者IP的虛擬主機
server_name 192.168.2.90;

#監聽的TCP埠
listen 80;

#整個Server的訪問日誌,並且指定日誌列印的格式
access_log logs/192.168.2.90.access.log main;

#Nginx直接返回的指定狀態碼直接重定向
error_page 404 500 502 /error.html

*server_name只能繫結本機的IP或者域名,不能是其他主機的。 

*error_page只適用於由Nginx直接返回的狀態碼,不適用於轉發到後端返回的狀態碼。

*不允許在Server中定義日誌的列印格式,只能使用HTTP全域性配置中定義的日誌列印格式。 

 

5.5 Location配置

Location主要為了匹配使用者訪問的URL,使其進入相應的邏輯處理。

location 匹配符 path{

}

 

*匹配符優先順序:精確匹配 > 正則匹配(第一個符合的正則)> URL最長匹配

*其中^~與不使用直接/path作用一樣,都是URL字尾匹配。

*access_log、error_log、pid、root都是相對於Nginx的安裝目錄,而include是相對於conf目錄。  

 

 

6.Nginx訪問流程

 

 

 

1.客戶端向Nginx發起HTTP請求。

2.進入Nginx的HTTP模組,然後根據請求的IP與埠進入相應的Server。

3.根據請求的/path匹配Location,若找不到相應的Location,則由Nginx直接返回404狀態碼,否則進入相應的Location進行處理。

4.日誌中記錄請求的相關資訊。

 

 

7.Nginx安裝與使用

 

7.1 下載Nginx安裝包並解壓

http://nginx.org/en/download.html 

 

7.2 編譯以及安裝

#配置,指定Nginx的安裝目錄
./configure --prefix=/usr/nginx

#編譯與安裝
make & make install

*Nginx是由C語言進行編寫的,因此需要使用gcc編譯器進行編譯。

 

安裝成功後的目錄結構:

*其中conf目錄存放著Nginx的相關配置檔案,html目錄存放nginx預定義的靜態資原始檔,logs目錄用於存放日誌,sbin目錄包含nginx程式,用於啟動Nginx。

 

7.3 修改nginx配置檔案

user  root;
worker_processes  8;
error_log  logs/error.log;
pid        logs/nginx.pid;


events {
    accept_mutex on;
    multi_accept on;
    use epoll;
    worker_connections 1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  600s;
    keepalive_requests 1000; 

    upstream loadBalance {
       server 192.168.2.90:8080;
       server 192.168.2.91:8080;
       server 192.168.2.93:8080;
    }

    server {
        listen       80;
        server_name  192.168.2.90;
        access_log  logs/192.168.2.90.access.log  main;

        #精確匹配,適用於網站首頁
        location = / {
            proxy_pass http://192.168.2.90:8080/web/index.html;
        }

        #匹配URL,負載均衡
        location / {
            proxy_pass http://loadBalance;
        }

        #正則匹配,靜態資源直接返回
        location ~ \.(gif|jpg|png|js|css)$ {
            root static;
        }

    }
 

}

 

7.4 啟動Nginx

*當Nginx服務啟動後,會啟動一個Master程式和多個Worker程式。

 

7.5 Nginx常用命令

#啟動nginx,預設載入conf/nginx.conf配置檔案,可以使用-c選項配置
./nginx

#檢查nginx.conf配置檔案
./nginx -t

#重啟Nginx(熱部署)
./nginx -s reload

#關閉nginx
./nginx -s stop

 

 

8.Keepalived實現Nginx的高可用

 

由於Nginx作為流量的入口,一旦Nginx發生故障時則無法對外提供服務,因此需要通過Keepalived實現Ngixn的高可用。

Keepalived是一個高可用叢集的解決方案,其使用VRRP協議(Virtual Router Redundancy Protocol),其對外提供一個虛擬IP,使用者的請求直接到達虛擬IP,然後進入狀態為Master的Keepalived節點,當狀態為Master的Keepalived節點故障時,會自動將狀態為Backup的Keepalived節點切換為Master狀態。

 

 

*每個包含Nginx服務的節點中都需要安裝Keepalived服務,並且需要自定義一個指令碼去定時檢測Nginx的程式狀態,當發現Nginx故障時,及時kill掉本節點的Keepalived服務。

 

相關文章