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

上次分享了怎么用docker創(chuàng)建nginx服務(wù) 說(shuō)到nginx 我們往往都會(huì)用到nginx的兩個(gè)重要功能,反向代理和負(fù)載均衡,今天我來(lái)和大家分享一下Nginx的反向代理和負(fù)載均衡

什么是反向代理?

說(shuō)到反向代理,大家一般都會(huì)提一下:正向代理,正向代理就是代理,比如我們寫(xiě)爬蟲(chóng)的時(shí)候IP被封、Google的時(shí)候404,這個(gè)時(shí)候我們都會(huì)用到代理,你可以把代理理解成一個(gè)跳板,我們的電腦不能訪問(wèn)Google,那我們就去訪問(wèn)能訪問(wèn)Google的服務(wù)器,一般我都是在這兩種情況下使用代理,可能有更高深的用法,具體我也沒(méi)用過(guò)。 說(shuō)完代理,就來(lái)說(shuō)一下我們今天的主角--反向代理

定義

反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器

功能

對(duì)客戶端隱藏服務(wù)器的IP地址 通過(guò)緩存靜態(tài)資源,加速Web請(qǐng)求 更安全,因?yàn)槿魏蝸?lái)自Internet的請(qǐng)求都必須先經(jīng)過(guò)代理服務(wù)器,可以在這里做防護(hù)(例如ip過(guò)濾)

實(shí)現(xiàn)方法:

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_pass http://abc.com;
}

第一次看到上面這些內(nèi)容時(shí),大多人可能還是不明白 簡(jiǎn)單點(diǎn)說(shuō)就是你有A、B兩臺(tái)服務(wù)器,這兩臺(tái)服務(wù)器上都放著你的代碼,當(dāng)用戶訪問(wèn)你的內(nèi)容時(shí),會(huì)訪問(wèn)A服務(wù)器,A服務(wù)器再去請(qǐng)求B內(nèi)容返回給用戶,用戶不知道請(qǐng)求的是B,這樣就是實(shí)現(xiàn)了反向代理

下面我們通過(guò)以下簡(jiǎn)單的幾步演示一下反向代理
通過(guò)上一篇的Docker創(chuàng)建Nginx服務(wù),我們可以快速創(chuàng)建3個(gè)nginx服務(wù),來(lái)模擬3臺(tái)服務(wù)器

  • 首先創(chuàng)建一個(gè)nginx的配置文件
#創(chuàng)建 nginx配置文件
touch nginx.conf 
# 創(chuàng)建a、b、c三個(gè)文件夾存放項(xiàng)目
mkdir a b c
  • 編寫(xiě)Nginx配置文件
# Nginx的配置文件,這里主要作用是為了指定端口和項(xiàng)目路徑
events {
    #每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
    worker_connections 1024;
}
http {
        server {
               #監(jiān)聽(tīng)端口
                listen 80;
                #綁定域名
                server_name localhost;
                #項(xiàng)目路徑
                root /nginx/share/nginx/html;
        }
}
  • 啟動(dòng)Nignx服務(wù)

#創(chuàng)建a容器
docker run -p 80:80 -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
 -v $PWD/html/a:/usr/share/nginx/html --name a-server -d nginx
#創(chuàng)建b容器
docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html 
--name b-server -d nginx
#創(chuàng)建c容器
docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html 
--name c-server -d nginx 
 
#參數(shù)解釋
    -p 8080:80 將容器的80端口映射到宿主機(jī)的8080端口
    -v $PWD/a.conf:/etc/nginx/nginx.conf 
    將宿主機(jī)中當(dāng)前目錄下的a.conf掛載到容器的/etc/nginx/nginx.conf
    -v $PWD:/a  將主機(jī)中當(dāng)前目錄a掛載到容器的/usr/share/nginx/html
    --name 容器的名稱
    -d 后臺(tái)運(yùn)行容器,并返回容器ID
  • 判斷Nginx是否啟動(dòng)成功
docker ps -a 查看容器是否成功啟動(dòng)
或者
curl 127.0.0.1 
curl 127.0.0.1:8081 
curl 127.0.0.1:8082

  • 修改配置文件
events {
    #每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
    worker_connections 1024;
}
http {
    server {
        #監(jiān)聽(tīng)端口
        listen 80;
        #綁定域名
        server_name localhost;
        #項(xiàng)目路徑
        root /nginx/share/nginx/html;
        
        # 反向代理
        location /b {
            rewrite ^/b(.*) /$1 break;
            proxy_pass http://127.0.0.1:8081
        }
        
        # 反向代理
        location /c {
            rewrite ^/c(.*) /$1 break;
            proxy_pass http://127.0.0.1:8082
        }
    }
}

