)
文章目录一、前言二、实验环境三、环境准备宝塔 Docker四、Docker 部署两个后端 Nginx 容器五、宝塔配置 Nginx 负载均衡六、功能验证七、常见问题与解决方案八、核心知识点总结九、总结与心得一、前言在搭建个人博客或部署微服务时我们经常会遇到这样一个问题服务器上跑了多个应用比如 Spring Boot 项目、Node.js 服务或 Docker 容器它们分别占用不同的端口如 8080、3000。难道我们要让用户记住http://ip:8080这样难看的地址吗显然不行。这时候就需要用到Nginx 反向代理。传统的 Nginx 配置对新手来说比较劝退需要手动修改nginx.conf一不小心就会报404或502。而宝塔面板BT Panel提供了可视化的配置界面让我们能像搭积木一样轻松搞定反向代理和负载均衡。本文将基于我的一次 Docker 实验详细记录如何通过宝塔面板将宿主机上的两个 Nginx 容器nginx_web1、nginx_web2通过反向代理整合成一个统一入口并实现加权轮询Weight负载均衡。无论你是运维新手还是正在做 Docker 实验的学生这篇实战笔记都能帮你少踩坑快速上手。二、实验环境1️⃣硬件环境云服务器CentOS 7 操作系统2️⃣软件环境组件版本/说明操作系统CentOS 7容器引擎DockerWeb 服务Nginx管理面板宝塔面板 (BT Panel)3️⃣架构说明本次实验采用单宿主机 多容器的架构由宿主机 Nginx 充当反向代理与负载调度器将请求分发给后端的两个 Docker 容器。NGINX反向代理原理三、环境准备宝塔 Docker1️⃣安装宝塔面板if[-f/usr/bin/curl];thencurl-sSOhttps://download.bt.cn/install/install_panel.sh;elsewget-Oinstall_panel.sh https://download.bt.cn/install/install_panel.sh;fibashinstall_panel.sh ed8484bec2️⃣选择docker选项并编译安装等待时间比较久别急3️⃣配置 Docker 镜像源加速下载为了提高 Docker 镜像的拉取速度特别是在国内服务器上需要配置国内镜像加速器。执行以下命令编辑 Docker 配置文件vi/etc/docker/daemon.json{registry-mirrors:[https://docker.m.daocloud.io,https://docker.1ms.run,https://docker.xuanyuan.me]}4️⃣清空宿主机 Nginx 默认首页文件为了排除宝塔默认欢迎页面的干扰确保后续反向代理实验的准确性我们需要清空宿主机的 Nginx 默认首页。操作步骤删除原有默认页面# 直接删除并创建空文件rm-f/www/server/nginx/html/index.htmltouch/www/server/nginx/html/index.html四、Docker 部署两个后端 Nginx 容器本节将通过 Docker 快速拉起两个 Nginx 容器模拟后端业务节点并通过修改默认首页内容来区分不同节点。1️⃣拉取 Nginx 镜像首先从 Docker Hub 拉取最新的 Nginx 镜像并查看本地镜像列表。dockerpull nginxdockerimages2️⃣创建并配置 nginx_web1创建第一个容器映射宿主机8080端口到容器80端口。dockerrun-p8080:80--namenginx_web1-itnginx /bin/bash#进入容器终端后修改默认首页内容用于标识节点echohello nginx_web1/usr/share/nginx/html/index.htmlexit3️⃣创建并配置 nginx_web2创建第二个容器映射宿主机8081端口到容器80端口。dockerrun-p8081:80--namenginx_web2-itnginx /bin/bash#进入容器终端后修改默认首页内容用于标识节点echohello nginx_web2/usr/share/nginx/html/index.htmlexit注使用 -it进入容器修改文件后执行 exit会导致容器停止。这是为了方便实验演示生产环境建议使用 -d后台运行并配合 -v挂载文件。4️⃣启动容器并运行 Nginx 服务由于使用-it参数创建后容器处于停止状态需手动启动并后台运行 Nginx 服务。#启动两个容器dockerstart nginx_web1 nginx_web2#在容器内后台启动 Nginx 进程dockerexec-dnginx_web1servicenginx startdockerexec-dnginx_web2servicenginx start#确认容器运行状态dockerps五、宝塔配置 Nginx 负载均衡为了让宿主机能够对外统一提供服务并分发流量到后端两个 Docker 容器我们需要在宝塔面板中配置 Nginx 的upstream模块。1️⃣配置方式选择有两种方式可以修改 Nginx 配置任选其一即可方式操作路径适用场景方式一推荐宝塔面板 → 软件商店 → Nginx →配置修改新手友好不易因路径错误导致修改失败方式二命令行编辑/www/server/nginx/conf/nginx.conf熟悉 Linux 运维习惯使用 Vim 的用户2️⃣添加负载均衡配置在http {}代码块内注意不是server {}里面添加以下配置#定义后端服务器集群命名为 masterupstream master{# 权重 weight 越大被分配的请求越多#注意请将 192.168.150.10 替换为你服务器的实际内网 IPserver192.168.150.10:8080weight10;server192.168.150.10:8081weight20;}#定义虚拟主机server{listen80;server_name master;# 此处应与 upstream 名称对应或填写你的域名location /{# 转发请求到 upstream 集群proxy_pass http://master;# 传递客户端真实信息proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;}}3️⃣重载 Nginx 配置配置保存后必须重载 Nginx 使其生效切勿直接重启以免中断现有连接。操作宝塔面板 → Nginx →重载配置Reload4️⃣放行端口关键步骤如果端口未放行外部用户将无法访问服务。宝塔面板防火墙进入宝塔面板 → 安全放行以下端口端口协议备注80TCPHTTP 默认端口8080TCP后端节点18081TCP后端节点2宝塔防火墙/服务器安全放行 80、8080、8081 端口六、功能验证配置完成后我们需要验证负载均衡是否生效以及权重分配是否符合预期。1️⃣访问测试在浏览器中输入你的服务器公网 IP或绑定的域名例如http://your_server_ip。操作动作打开浏览器访问地址。连续多次刷新页面Ctrl F5 强制刷新。2️⃣预期结果由于我们在upstream中配置了权重页面内容会交替变化且出现频率不同页面显示内容对应后端节点权重值预期出现概率hello nginx_web1nginx_web1 (8080)10较低 (约 33%)hello nginx_web2nginx_web2 (8081)20较高 (约 67%)现象描述第一次刷新显示hello nginx_web1第二次刷新显示hello nginx_web2第三次刷新显示hello nginx_web2第四次刷新显示hello nginx_web1…以此类推 数据分析因为weight20是weight10的两倍所以在大量请求下nginx_web2接收到的访问量理论上会是nginx_web1的2 倍。3️⃣验证结论通过多次刷新页面能够按照权重比例交替显示不同内容证明Nginx 反向代理与加权轮询负载均衡配置成功。七、常见问题与解决方案在配置 Docker 和 Nginx 负载均衡的过程中可能会遇到以下几个典型问题请参考下表进行排查故障现象原因解决方案docker run 后容器停止使用-it启动交互模式执行exit会终止容器进程。使用docker start 容器名重新启动容器。外网无法访问端口服务器防火墙宝塔或云服务商安全组未放行对应端口。前往宝塔面板 - 安全 - 放行端口同时检查云服务器控制台的入方向安全组规则。Nginx 重载失败修改配置文件后存在语法错误。执行nginx -t命令检查配置文件语法是否正确。只访问单个节点另一个容器未正常启动或者负载均衡配置中的权重weight设置导致概率极低。执行docker ps检查所有后端容器是否都处于 Up 状态。八、核心知识点总结通过本次实验我们不仅完成了环境搭建还验证了 Nginx 负载均衡的核心机制。以下是关键知识点复盘1️⃣Weight 权重加权轮询定义weight决定了后端节点被分配请求的概率。规则数值越大接收的请求越多。实验结论nginx_web1(weight10)nginx_web2(weight20)访问比例理论值为1 : 2即每 3 次请求中web2 会被访问 2 次。2️⃣常用调度算法除了加权轮询Nginx 还支持多种调度策略适用于不同业务场景算法说明适用场景加权轮询 (default)按权重比例轮流分配请求通用场景服务器性能不均时ip_hash根据客户端 IP 计算 hash固定访问某节点解决 Session 共享问题least_conn优先分配给当前连接数最少的节点请求处理时间长短不一的场景url_hash根据请求的 URL 进行 hash 分配静态资源缓存提高缓存命中率3️⃣proxy_set_header 的作用在反向代理配置中这一步骤至关重要用于向后端服务器传递客户端的真实信息proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;目的防止后端服务只能获取到代理服务器的 IP而无法获取真实访客 IP。价值确保后端日志统计准确便于安全审计和用户行为分析。4️⃣容器数据持久化重点问题Docker 容器重启或重建后内部的数据如我们修改的index.html会丢失。解决方案使用-v参数进行目录挂载Volume Mapping将宿主机的目录映射到容器内。九、总结与心得本次实验通过宝塔面板 Docker Nginx的组合成功搭建了一套基于反向代理的负载均衡架构。相比于纯命令行的复杂配置宝塔的可视化操作大大降低了运维门槛而 Docker 则让我们能够快速克隆出多个后端业务节点。 实验成果成功实现了加权轮询Weighted Round Robin策略流量按1:2的比例分发给后端容器。掌握了proxy_set_header等关键参数确保了后端能获取真实用户 IP。验证了“单入口、多节点”的高可用架构模式。 避坑指南端口放行是重中之重很多时候配置对了但访问不通多半是云服务器安全组或宝塔防火墙没开。容器生命周期使用-it进入容器后切记用exit退出会导致容器停止需用docker start重启。配置备份修改 Nginx 配置前建议先备份原文件或在宝塔中点击“保存并重载”避免因手误导致服务瘫痪。 下一步计划目前的配置仅适用于测试环境在生产环境中我们还需要考虑HTTPS 证书配置Let’s EncryptNginx 健康检查主动剔除故障节点动静分离静态资源直接由 Nginx 处理动态请求转发给容器如果你也在学习 Docker 或 Nginx 运维希望这篇实战笔记能帮你少走弯路如果有问题欢迎在评论区交流讨论 。