1. 程式人生 > >Nginx反向代理和配置詳解(正向代理、反向代理、負載均衡原理、Nginx反向代理原理和配置講解)

Nginx反向代理和配置詳解(正向代理、反向代理、負載均衡原理、Nginx反向代理原理和配置講解)

nginx概述

nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外nginx可以作為反向代理進行負載均衡的實現。

Nginx是一款開原始碼的高效能HTTP伺服器和反向代理伺服器,同時支援IMAP/POP3/SMTP代理服務
1.Nginx工作原理
Nginx由核心和模組組成,完成工作是通過查詢配置檔案將客戶端請求對映到一個location block(location是用於URL匹配的命令),location配置的命令會啟動不同模組完成工作。
Nginx模組分為核心模組,基礎模組和第三方模組。
核心模組:HTTP模組、EVENT模組(事件)、MAIL模組。
基礎模組:HTTP Access模組、HTTP FastCGI模組、HTTP Proxy模組、HTTP Rewrite模組。
第三方模組:HTTP Upstream Request Hash模組、Notice模組、HTTP Access Key模組。
在這裡插入圖片描述


效能優勢
web伺服器,處理靜態檔案、索引檔案以及自動索引效率高。
代理伺服器,快速高效反向代理,提升網站效能。
負載均衡器,內部支援Rails和PHP,也可支援HTTP代理伺服器,對外進行服務。同時支援簡單容錯和利用演算法進行負載均衡。
效能方面,Nginx專門為效能設計,實現注重效率。採用Poll模型,可以支援更多的併發連線,並在大併發時佔用很低記憶體。
穩定性方面,採用分階段資源分配技術,使CPU資源佔用率低。
高可用性方面,支援熱備,啟動迅速。
這裡主要通過三個方面簡單介紹nginx

反向代理
負載均衡
nginx特點

1. 反向代理

關於代理

說到代理,首先我們要明確一個概念,所謂代理就是一個代表、一個渠道;

此時就設計到兩個角色,一個是被代理角色,一個是目標角色,被代理角色通過這個代理訪問目標角色完成一些任務的過程稱為代理操作過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是使用者。

在這裡插入圖片描述
正向代理

說反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會從兩個方面來說關於正向代理的處理模式,分別從軟體方面和生活方面來解釋一下什麼叫正向代理

在如今的網路環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求傳送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的資料傳遞給我們!

上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的伺服器地址;伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端;正向代理模式遮蔽或者隱藏了真實客戶端資訊。
在這裡插入圖片描述
反向代理

明白了什麼是正向代理,我們繼續看關於反向代理的處理方式,舉例如我大天朝的某寶網站,每天同時連線到網站的訪問人數已經爆表,單個伺服器遠遠不能滿足人民日益增長的購買慾望了,此時就出現了一個大家耳熟能詳的名詞:分散式部署;也就是通過部署多臺伺服器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用nginx進行反向代理實現的,並且通過封裝nginx和其他的元件之後起了個高大上的名字:Tengine,有興趣的童鞋可以訪問Tengine的官網檢視具體的資訊:http://tengine.taobao.org/

那麼反向代理具體是通過什麼樣的方式實現的分散式的叢集操作呢,我們先看一個示意圖:
在這裡插入圖片描述通過上述的圖解大家就可以看清楚了,多個客戶端給伺服器傳送的請求,nginx伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪臺伺服器處理的並不明確了,nginx扮演的就是一個反向代理角色。

反向代理,主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊!

專案場景
通常情況下,我們在實際專案操作時,正向代理和反向代理很有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標伺服器,目標伺服器是一個反向單利伺服器,反向代理了多臺真實的業務處理伺服器。具體的拓撲圖如下:
在這裡插入圖片描述
2. 負載均衡

我們已經明確了所謂代理伺服器的概念,那麼接下來,nginx扮演了反向代理伺服器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的專案應用場景,分發的規則是否可以控制呢?

這裡提到的客戶端傳送的、nginx反向代理伺服器接收到的請求數量,就是我們說的負載量

請求數量按照一定的規則進行分發到不同的伺服器處理的規則,就是一種均衡規則

所以~將伺服器接收到的請求按照規則分發的過程,稱為負載均衡。

負載均衡在實際專案操作過程中,有硬體負載均衡和軟體負載均衡兩種,硬體負載均衡也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是資料的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟體負載均衡,軟體負載均衡是利用現有的技術結合主機硬體實現的一種訊息佇列分發機制。

nginx支援的負載均衡排程演算法方式如下:

  1. weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器宕機,nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重資料越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的。

  2. ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器,這也在一定程度上解決了叢集部署環境下session共享的問題。

  3. fair:智慧調整排程演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種排程演算法。但是需要注意的是nginx預設不支援fair演算法,如果要使用這種排程演算法,請安裝upstream_fair模組

  4. url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態伺服器的情況下提高快取效率。同樣要注意nginx預設不支援這種排程演算法,要使用的話需要安裝nginx的hash軟體包

