Nginx反向代理負載均衡的容器化部署

首先,在home目錄創建microservices目錄,開啟第一篇章。

cd ~ && mkdir microservices && cd microservices

創建nginx目錄,在目錄下分別創建三個節點目錄:nginx01nginx02nginx03,目的是使nginx01作為反向代理服務器,將請求均衡轉發到nginx02nginx03

mkdir -p ./nginx/nginx01 ./nginx/nginx02 ./nginx/nginx03

展示效果如下所示。

nginx
├── nginx01
└── nginx02
└── nginx03

將nginx鏡像中的配置文件拷貝到各子目錄中,以便做掛載,方法是創建一個臨時容器,將配置文件拷貝至宿主機目錄,再刪除臨時容器。

docker run --name tmpnginx -d nginx:latest
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx01
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx02
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx03
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx01
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx02
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx03
docker rm -f tmpnginx

此時nginx目錄如下所示。

nginx
├── nginx01
│?? ├── conf.d
│?? │?? └── default.conf
│?? └── nginx.conf
├── nginx02
│?? ├── conf.d
│?? │?? └── default.conf
│?? └── nginx.conf
└── nginx03
    ├── conf.d
    │?? └── default.conf
    └── nginx.conf

在根目錄創建文件docker-compose.yml,創建三個web服務,配置文件分別映射到容器中的對應文件。

version: '3'

services:
  web01:  #服務名稱
    image: nginx:latest #鏡像
    container_name: web01 #容器名稱
    ports:  #映射端口號,前者宿主機端口,后者容器端口
      - 8080:80
    volumes: #映射的目錄或文件,前者宿主機目錄,后者容器目錄
      - ./nginx/nginx01/nginx.conf:/etc/nginx/nginx.conf #配置文件
      - ./nginx/nginx01/conf.d:/etc/nginx/conf.d #擴展配置目錄
      - ./nginx/html:/usr/share/nginx/html #html存放目錄

  web02:
    image: nginx:latest
    container_name: web02
    volumes:
      - ./nginx/nginx02/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx02/conf.d:/etc/nginx/conf.d
      - ./nginx/html:/usr/share/nginx/html

  web03:
    image: nginx:latest
    container_name: web03
    volumes:
      - ./nginx/nginx03/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx03/conf.d:/etc/nginx/conf.d
      - ./nginx/html:/usr/share/nginx/html

打開nginx/nginx01/conf.d/default.conf,在文章頂部加入upstream配置,web02與web03是docker-compose.yml中定義的容器名稱container_name

upstream backend {
    server web02:80;
    server web03:80;
}

location /中加入proxy_pass以便將請求轉發給backend

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    proxy_pass http://backend;  #追加該行
}

配置完成后,執行以下命令將容器跑起來。

cd ~/microservices
docker-compose up

提示以下內容即成功。

Recreating microservices_web01_1 ... done
Recreating microservices_web02_1 ... done
Recreating microservices_web03_1 ... done
Attaching to web02, web01, web03

此時microservices目錄結構如下,nginx目錄下多出了一個html文件夾,可以在html目錄下創建一個index.html,輸入Hello world!,重新跑一下。

microservices
├── docker-compose.yml
└── nginx
    ├── html
    │?? └── index.html
    ├── nginx01
    │?? ├── conf.d
    │?? │?? └── default.conf
    │?? └── nginx.conf
    ├── nginx02
    │?? ├── conf.d
    │?? │?? └── default.conf
    │?? └── nginx.conf
    └── nginx03
        ├── conf.d
        │?? └── default.conf
        └── nginx.conf

現在做個測試,在瀏覽器中訪問localhost:8080,觀察終端打印的日志。

web01    | 172.24.0.1 - - [26/Jun/2019:01:48:28 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
web02    | 172.24.0.2 - - [26/Jun/2019:01:48:28 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"

上述內容表示本次請求通過web01轉發到了web02。

web01    | 172.24.0.1 - - [26/Jun/2019:04:42:36 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
web03    | 172.24.0.2 - - [26/Jun/2019:04:42:36 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"

再次刷新,可以看到請求通過web01轉發到了web03,到目前為止,基本的負載均衡部署就已經完成了,上述的web01是將請求均衡轉發到web02、web03的,這種方法叫輪詢法,下篇文章介紹幾種其他的負載算法。

posted @ 2019-06-26 13:14 張大帥z 閱讀(...) 評論(...) 編輯 收藏
内部期期公开一波中特