利用容器編排完成haproxy和nginx負載均衡架構實施

1 創建測試目錄和文件

[root@docker-a ~]# mkdir lee
[root@docker-a ~]# cd lee/
[root@docker-a lee]# touch docker-compose.yml # 容器編排工具Docker Compose 默認識別docker-compose.yml文件

2 編寫docker-compose.yml文件和haproxy.cfg文件

2.1 核心配置說明

2.1.1 服務結構

  • 共定義 3 個服務:web1web2(Nginx 網頁服務)和?haproxy(負載均衡服務)
  • 形成 "負載均衡器 + 兩個后端服務" 的經典架構,通過 Haproxy 分發請求到 web1 和 web2

2.1.2 網絡通信

  • mynet1?是核心通信網絡,三個服務都加入此網絡,確保 Haproxy 能訪問后端 Nginx
  • 容器間可通過容器名(如web1web2)直接通信(Docker 內置 DNS 解析)
  • mynet2?為預留網絡,可用于后續擴展其他服務(如添加數據庫時使用)

2.1.3 數據持久化

  • Nginx 的網頁內容通過volumes掛載到宿主機,實現:
    • 宿主機直接修改網頁內容(無需進入容器)
    • 容器重建后數據不丟失(內容保存在宿主機)

2.1.4 端口策略

  • Nginx 容器使用expose: 80:僅在內部網絡暴露端口,外部無法直接訪問(增強安全性)
  • Haproxy 使用ports: 80:80:將宿主機 80 端口開放,作為外部訪問的唯一入口

2.1.5 重啟策略

  • restart: always?確保服務在意外退出或服務器重啟后自動恢復,提高可用性