Nginx安裝

  1. windows安裝

官方網站下載地址:

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

如下圖所示,下載對應的版本的nginx壓縮包,解壓到自己電腦上存放軟體的資料夾中即可
在這裡插入圖片描述
解壓完成後,檔案目錄結構如下:
在這裡插入圖片描述
啟動nginx

1) 直接雙擊該目錄下的nginx.exe,即可啟動nginx伺服器

2) 命令列計入該資料夾,執行nginx命令,也會直接啟動nginx伺服器

D:/resp_application/nginx-1.13.5> nginx

在這裡插入圖片描述
訪問nginx

開啟瀏覽器,輸入地址:http://localhost,訪問頁面,出現如下頁面表示訪問成功
在這裡插入圖片描述
停止nginx

命令列進入nginx根目錄,執行如下命令,停止伺服器:

強制停止nginx伺服器,如果有未處理的資料,丟棄
D:/resp_application/nginx-1.13.5> nginx -s stop

優雅的停止nginx伺服器,如果有未處理的資料,等待處理完成之後停止
D:/resp_application/nginx-1.13.5> nginx -s quit

nginx配置
在這裡插入圖片描述

nginx是一個功能非常強大的web伺服器加反向代理伺服器,同時又是郵件伺服器等等

在專案使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態伺服器

這三個不同的功能的使用,都跟nginx的配置密切相關,nginx伺服器的配置資訊主要集中在nginx.conf這個配置檔案中,並且所有的可配置選項大致分為以下幾個部分
在這裡插入圖片描述
如上述配置檔案所示,主要由6個部分組成:

main:用於進行nginx全域性資訊的配置
events:用於nginx工作模式的配置
http:用於進行http協議資訊的一些配置
server:用於進行伺服器訪問資訊的配置
location:用於進行訪問路由的配置
upstream:用於進行負載均衡的配置

main模組

觀察下面的配置程式碼

# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

上述配置都是存放在main全域性配置模組中的配置項

user用來指定nginx worker程序執行使用者以及使用者組,預設nobody賬號執行
worker_processes指定nginx要開啟的子程序數量,執行過程中監控每個程序消耗記憶體(一般幾M~幾十M不等)根據實際情況進行調整,通常數量是CPU核心數量的整數倍
error_log定義錯誤日誌檔案的位置及輸出級別【debug / info / notice / warn / error / crit】
pid用來指定程序id的儲存檔案的位置
worker_rlimit_nofile用於指定一個程序可以開啟最多檔案數量的描述

event 模組

上乾貨

event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置是針對nginx伺服器的工作模式的一些操作配置

worker_connections 指定最大可以同時接收的連線數量,這裡一定要注意,最大連線數量是和worker processes共同決定的。
multi_accept 配置指定nginx在收到一個新連線通知後儘可能多的接受更多的連線
use epoll 配置指定了執行緒輪詢的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac請使用Kqueue

http模組
作為web伺服器,http模組是nginx最核心的一個模組,配置項也是比較多的,專案中會設定到很多的實際業務場景,需要根據硬體資訊進行適當的配置,常規情況下,使用預設配置即可!

