Nginx的反向代理與負(fù)載均衡

Nginx的反向代理與負(fù)載均衡

什么是反向代理?

自己計(jì)算機(jī) A 想訪問國外某個(gè)網(wǎng)站 B,很遺憾訪問不了;此時(shí),有臺(tái)中間服務(wù)器 C 可以訪問國外的網(wǎng)站B,那么,我們可以用自己的計(jì)算機(jī) A 訪問 服務(wù)器C, 通過C來訪問B網(wǎng)站。那么這個(gè)時(shí)候, 服務(wù)器C稱為代理服務(wù)器,這種訪問方式叫做正向代理。正向代理有一個(gè)特點(diǎn),就是我們明確知道要訪問哪個(gè)網(wǎng)站。
再如,當(dāng)我們有一個(gè)服務(wù)器集中,并且服務(wù)器集群中的每臺(tái)服務(wù)器的內(nèi)容一樣的時(shí)候,同樣我們要直接從個(gè)人電腦訪問到服務(wù)器集中的服務(wù)器的時(shí)候無法訪問,且此時(shí)第三方服務(wù)器能訪問集群,這個(gè)時(shí)候,我們通過第三方服務(wù)器訪問服務(wù)器集群的內(nèi)容,但是此時(shí)我們并不知道是哪一臺(tái)服務(wù)器提供的內(nèi)容,此時(shí)的代理方式稱為反向代理。

什么是負(fù)載均衡

Nginx 是一款可以通過反向代理實(shí)現(xiàn)負(fù)載均衡的服務(wù)器,使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡的時(shí)候,用戶的訪問首先會(huì)訪問到Nginx服務(wù)器,然后Nginx服務(wù)器再從服務(wù)器集群表中選擇壓力較小的服務(wù)器,然后將該訪問請(qǐng)求引向該服務(wù)器。
若服務(wù)器集群中的某個(gè)服務(wù)器崩潰,那么從待選服務(wù)器列表中將該服務(wù)器刪除,也就是說一個(gè)服務(wù)器假如崩潰了,那么Nginx就肯定不會(huì)將訪問請(qǐng)求引入該服務(wù)器了。

負(fù)載均衡實(shí)現(xiàn)

1.jpg
ip_hash.jpg
weight.jpg

HTTP Upstram 模塊

