使用 Docker 部署 Nginx,配置后端 API 轮询与多个子域名前端应用

news2025/3/10 5:33:48

使用 Docker 部署 Nginx,配置后端 API 轮询与多个子域名前端应用

在这篇博客中,我们将介绍如何通过 Docker 部署 Nginx 服务器,并配置 多个后端 API 的轮询负载均衡,同时通过 子域名 部署多个不同的前端应用。Nginx 将作为反向代理服务器,处理来自客户端的请求,并将其转发到不同的后端服务,同时根据不同的子域名提供静态资源。我们还会介绍如何映射日志文件以便持久化存储。


一、使用 Docker 部署 Nginx

1. 创建 Nginx 配置文件

首先,在服务器上创建用于存放 Nginx 配置文件静态资源 的目录:

mkdir -p /home/middleware/nginx/conf
mkdir -p /home/middleware/nginx/html

然后,在 /home/middleware/nginx/conf 目录下创建 nginx.conf 配置文件,内容如下:

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout 65;

    # 后端 API 配置(轮询负载均衡)
    upstream backend_servers {
        server 192.168.1.1:8080;
        server 192.168.1.2:8080;
    }

    # 反向代理配置
    server {
        listen 80;
        server_name example.com;

        location / {
            root /usr/share/nginx/html;
            index index.html;
            try_files $uri /index.html;
        }

        # 反向代理后端 API
        location /api/ {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

2. 启动 Nginx Docker 容器

使用 Docker 启动 Nginx 容器,运行以下命令:

docker run -d --name my-nginx \
  -p 80:80 \
  -v /home/middleware/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /home/middleware/nginx/html:/usr/share/nginx/html \
  -v /home/middleware/nginx/logs:/var/log/nginx \
  nginx

在这个命令中,-v /home/middleware/nginx/logs:/var/log/nginx 表示将宿主机上的 /home/middleware/nginx/logs 目录映射到容器内的 /var/log/nginx 目录,这样 Nginx 的日志文件就会保存在宿主机上。


二、配置多个后端 API 轮询(负载均衡)

1. 配置后端 API 服务器

我们使用 Nginx 的 upstream 模块来配置多个后端 API 服务器,进行 轮询负载均衡。在上述的 nginx.conf 文件中,我们已经通过以下部分配置了两个后端 API 服务器:

# 后端 API 配置(轮询负载均衡)
upstream backend_servers {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
}

这样,所有请求到 /api/ 路径的请求将通过 Nginx 反向代理,轮询转发到两个后端 API 服务器(192.168.1.1:8080192.168.1.2:8080)。

2. 负载均衡策略

Nginx 提供了多种负载均衡策略:

  • 轮询(默认):Nginx 默认按照请求顺序轮流将流量转发到 upstream 配置的后端服务器。
  • IP 哈希:如果你希望基于客户端 IP 地址来分配请求,可以使用 ip_hash,如下所示:
upstream backend_servers {
    ip_hash;
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
}

这样,来自同一 IP 的请求将始终路由到同一个后端服务器。


三、为多个前端应用配置子域名

1. 配置多个子域名

假设你有多个前端应用,并希望通过不同的 子域名 来访问它们。比如,两个前端应用分别希望通过 frontend1.example.comfrontend2.example.com 来访问。

首先,假设你的前端应用已经打包,并且存放在以下目录:

  • /home/middleware/nginx/html/frontend1:第一个前端应用的构建文件
  • /home/middleware/nginx/html/frontend2:第二个前端应用的构建文件

然后,修改 Nginx 配置文件,配置两个 server 块来分别处理这两个子域名:

# 第一个前端应用(frontend1)
server {
    listen 80;
    server_name frontend1.example.com;

    location / {
        root /usr/share/nginx/html/frontend1;
        index index.html;
        try_files $uri /index.html;
    }

    # 反向代理后端 API
    location /api/ {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

# 第二个前端应用(frontend2)
server {
    listen 80;
    server_name frontend2.example.com;

    location / {
        root /usr/share/nginx/html/frontend2;
        index index.html;
        try_files $uri /index.html;
    }

    # 反向代理后端 API
    location /api/ {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

2. 配置不同的根目录和反向代理

  • server_name frontend1.example.com;:第一个子域名配置,访问 frontend1.example.com 会访问 /usr/share/nginx/html/frontend1 目录下的文件。
  • server_name frontend2.example.com;:第二个子域名配置,访问 frontend2.example.com 会访问 /usr/share/nginx/html/frontend2 目录下的文件。

如果前端应用需要与后端 API 通信,你可以通过 反向代理 将 API 请求转发到后端服务器。这里,/api/ 路径的请求会转发到之前配置的 负载均衡后端服务器

3. 将前端应用文件复制到 Nginx 根目录

将打包后的前端文件复制到相应的目录中:

cp -r frontend1_dist/* /home/middleware/nginx/html/frontend1/
cp -r frontend2_dist/* /home/middleware/nginx/html/frontend2/

四、使用 Docker Compose 部署 Nginx

如果你希望使用 Docker Compose 来管理 Nginx 容器,下面是如何使用 docker-compose.yml 文件来配置和启动 Nginx。

1. 创建 docker-compose.yml 文件

/home/middleware/nginx 目录下创建一个 docker-compose.yml 文件,内容如下:

version: '3'

services:
  nginx:
    image: nginx
    container_name: my-nginx
    ports:
      - "80:80"
    volumes:
      - /home/middleware/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - /home/middleware/nginx/html:/usr/share/nginx/html
      - /home/middleware/nginx/logs:/var/log/nginx
    networks:
      - nginx_network
    restart: always

networks:
  nginx_network:
    driver: bridge

2. 启动 Nginx 服务

docker-compose.yml 文件所在的目录下运行以下命令来启动 Nginx 容器:

docker-compose up -d

3. 停止 Nginx 服务

如果你需要停止服务,可以使用以下命令:

docker-compose down

五、映射 Nginx 日志文件

为了持久化存储 Nginx 的日志文件,我们需要将 Nginx 容器中的日志目录映射到宿主机。通过以下配置,我们可以确保日志文件不会丢失,并方便后续查看和分析。

1. 映射日志文件

在启动 Nginx 容器时,确保将 /var/log/nginx 目录映射到宿主机上的某个目录。例如:

docker run -d --name my-nginx \
  -p 80:80 \
  -v /home/middleware/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /home/middleware/nginx/html:/usr/share/nginx/html \
  -v /home/middleware/nginx/logs:/var/log/nginx \
  nginx

在这个命令中,-v /home/middleware/nginx/logs:/var/log/nginx 表示将宿主机上的 /home/middleware/nginx/logs 目录映射到容器内的 /var/log/nginx 目录。

2. 确保日志目录权限

确保宿主机上的日志目录具有适当的权限,以便 Nginx 能够在该目录中写入日志文件:

mkdir -p /home/middleware/nginx/logs
chmod 777 /home/middleware/nginx/logs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NLP 39、激活函数 ⑤ Swish激活函数】

我的孤独原本是座荒岛,直到你称成潮汐,原来爱是让个体失序的永恒运动 ——25.2.25 Swish激活函数是一种近年来在深度学习中广泛应用的激活函数,由Google Brain团队在2017年提出。其核心设计结合了Sigmoid门控机制和线性输入的乘积&#xff0c…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

(1Prompt1Story)是一种无训练的文本到图像生成方法,通过整合多个提示为一个长句子,并结合奇异值重加权(SVR)和身份保持交叉注意力(IPCA)技术,解决了生成图像中身份不一致…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理,手册分析,驱动程序。初始化,清屏,ASCII字库,显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子,杜…

MySQL语法总结

本篇博客说明: !!!.注意此系列都用的是MySQL语句,和SQLServer,PostgreSQL有些细节上的差别!!! 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

从预测到控制:电力RK3568边缘计算机在电网调度中的全面应用

在智能电网的快速发展中,电力Ubuntu工控机(简称“电力工控机”)作为核心设备,扮演着不可或缺的角色。特别是在智能电网调度场景中,电力工控机的高效、稳定和智能化特性,为电网的稳定运行和高效管理提供了强…

day-106 统计放置房子的方式数

思路 动态规划:因为中间有街道隔开,所以只需计算一边街道的排列方式,最后计算平方即可 解题过程 动态转换方程:f[i]f[i-1]f[i-2] Code class Solution {int num 1000000007;public int countHousePlacements(int n) {int arr[…

PostgreSQL安装和mcp PostgreSQL

文章目录 一. 安装之后修改权限并登录1. 确保当前用户具有sudo权限2. 修改/etc/postgresql/<版本号>/main/pg_hba.conf配置文件为trust&#xff0c;可以免密登录3. 进行免密登录4. 添加root用户和修改postgres用户密码1. postgres用户密码2. 添加root用户3. 为root用户设…

LPZero: Language Model Zero-cost Proxy Search from Zero(未更新完预览版本)

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

字典树运用

字典树运用 字典树LC208 创建字典树0-1字典树 字典树 字典树又叫 前缀树&#xff0c; 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 LC208 创建字典树 这是一个字符串字典树…

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…

0087.springboot325基于Java的企业OA管理系统的设计与实现+论文

一、系统说明 基于springbootvue的企业OA管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

Redis|集群 Cluster

文章目录 是什么能干嘛集群算法-分片-槽位slotredis集群的槽位slotredis集群的分片分片槽位的优势slot槽位映射——业界的3种解决方案小厂&#xff1a;哈希取余分区中厂&#xff1a;一致性哈希算法分区大厂&#xff1a;哈希槽分区 面试题&#xff1a;为什么 Redis 集群的最大槽…

【定制开发】碰一碰发视频系统定制开发,支持OEM

在短视频营销爆发的2025年&#xff0c;"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发&#xff0c;单月视频发布量突破10万条&#xff0c;获客成本降低80%&#xff01;本文将深入解析该系统的技术架构与开发要点&#xff0c;助你快速搭建高…

Linux上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机开发&#xff0c;一般都是默认pc软件开发。既然是pc软件&#xff0c;一般来说都是基于windows平台开发。开放的框架&#xff0c;无非是…

算法005——有效三角形个数

力扣——有效三角形个数点击链接跳转 判断三条边是否能组成三角形&#xff0c;大家第一时间想到的就是两边之和大于第三边 但是运用这个方法&#xff0c;我们需要判断三次&#xff0c;有一个更简单的方法&#xff0c;只需要判断一次 因为 C 已经是三边之中最大的了&#xff…

【STM32】江科大STM32学习笔记汇总(已完结)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 打赏04. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【ST…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境&#xff1a;Uvicorn 直接驱动 作用&#xff1a;Uvicorn 作为 ASGI 服务器&#xff0c;原生支持 FastAPI 的异步特性&#xff0c;提供热重载&#xff08;--reload&#xff09;和高效异步请求处理。 启动命令&#xff1a; u…

OSPF的各种LSA类型,多区域及特殊区域

一、OSPF的LSA类型 OSPF&#xff08;开放最短路径优先&#xff09;协议使用多种LSA&#xff08;链路状态通告&#xff09;类型来交换网络拓扑信息。以下是主要LSA类型的详细分类及其作用&#xff1a; 1. Type 1 LSA&#xff08;路由器LSA&#xff09; 生成者&#xff1a;每个…

pyqt联合designer的运用和设置

PyQt Designer 简介 PyQt Designer 是一个用于创建和设计 PyQt 应用程序用户界面的可视化工具。它允许用户通过拖放方式添加和排列各种控件,如按钮、文本框、滑块等,并设置它们的属性和样式,从而快速构建出美观且功能完整的 UI 界面。 Windows版本:【免费】安装包别管啊啊…