從原理到實戰(zhàn),徹底搞懂Nginx克婶!

??本文首先介紹 Nginx 的反向代理筒严、負載均衡情萤、動靜分離和高可用的原理,隨后詳解 Nginx 的配置文件筋岛,最后通過實際案例實現(xiàn) Nginx 反向代理和負載均衡的具體配置。學會 Nginx 睁宰,一篇足夠了肪获。

1. 簡介

??Nginx 是開源的輕量級 Web 服務(wù)器柒傻、反向代理服務(wù)器孝赫,以及負載均衡器和 HTTP 緩存器红符。其特點是高并發(fā)青柄,高性能和低內(nèi)存 伐债。
??Nginx 專為性能優(yōu)化而開發(fā),性能是其最重要的考量峰锁,實現(xiàn)上非常注重效率双戳,能經(jīng)受高負載的考驗,最大能支持 50000 個并發(fā)連接數(shù)飒货。 Nginx 還支持熱部署,它的使用特別容易徐绑,幾乎可以做到 7x24 小時不間斷運行。 Nginx 的網(wǎng)站用戶有:百度傲茄、淘寶沮榜、京東、騰訊蟆融、新浪、網(wǎng)易等山憨。

2. 反向代理

2.1 正向代理

??Nginx 不僅可以做反向代理弥喉,實現(xiàn)負載均衡,還能用做正向代理來進行上網(wǎng)等功能由境。

正向代理原理圖

2.2 反向代理

??客戶端對代理服務(wù)器是無感知的虏杰,客戶端不需要做任何配置,用戶只請求反向代理服務(wù)器纺阔,反向代理服務(wù)器選擇目標服務(wù)器,獲取數(shù)據(jù)后再返回給客戶端钧栖。反向代理服務(wù)器和目標服務(wù)器對外而言就是一個服務(wù)器,只是暴露的是代理服務(wù)器地址拯杠,而隱藏了真實服務(wù)器的IP地址啃奴。

反向代理原理圖

3. 負載均衡

??將原先請求集中到單個服務(wù)器上的情況改為增加服務(wù)器的數(shù)量,然后將請求分發(fā)到各個服務(wù)器上依溯,將負載分發(fā)到不同的服務(wù)器瘟则,即負載均衡。

負載均衡原理圖

4. 動靜分離

??為了加快網(wǎng)站的解析速度慷嗜,可以把靜態(tài)頁面和動態(tài)頁面由不同的服務(wù)器來解析丹壕,加快解析速度庆械,降低原來單個服務(wù)器的壓力菌赖。

動靜分離原理圖

5. 高可用

??為了提高系統(tǒng)的可用性和容錯能力琉用,可以增加 nginx 服務(wù)器的數(shù)量,當主服務(wù)器發(fā)生故障或宕機邑时,備份服務(wù)器可以立即充當主服務(wù)器進行不間斷工作。

高可用原理圖

6. Nginx配置文件

6.1 文件結(jié)構(gòu)

??Nginx 配置文件由三部分組成绰寞。

...              #全局塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全局塊
    server        #server塊
    { 
        ...       #server全局塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局塊
}
  • 第一部分 全局塊
    ??主要設(shè)置一些影響 nginx 服務(wù)器整體運行的配置指令铣口。
    ??比如: worker_processes 1; , worker_processes 值越大件缸,可以支持的并發(fā)處理量就越多叔遂。

  • 第二部分 events塊
    ??events 塊涉及的指令主要影響Nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接争剿。
    ??比如: worker_connections 1024; 痊末,支持的最大連接數(shù)。

  • 第三部分 http塊
    ??http 塊又包括 http 全局塊和 server 塊凿叠,是服務(wù)器配置中最頻繁的部分,包括配置代理蹬碧、緩存、日志定義等絕大多數(shù)功能恩沽。

    • server塊:配置虛擬主機的相關(guān)參數(shù)翔始。
    • location塊:配置請求路由,以及各種頁面的處理情況绽昏。

6.2 配置文件