2.2 工作流程

  1. 外部用戶訪問宿主機的 80 端口(如http://192.168.36.101
  2. 請求通過端口映射進入 Haproxy 容器的 80 端口
  3. Haproxy 根據haproxy.cfg中的配置(如輪詢策略),將請求轉發到web1:80web2:80
  4. Nginx 容器處理請求,返回/usr/share/nginx/html目錄下的index.html內容(來自宿主機掛載的目錄)

2.3 編寫docker-compose.yml文件

[root@docker-a lee]# vim docker-compose.yml
services:# 第一個Nginx服務容器(web1)web1:# 使用的基礎鏡像:最新版Nginximage: nginx:latest# 容器的自定義名稱(便于識別和操作)container_name: web1# 重啟策略:總是重啟(容器退出時自動重啟,包括系統啟動時)restart: always# 加入的網絡(與Haproxy共享mynet1網絡實現通信)networks:- mynet1# 暴露容器內部端口(僅在容器所在網絡內可見,外部無法直接訪問)expose:- 80  # Nginx默認監聽的端口# 數據卷掛載(將宿主機目錄與容器內目錄關聯,實現文件共享和持久化)volumes:# 宿主機目錄:/docker/web/html1 映射到容器內Nginx的默認網頁目錄# 這樣修改宿主機的/html1目錄內容,容器內會實時同步- /docker/web/html1:/usr/share/nginx/html# 第二個Nginx服務容器(web2),與web1配置類似,用于提供不同內容實現負載均衡效果web2:image: nginx:latestcontainer_name: web2restart: alwaysnetworks:- mynet1  # 同樣加入mynet1網絡,確保Haproxy能訪問expose:- 80volumes:# 與web1使用不同的宿主機目錄,以便存放不同的網頁內容- /docker/web/html2:/usr/share/nginx/html# Haproxy負載均衡服務,用于分發請求到web1和web2haproxy:# 使用2.3版本的Haproxy鏡像(需與配置文件兼容)image: haproxy:2.3container_name: haproxyrestart: always# 加入兩個網絡:# - mynet1:用于與web1、web2通信,獲取后端服務# - mynet2:可用于連接其他服務(當前配置中未使用,預留擴展)networks:- mynet1- mynet2# 掛載Haproxy配置文件:宿主機的haproxy.cfg映射到容器內的默認配置路徑# 注意:不同版本Haproxy的默認配置路徑可能不同,2.3版本路徑為/usr/local/etc/haproxy/volumes:- /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg# 端口映射:將宿主機的80端口映射到容器內的80端口# 外部訪問宿主機80端口時,請求會轉發到Haproxy容器的80端口ports:- 80:80# 定義網絡配置
networks:# 第一個網絡:供web1、web2和haproxy內部通信mynet1:# 使用bridge驅動(Docker默認的網絡驅動,創建獨立的網絡命名空間)driver: bridge# 第二個網絡:預留網絡,可用于擴展其他服務(如數據庫、緩存等)mynet2:driver: bridge

2.3.1 啟動配置文件

[root@docker-a lee]# docker compose up -d

2.4 編寫haproxy.cfg文件

[root@docker-a lee]# vim /docker/conf/haproxy/haproxy.cfg
[root@docker-a lee]# cat /docker/conf/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global# to have these messages end up in /var/log/haproxy.log you will# need to:## 1) configure syslog to accept network log events.  This is done#    by adding the '-r' option to the SYSLOGD_OPTIONS in#    /etc/sysconfig/syslog## 2) configure local2 events to go to the /var/log/haproxy.log#   file. A line like the following can be added to#   /etc/sysconfig/syslog##    local2.*                       /var/log/haproxy.log#log         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEM#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000listen webcluster  # 定義一個名為webcluster的監聽集群bind *:80      # 監聽所有網絡接口的80端口(接收外部HTTP請求)mode http      # 工作模式為HTTP(專門處理HTTP協議)balance roundrobin  # 負載均衡算法:輪詢(依次分發請求到后端服務器)# 定義后端服務器1:web1容器的80端口server server1 web1:80 check inter 2 rise 3# 定義后端服務器2:web2容器的80端口server server2 web2:80 check inter 2 rise 3
[root@docker-a lee]#

2.4.1 寫入測試內容

[root@docker-a lee]# echo web1 > /docker/web/html1/index.html
[root@docker-a lee]# echo web2 > /docker/web/html2/index.html
[root@docker-a lee]# cat /docker/web/html1/index.html
web1
[root@docker-a lee]# cat /docker/web/html2/index.html
web2
[root@docker-a lee]#

2.4.2?重啟所有容器

[root@docker-a lee]# docker compose down
[root@docker-a lee]# docker compose up -d
[root@docker-a lee]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                                 NAMES
e201c44d759b   haproxy:2.3    "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   haproxy
c16240d3589d   nginx:latest   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   80/tcp                                web2
7c474eee1643   nginx:latest   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   80/tcp                                web1

3 測試效果

[root@docker-a lee]# curl 192.168.36.101
web1
[root@docker-a lee]# curl 192.168.36.101
web2
[root@docker-a lee]# curl 192.168.36.101
web1
[root@docker-a lee]# curl 192.168.36.101
web2

通過此配置,可以實現簡單的負載均衡和高可用架構,適合作為 Web 服務的基礎部署方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92933.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WinRAR v7.13 烈火漢化穩定版,解壓縮全格式專家

[軟件名稱]: WinRAR v7.13 烈火漢化穩定版 [軟件大小]: 3.8 MB [下載通道]: 夸克盤 | 迅雷盤 軟件介紹 WinRAR 壓縮文件管理器,知名解壓縮軟件,電腦裝機必備軟件,國內最流行最好用的壓縮文件管理器、解壓縮必備軟件。它提供 RAR 和 ZIP 文…

強化學習常用數據集

強化學習常用數據集數學推理數據集數值標簽GSM8K(2021 OpenAI)問答數據集在LLM場景下進行強化學習訓練的時候,時常會涉及到各種各樣的數據集,容易記不住,因此開個帖子記錄一下。可采取的分類方法有很多,這里直接按照領…

ROS2學習(1)—基礎概念及環境搭建

文章目錄核心框架環境搭建小烏龜機器人控制小烏龜啟動鍵盤控制啟動rqt查看ros節點關系核心框架 這里有幾個比較重要的概念: 四大通信機制:話題(Topic)、服務(Service)、動作(Action&#xff09…

基于STM32單片機超聲波測速測距防撞報警設計

1 系統功能介紹 本設計是一套基于 STM32F103C8T6 單片機 的超聲波測速測距防撞報警系統,能夠實現對目標物體的實時測距與測速,并通過 TFT 彩屏進行動態顯示,同時根據用戶設定的距離與速度閾值進行報警提示。該系統不僅可以用于固定場景的安全…

麒麟系統播放 pptx

目錄 python 操作 LibreOffice 控制pptx 一頁一頁播放 1. 安裝 LibreOffice(麒麟系統基于 Debian/Ubuntu) 2. 如果只想安裝 PPT 播放/轉換(Impress) 1. 啟動 LibreOffice UNO 服務 2. Python 控制播放uno安裝方法&#xff1a…

嵌入式Linnux學習 -- 軟件編程2

四、IO1. 概念1. IO 指 input / output2. Linux系統中一切皆是文件3. IO操作的對象是文件2. 文件1. 概念一段數據的集合2. 特點文件通常存放在外存中,掉點后數據不會丟3. 分類b(block,塊設備文件)-- 按塊掃描信息的文件&#x…

Spark02 - SparkContext介紹

一、應用入口:SparkContextSpark Application 程序入口為:SparkContext,任何一個應用首先需要構建 SparkContext 對象,如下兩步構建:第一步、創建 SparkConf 對象設置 Spark Application 基本信息,比如應用…

Selenium動態元素定位

動態元素定位方法一:使用CSS選擇器通過部分匹配操作符定位動態屬性中的固定部分。*(包含),^(開頭),$(結尾)。/* 匹配id前綴為user_的元素 */ cssdiv[id^"user_"…

OBOO鷗柏丨115寸商用屏/工業液晶顯示器招標投標核心標底參數要求

整機參數要求:商用液晶顯示器/工業LCD一體機/商業智能終端機/工業防爆顯示器/招標投標核心標底參數要求1、整機屏幕采用≥采用115英寸超高清原廠原包原裝工業LCD液晶屏面板;具有高色域,顯示動態視頻、web及3D動畫時,保障運動畫面流…

麻溜啟動Oracle實例demo

注意:鏡像非常大并且外網網絡過慢,可能得pull一天(n次超時)。。md后臺靜默pull命令: nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 啟動實例&#xff1…

應用監控工具Skywalking

目錄 Skywalking介紹 Skywalking架構 Skywalking安裝 Skywalking使用 Skywalking配置 Skywalking數據持久化 Skywalking告警 Skywalking介紹 Apache Skywalking是一個開源的應用性能監控(Application Performance Monitoring,APM)工具…

TCP服務建立的全流程詳解

TCP的服務監聽步驟(等待客戶端連接前)TCP 服務器通過以下步驟完成從初始化到等待客戶端連接,為后續的數據傳輸(send()/recv())奠定了基礎一、創建套接字(Socket)作用:套接字是網絡通…

數據結構 雙鏈表與LinkedList

本節目標: 認識并且能夠實現一個雙鏈表認識LinkedList類并且知道如何去使用 1.雙鏈表 概念 在數據結構中,雙鏈表(Doubly Linked List) 是一種常見的線性數據結構,它由一系列節點組成,每個節點不僅包含數據…

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid 在 JetBrains 發布的 IntelliJ IDEA、PyCharm 2024.2 和 2025.2 新版本中,增加了一個新的功能——區域選擇。在設置菜單中,你可以找到這一選項&#…

GSON 框架下百度天氣 JSON 數據轉 JavaBean 的實戰攻略

目錄 前言 一、百度天氣JSON 1、請求參數 2、返回參數 3、屬性映射 二、GSON屬性映射實戰 1、類對象映射 2、屬性字段映射 3、日期數據映射 三、天氣接口對象展示 1、接口調用 2、Java屬性打印輸出 四、總結 前言 在當今數字化時代,數據的高效處理與轉換…

NAS技術在縣級融媒體中心的架構設計與安全運維淺析

NAS技術在縣級融媒體中心的架構設計與安全運維淺析 ——原理剖析、應用實踐與防御體系建設作者:高級網絡安全工程師 吉林?鎮賚融媒 劉曉偉 最后更新:2025年8月 適用對象:媒體行業網絡安全從業者一、NAS技術核心原理剖析 1. 基礎架構 NAS&am…

CobaltStrike的搭建和使用

下載CobaltStrike環境建議使用jdk17,其他java版本有些功能可能無法使用通過網盤分享的文件:CS4.7key-mht.zip 鏈接: https://pan.baidu.com/s/1CRd1x4r6EIk14BD3UCLgxw?pwdevf4 提取碼: evf4將下載的文件分別放在服務器和 本地/kali 上 也就是服務器為…

【Altium designer】一鍵給多個器件添加參數

目的: 一鍵給N個元器件/Part添加參數和修改參數值,比如一鍵給多個電阻添加“備注”并賦予備注的內容為“不焊接”,或者更改“備注”的內容為“不焊接”或空。 背景: 剛入門用AD畫原理圖,因為原理圖的電阻、電容和芯片等等的冗余/兼容設計太多,增加備注不焊的元器件位號…

熟練掌握switch語句:技巧與運用

目錄 一、switch語句基礎 基本語法結構: 在C/C中: 注意事項: 二、if與switch語句對比 示例:計算整數除以3的余數 使用if語句實現: 使用switch語句實現: 三、break語句的作用 示例(無br…

【03】廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析

廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析 1.下面的程序的輸出是()。2.在頭文件中#ifndef/#define/#endif的作用是4.執行下面程序中的輸出語句后,輸出的結果是()6.在32位處理器上,運行如下程序后p的值為()。10.設有兩字符串“…