Upstream模塊是Nginx服務(wù)器的一個(gè)重要模塊。 Upstream模塊實(shí)現(xiàn)在輪詢和客戶端ip之間實(shí)現(xiàn)后端的負(fù)載均衡。常用的指令有 ip_hash指令、server指令 和 upstream指令等。

  • ip_hash 沒有默認(rèn)值。 基于客戶端的IP地址分發(fā)請(qǐng)求。

    • 哈希的關(guān)鍵字是客戶端的C類網(wǎng)絡(luò)地址,這個(gè)功能將保證這個(gè)客戶端請(qǐng)求總是被轉(zhuǎn)發(fā)到一臺(tái)服務(wù)器上,但是如果這臺(tái)服務(wù)器不可用,那么請(qǐng)求將轉(zhuǎn)發(fā)到另外的服務(wù)器上,這將保證某個(gè)客戶端有很大概率總是連接到一臺(tái)服務(wù)器。
    • 語法:"ip_hash;"
    • 無法將權(quán)重(weight)與ip_hash聯(lián)合使用來分發(fā)連接。如果有某臺(tái)服務(wù)器不可用,你必須標(biāo)記其為“down”,如下例:
          upstream backend {
              ip_hash;
              server   backend1.example.com;
              server   backend2.example.com;
              server   backend3.example.com  down;
              server   backend4.example.com;
          }
      
  • server 指定后端服務(wù)器的名稱和一些參數(shù),可以使用域名,IP,端口,或者unix socket。如果指定為域名,則首先將其解析為IP。

    • 語法: server name [parameters]
    • weight = NUMBER - 設(shè)置服務(wù)器權(quán)重,默認(rèn)為1。
    • max_fails = NUMBER- 在一定時(shí)間內(nèi)(這個(gè)時(shí)間在fail_timeout參數(shù)中設(shè)置)檢查這個(gè)服務(wù)器是否可用時(shí)產(chǎn)生的最多失敗請(qǐng)求數(shù),默認(rèn)為1,將其設(shè)置為0可以關(guān)閉檢查,這些錯(cuò)誤在proxy_next_upstreamfastcgi_next_upstream(404錯(cuò)誤不會(huì)使max_fails增加)中定義。
    • fail_timeout = TIME - 在這個(gè)時(shí)間內(nèi)產(chǎn)生了max_fails所設(shè)置大小的失敗嘗試連接請(qǐng)求后這個(gè)服務(wù)器可能不可用,同樣它指定了服務(wù)器不可用的時(shí)間(在下一次嘗試連接請(qǐng)求發(fā)起之前),默認(rèn)為10秒,fail_timeout與前端響應(yīng)時(shí)間沒有直接關(guān)系,不過可以使用proxy_connect_timeoutproxy_read_timeout來控制。
    • down - 標(biāo)記服務(wù)器處于離線狀態(tài),通常和ip_hash一起使用。
    • backup - (0.6.7或更高)如果所有的非備份服務(wù)器都宕機(jī)或繁忙,則使用本服務(wù)器(無法和ip_hash指令搭配使用)。
        upstream  backend  {
            server   backend1.example.com    weight=5;
            server   127.0.0.1:8080          max_fails=3  fail_timeout=30s;
            server   unix:/tmp/backend3;
        }
    

    注意:如果你只使用一臺(tái)上游服務(wù)器,nginx將設(shè)置一個(gè)內(nèi)置變量為1,即max_fails和fail_timeout參數(shù)不會(huì)被處理。

    結(jié)果:如果nginx不能連接到上游,請(qǐng)求將丟失。

    解決:使用多臺(tái)上游服務(wù)器。

  • upstream 這個(gè)字段設(shè)置一群服務(wù)器,可以將這個(gè)字段放在proxy_passfastcgi_pass指令中作為一個(gè)單獨(dú)的實(shí)體,它們可以可以是監(jiān)聽不同端口的服務(wù)器,并且也可以是同時(shí)監(jiān)聽TCPUnix socket的服務(wù)器。服務(wù)器可以指定不同的權(quán)重,默認(rèn)為1。

    • 語法: upstream name { ... }
    • 使用如上 代碼片段
    • 請(qǐng)求將按照輪詢的方式分發(fā)到后端服務(wù)器,但同時(shí)也會(huì)考慮權(quán)重。
    • 在上面的例子中如果每次發(fā)生7個(gè)請(qǐng)求,5個(gè)請(qǐng)求將被發(fā)送到backend1.example.com,其他兩臺(tái)將分別得到一個(gè)請(qǐng)求,如果有一臺(tái)服務(wù)器不可用,那么請(qǐng)求將被轉(zhuǎn)發(fā)到下一臺(tái)服務(wù)器,直到所有的服務(wù)器檢查都通過。如果所有的服務(wù)器都無法通過檢查,那么將返回給客戶端最后一臺(tái)工作的服務(wù)器產(chǎn)生的結(jié)果。

官方文檔

一些 Nginx 的命令

  • nginx -s reload 重新加載Nginx
  • nginx -s stop 關(guān)閉nginx
  • nginx -s start 開啟nginx
  • service nginx start/stop/restart (這個(gè)一般我用的比較多)
  • nginx -t -c 文件地址 驗(yàn)證配置文件

總結(jié)

  • 使用硬件的方式實(shí)現(xiàn)負(fù)載均衡,那么中間的轉(zhuǎn)發(fā)機(jī)構(gòu)就是硬件,這個(gè)時(shí)候運(yùn)行的效率非常高,對(duì)應(yīng)的成本也非常高。
  • 如果采用軟件的方式來實(shí)現(xiàn)負(fù)載均衡,那么中間的轉(zhuǎn)發(fā)機(jī)構(gòu)就是軟件,這個(gè)時(shí)候,運(yùn)行效率不如硬件,但是成本相對(duì)來說低得多。
  • Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,那么就是通過軟件的方式來實(shí)現(xiàn)負(fù)載均衡,并且Nginx本身支持高并發(fā)等。顧而使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,能大大解決節(jié)約企業(yè)的成本,并且由于Nginx是服務(wù)器軟件,且執(zhí)行效率也非常高
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容