Nginx反向代理和負載均衡

Nginx反向代理和負載均衡

什麼是反向代理?
說到反向代理,大家一般都會提一下:正向代理,正向代理就是代理,比如我們寫爬蟲的時候IP被封、Google的時候404,這個時候我們都會用到代理,你可以把代理理解成一個跳板,我們的電腦不能訪問Google,那我們就去訪問能訪問Google的服務器,一般我都是在這兩種情況下使用代理,可能有更高深的用法,具體我也沒用過。 說完代理,就來說一下我們今天的主角–反向代理

定義
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器

功能
對客戶端隱藏服務器的IP地址 通過緩存靜態資源,加速Web請求 更安全,因爲任何來自Internet的請求都必須先經過代理服務器,可以在這裏做防護(例如ip過濾)

實現方法:

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;
}

第一次看到上面這些內容時,大多人可能還是不明白 簡單點說就是你有A、B兩臺服務器,這兩臺服務器上都放着你的代碼,當用戶訪問你的內容時,會訪問A服務器,A服務器再去請求B內容返回給用戶,用戶不知道請求的是B,這樣就是實現了反向代理

下面我們通過以下簡單的幾步演示一下反向代理
通過上一篇的Docker創建Nginx服務,我們可以快速創建3個nginx服務,來模擬3臺服務器

首先創建一個nginx的配置文件

#創建 nginx配置文件
touch nginx.conf 
# 創建a、b、c三個文件夾存放項目
mkdir a b c

編寫Nginx配置文件

# Nginx的配置文件,這裏主要作用是爲了指定端口和項目路徑
events {
    #每個工作進程的併發連接數
    worker_connections 1024;
}
http {
        server {
               #監聽端口
                listen 80;
                #綁定域名
                server_name localhost;
                #項目路徑
                root /nginx/share/nginx/html;
        }
}

啓動Nignx服務

#創建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
#創建b容器
docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html 
--name b-server -d nginx
#創建c容器
docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html 
--name c-server -d nginx 

#參數解釋
    -p 8080:80 將容器的80端口映射到宿主機的8080端口
    -v $PWD/a.conf:/etc/nginx/nginx.conf 
    將宿主機中當前目錄下的a.conf掛載到容器的/etc/nginx/nginx.conf
    -v $PWD:/a  將主機中當前目錄a掛載到容器的/usr/share/nginx/html
    --name 容器的名稱
    -d 後臺運行容器,並返回容器ID

判斷Nginx是否啓動成功

docker ps -a 查看容器是否成功啓動
或者
curl 127.0.0.1 
curl 127.0.0.1:8081 
curl 127.0.0.1:8082

修改配置文件

events {
    #每個工作進程的併發連接數
    worker_connections 1024;
}
http {
    server {
        #監聽端口
        listen 80;
        #綁定域名
        server_name localhost;
        #項目路徑
        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
        }
    }
}

這個時候就我們就已經實現了方向代理,可以在瀏覽器中訪問

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

今天的另外一個主角是負載均衡

什麼是負載均衡 很多新手在聽說負載均衡的時候,都會感覺是很高深莫測,其實實現起來也不難, 下面我們修改配置實現一個簡單的負載均衡
首先來了解一下負載均衡

定義
用來在多個計算機、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個服務器組件,取代單一的組件,可以通過冗餘提高可靠性

功能
將流量分配給多個應用程序服務器,提高Web應用程序的可伸縮性和可靠性

實現方法

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

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

對於上面的很官方定義,我再用大白話解釋一下, 將用戶的請求分配到壓力小的服務器上,從而減輕服務器壓力
下面我們通過簡單的Demo演示一下負載均衡

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

events {
    #每個工作進程的併發連接數
    worker_connections 1024;
}
http {
    #定義負載均衡設備的 Ip及設備狀態 
    upstream myServer {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        #監聽端口
        listen 80;
        #綁定域名
        server_name localhost;
        #項目路徑
        root /nginx/share/nginx/html;

        location / {
            proxy_pass http://myServer;
        }
    }
}
打開瀏覽器輸入http://127.0.0.1 我們刷新瀏覽器,就輸出this is b或者this is a

到這裏反向代理和負載均衡的基本配置就分享完了。

但是機智的你可能會發提出一些疑問,通過負載均衡,用戶訪問到B服務器時,下次刷新又去訪問C服務器,能不能還繼續訪問A服務器。當然Nginx提供了方法 具體配置內容如下

upstream myServer {            
  #weight 指定輪詢機率,如果現在有5個請求,
  #有4個會請求到B服務器上,1個請求到C服務器上,
  #一般我們會把服務器配置比較高的權重加大

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

  #通過客戶端的IP地址,確定下一個請求應該選擇哪個服務器
  ip_hash;            
}

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

注意事項
如果 nginx沒有開啓熱更新,修改配置文件一定要重啓

#docker 容器的重啓命令
docker restart id(容器ID)
#不是使用docker安裝的nginx
service nginx restart

反向代理中nginx的配置 proxy_pass

location /c {
         #如果是綁定目錄,這裏的rewrite一定要寫
         rewrite ^/c(.*) /$1 break;
         # docker容器中這裏一定要填寫本機的ip地址,不能填寫127.0.0.1
         proxy_pass http://117.189.124.134:8082;
    }

總結:Nginx的反向代理、負載均衡配置還是比較簡單的,主要用到proxy_pass和upstream,避免上述幾個坑,應該沒有什麼問題,本人對Nginx只是屬於入門階段。
謝謝大家,多多指教!!!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章