########### 每個指令必須有分號結(jié)束。#################
#user administrator administrators;  #配置用戶或者組肤晓,默認為nobody nobody认然。
#worker_processes 2;  #允許生成的進程數(shù),默認為1
#pid /nginx/pid/nginx.pid;   #指定nginx進程運行文件存放地址
error_log log/error.log debug;  #制定日志路徑卷员,級別。這個設(shè)置可以放入全局塊削饵,http塊未巫,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設(shè)置網(wǎng)路連接序列化叙凡,防止驚群現(xiàn)象發(fā)生,默認為on
    multi_accept on;  #設(shè)置一個進程是否同時接受多個網(wǎng)絡(luò)連接跛璧,默認為off
    #use epoll;      #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數(shù)刹碾,默認為512
}
http {
    include       mime.types;   #文件擴展名與文件類型映射表
    default_type  application/octet-stream; #默認文件類型漓柑,默認為text/plain
    #access_log off; #取消服務(wù)日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認值
    sendfile on;   #允許sendfile方式傳輸文件,默認為off,可以在http塊茶鉴,server塊,location塊惭蹂。
    sendfile_max_chunk 100k;  #每個進程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值割粮,默認為0,即不設(shè)上限舀瓢。
    keepalive_timeout 65;  #連接超時時間,默認為75s航缀,可以在http堰怨,server,location塊备图。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連接請求上限次數(shù)。
        listen       4545;   #監(jiān)聽端口
        server_name  127.0.0.1;   #監(jiān)聽地址       
        location  ~*^.+$ {       #請求的url過濾揽涮,正則匹配,~為區(qū)分大小寫幢痘,~*為不區(qū)分大小寫家破。
           #root path;  #根目錄
           #index vv.txt;  #設(shè)置默認頁
           proxy_pass  http://mysvr;  #請求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}   

7.配置實例

7.1 反向代理

7.1.1 實戰(zhàn)一

實現(xiàn)效果:
??在瀏覽器輸入 www.abc.com , 從 nginx 服務(wù)器跳轉(zhuǎn)到 linux 系統(tǒng) tomcat 主頁面购岗。
具體配置:

    server {
        listen       80;   
        server_name  192.168.4.32;   #監(jiān)聽地址
   
        location  / {       
           root html;  #/html目錄
           proxy_pass http://127.0.0.1:8080;  #請求轉(zhuǎn)向
           index  index.html index.htm;      #設(shè)置默認頁       
        } 
    }

7.1.2 實戰(zhàn)二

實現(xiàn)效果:
??根據(jù)在瀏覽器輸入的路徑不同门粪,跳轉(zhuǎn)到不同端口的服務(wù)中玄妈。
具體配置:

    server {
        listen       9000;   
        server_name  192.168.4.32;   #監(jiān)聽地址       
        
        location  ~ /example1/ {  
           proxy_pass http://127.0.0.1:5000;         
        } 

        location  ~ /example2/ {  
           proxy_pass http://127.0.0.1:8080;         
        } 
    }

location 指令說明:

  • ~ : 表示uri包含正則表達式,且區(qū)分大小寫拟蜻。
  • ~* : 表示uri包含正則表達式,且不區(qū)分大小寫诡必。
  • = : 表示uri不含正則表達式搔扁,要求嚴格匹配。

7.2 負載均衡

7.2.1 實戰(zhàn)一

實現(xiàn)效果:
??在瀏覽器地址欄輸入 http://192.168.4.32/example/a.html 扭勉,平均到 5000 和 8080 端口中苛聘,實現(xiàn)負載均衡效果。
具體配置:

    upstream myserver {   
      server 192.167.4.32:5000;
      server 192.168.4.32:8080;
    }
    

    server {
        listen       80;   #監(jiān)聽端口
        server_name  192.168.4.32;   #監(jiān)聽地址
   
        location  / {       
           root html;  #html目錄
           index index.html index.htm;  #設(shè)置默認頁
           proxy_pass  http://myserver;  #請求轉(zhuǎn)向 myserver 定義的服務(wù)器列表      
        } 
    }

nginx 分配服務(wù)器策略

  • 輪詢(默認)
    ??按請求的時間順序依次逐一分配璧尸,如果服務(wù)器down掉熬拒,能自動剔除。

  • 權(quán)重
    ??weight 越高澎粟,被分配的客戶端越多,默認為 1徐裸。比如:

          upstream myserver {   
            server 192.167.4.32:5000 weight=10;
            server 192.168.4.32:8080 weight=5;
          }
    
  • ip
    ??按請求 ip 的 hash 值分配啸盏,每個訪客固定訪問一個后端服務(wù)器。比如:

          upstream myserver { 
            ip_hash;  
            server 192.167.4.32:5000;
            server 192.168.4.32:8080;
          }
    
  • fair
    ??按后端服務(wù)器的響應(yīng)時間來分配气笙,響應(yīng)時間短的優(yōu)先分配到請求。比如:

          upstream myserver { 
            fair;  
            server 192.167.4.32:5000;
            server 192.168.4.32:8080;
          }
    

??恭喜潜圃!目前為止你已經(jīng)掌握了 Nginx 的基本原理,并且能夠配置反向代理和負載均衡堵第。接下來還會更新一篇Nginx進階:從原理到實戰(zhàn)隧出,徹底搞懂Nginx(高級篇),含 Nginx 動靜分離和高可用配置實例胀瞪,并對 Nginx 原理進行深入解析。碼字不易,點個贊鼓勵一下吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幔摸,一起剝皮案震驚了整個濱河市颤练,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗦玖,老刑警劉巖宇挫,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翠储,居然都是意外死亡,警方通過查閱死者的電腦和手機援所,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門欣除,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滔岳,你說我怎么就攤上這事〕后。” “怎么了趴俘?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長太惠。 經(jīng)常有香客問我,道長凿渊,這世上最難降的妖魔是什么缚柳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮彩掐,結(jié)果婚禮上灰追,老公的妹妹穿的比我還像新娘。我一直安慰自己弹澎,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布殴胧。 她就那樣靜靜地躺著刽肠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惫撰。 梳的紋絲不亂的頭發(fā)上躺涝,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天扼雏,我揣著相機與錄音夯膀,去河邊找鬼。 笑死蝴蜓,一個胖子當著我的面吹牛俺猿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播押袍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谊惭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了圈盔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤告组,失蹤者是張志新(化名)和其女友劉穎癌佩,沒想到半個月后便锨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡姚建,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年吱殉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿湿。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡押赊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涕俗,到底是詐尸還是另有隱情,我是刑警寧澤再姑,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布元镀,位于F島的核電站绍填,受9級特大地震影響凹联,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜住闯,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一澳淑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧量窘,春花似錦氢拥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽审葬。三九已至奕谭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間血柳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工攀隔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人明刷。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓满粗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親映皆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容