這個(gè)時(shí)候就我們就已經(jīng)實(shí)現(xiàn)了方向代理,可以在瀏覽器中訪問(wèn)

http://127.0.0.1  輸出this is a
http://127.0.0.1/b 輸出 this is b 
http://127.0.0.1/c 輸出 this is c

今天的另外一個(gè)主角是負(fù)載均衡

什么是負(fù)載均衡 很多新手在聽(tīng)說(shuō)負(fù)載均衡的時(shí)候,都會(huì)感覺(jué)是很高深莫測(cè),其實(shí)實(shí)現(xiàn)起來(lái)也不難, 下面我們修改配置實(shí)現(xiàn)一個(gè)簡(jiǎn)單的負(fù)載均衡
首先來(lái)了解一下負(fù)載均衡

定義

用來(lái)在多個(gè)計(jì)算機(jī)、網(wǎng)絡(luò)連接、CPU、磁盤(pán)驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。 使用帶有負(fù)載平衡的多個(gè)服務(wù)器組件,取代單一的組件,可以通過(guò)冗余提高可靠性

功能

將流量分配給多個(gè)應(yīng)用程序服務(wù)器,提高Web應(yīng)用程序的可伸縮性和可靠性

實(shí)現(xiàn)方法

http {
    upstream myServer {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myServer;
        }
    }
}

對(duì)于上面的很官方定義,我再用大白話解釋一下, 將用戶的請(qǐng)求分配到壓力小的服務(wù)器上,從而減輕服務(wù)器壓力

下面我們通過(guò)簡(jiǎn)單的Demo演示一下負(fù)載均衡

修改剛才的配置文件nginx.conf

events {
    #每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
    worker_connections 1024;
}
http {
    #定義負(fù)載均衡設(shè)備的 Ip及設(shè)備狀態(tài) 
    upstream myServer {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    
    server {
        #監(jiān)聽(tīng)端口
        listen 80;
        #綁定域名
        server_name localhost;
        #項(xiàng)目路徑
        root /nginx/share/nginx/html;
        
        location / {
            proxy_pass http://myServer;
        }
    }
}
打開(kāi)瀏覽器輸入http://127.0.0.1 我們刷新瀏覽器,就輸出this is b或者this is a

到這里反向代理和負(fù)載均衡的基本配置就分享完了。

但是機(jī)智的你可能會(huì)發(fā)提出一些疑問(wèn),通過(guò)負(fù)載均衡,用戶訪問(wèn)到B服務(wù)器時(shí),下次刷新又去訪問(wèn)C服務(wù)器,能不能還繼續(xù)訪問(wèn)A服務(wù)器。當(dāng)然Nginx提供了方法 具體配置內(nèi)容如下

upstream myServer {            
  #weight 指定輪詢幾率,如果現(xiàn)在有5個(gè)請(qǐng)求,
  #有4個(gè)會(huì)請(qǐng)求到B服務(wù)器上,1個(gè)請(qǐng)求到C服務(wù)器上,
  #一般我們會(huì)把服務(wù)器配置比較高的權(quán)重加大

  server b.com weight=4; 
  server c.com;

  #通過(guò)客戶端的IP地址,確定下一個(gè)請(qǐng)求應(yīng)該選擇哪個(gè)服務(wù)器
  ip_hash;            
}

本次主要分享了Nginx的反向代理和負(fù)載均衡,當(dāng)然,分享的內(nèi)容還是比較基礎(chǔ),Nginx雖然體積不大,但是功能很全面,更多模塊和配置文件可以去查看官方文檔

注意事項(xiàng)

  • 如果 nginx沒(méi)有開(kāi)啟熱更新,修改配置文件一定要重啟
#docker 容器的重啟命令
docker restart id(容器ID)
#不是使用docker安裝的nginx
service nginx restart
  • 反向代理中nginx的配置 proxy_pass
 location /c {
         #如果是綁定目錄,這里的rewrite一定要寫(xiě)
         rewrite ^/c(.*) /$1 break;
         # docker容器中這里一定要填寫(xiě)本機(jī)的ip地址,不能填寫(xiě)127.0.0.1
         proxy_pass http://117.189.124.134:8082;
    }

總結(jié):Nginx的反向代理、負(fù)載均衡配置還是比較簡(jiǎn)單的,主要用到proxy_pass和upstream,避免上述幾個(gè)坑,應(yīng)該沒(méi)有什么問(wèn)題,本人對(duì)Nginx只是屬于入門(mén)階段,如有錯(cuò)誤,歡迎指正

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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