http {
    ##
    # 基礎配置
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL證書配置
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # 日誌配置
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip 壓縮配置
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript
 text/xml application/xml application/xml+rss text/javascript;

    ##
    # 虛擬主機配置
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
  1. 基礎配置

sendfile on:配置on讓sendfile發揮作用,將檔案的回寫過程交給資料緩衝去去完成,而不是放在應用中完成,這樣的話在效能提升有有好處
tc_nopush on:讓nginx在一個數據包中傳送所有的標頭檔案,而不是一個一個單獨發
tcp_nodelay on:讓nginx不要快取資料,而是一段一段傳送,如果資料的傳輸有實時性的要求的話可以配置它,傳送完一小段資料就立刻能得到返回值,但是不要濫用哦

keepalive_timeout 10:給客戶端分配連線超時時間,伺服器會在這個時間過後關閉連線。一般設定時間較短,可以讓nginx工作持續性更好
client_header_timeout 10:設定請求頭的超時時間
client_body_timeout 10:設定請求體的超時時間
send_timeout 10:指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,伺服器就會關閉這個連結

limit_conn_zone $binary_remote_addr zone=addr:5m :設定用於儲存各種key的共享記憶體的引數,
limit_conn addr 100: 給定的key設定最大連線數

server_tokens:雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對於網站安全性的提升有好處哦
include /etc/nginx/mime.types:指定在當前檔案中包含另一個檔案的指令
default_type application/octet-stream:指定預設處理的檔案型別可以是二進位制
type_hash_max_size 2048:混淆資料,影響三列衝突率,值越大消耗記憶體越多,雜湊key衝突率會降低,檢索速度更快;值越小key,佔用記憶體較少,衝突率越高,檢索速度變慢

  1. 日誌配置

access_log logs/access.log:設定儲存訪問記錄的日誌
error_log logs/error.log:設定儲存記錄錯誤發生的日誌

  1. SSL證書加密

ssl_protocols:指令用於啟動特定的加密協議,nginx在1.1.13和1.0.12版本後預設是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。
ssl prefer server ciphers:設定協商加密演算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件

  1. 壓縮配置

gzip 是告訴nginx採用gzip壓縮的形式傳送資料。這將會減少我們傳送的資料量。
gzip_disable 為指定的客戶端禁用gzip功能。我們設定成IE6或者更低版本以使我們的方案能夠廣泛相容。
gzip_static 告訴nginx在壓縮資源之前,先查詢是否有預先gzip處理過的資源。這要求你預先壓縮你的檔案(在這個例子中被註釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些檔案了(想要更詳盡的gzip_static的資訊,請點選這裡)。
gzip_proxied 允許或者禁止壓縮基於請求和響應的響應流。我們設定為any,意味著將會壓縮所有的請求。
gzip_min_length 設定對資料啟用壓縮的最少位元組數。如果一個請求小於1000位元組,我們最好不要壓縮它,因為壓縮這些小的資料會降低處理此請求的所有程序的速度。
gzip_comp_level 設定資料的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設定為4,這是一個比較折中的設定。
gzip_type 設定需要壓縮的資料格式。上面例子中已經有一些了,你也可以再新增更多的格式。

  1. 檔案快取配置

open_file_cache 開啟快取的同時也指定了快取最大數目,以及快取的時間。我們可以設定一個相對高的最大時間,這樣我們可以在它們不活動超過20秒後清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正確資訊的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令引數不活動時間期間裡最小的檔案數。
open_file_cache_errors 指定了當搜尋一個檔案時是否快取錯誤資訊,也包括再次給配置中新增檔案。我們也包括了伺服器模組,這些是在不同檔案中定義的。如果你的伺服器模組不在這些位置,你就得修改這一行來指定正確的位置。

server模組

srever模組配置是http模組中的一個子模組,用來定義一個虛擬訪問主機,也就是一個虛擬伺服器的配置資訊

server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;

}

核心配置資訊如下:

server:一個虛擬主機的配置,一個http中可以配置多個server

server_name:用於指定ip地址或者域名,多個配置之間用空格分隔

root:表示整個server虛擬主機內的根目錄,所有當前主機中web專案的根目錄

index:使用者訪問web網站時的全域性首頁

charset:用於設定www/路徑中配置的網頁的預設編碼格式

access_log:用於指定該虛擬主機伺服器中的訪問記錄日誌存放路徑

error_log:用於指定該虛擬主機伺服器中訪問錯誤日誌的存放路徑

location模組

location模組是nginx配置中出現最多的一個配置,主要用於配置路由訪問資訊

在路由訪問資訊配置中關聯到反向代理、負載均衡等等各項功能,所以location模組也是一個非常重要的配置模組

基本配置

location / {
root /nginx/www;
index index.php index.html index.htm;
}

location /:表示匹配訪問根目錄

root:用於指定訪問根目錄時,訪問虛擬主機的web目錄

index:在不指定訪問具體資源時,預設展示的資原始檔列表

反向代理配置方式

通過反向代理代理伺服器訪問模式,通過proxy_set配置讓客戶端訪問透明化

location / {
proxy_pass http://localhost:8888;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}

uwsgi配置

wsgi模式下的伺服器配置訪問方式

location / {
include uwsgi_params;
uwsgi_pass localhost:8888
}

upstream模組

upstream模組主要負責負載均衡的配置,通過預設的輪詢排程方式來分發請求到後端伺服器

簡單的配置方式如下

upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

核心配置資訊如下

ip_hash:指定請求排程演算法,預設是weight權重輪詢排程,可以指定

server host:port:分發伺服器的列表配置

-- down:表示該主機暫停服務

-- max_fails:表示失敗最大次數,超過失敗最大次數暫停服務

-- fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求

反向代理的好處

1、 解決了網站伺服器對外可見的問題;

2、節約了有限的IP地址資源,企業內所有的網站共享一個在internet中註冊的IP地址,這些伺服器分配私有地址,採用虛擬主機的方式對外提供服務;

3、 保護了真實的web伺服器,web伺服器對外不可見,外網只能看到反向代理伺服器,而反向代理伺服器上並沒有真實資料,因此,保證了web伺服器的資源安全;

4、 加速了對網站訪問速度,減輕web伺服器的負擔,反向代理具有快取網頁的功能,如果使用者需要的內容在快取中,則可以直接從代理服務其中獲取,減輕了web伺服器的負荷,同時也加快了使用者的訪問速度。