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

server/2025/3/9 18:45:29/

使用 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 配置文件,内容如下:

nginx">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;}# 反向代理后端 APIlocation /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 服务器:

nginx"># 后端 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,如下所示:
nginx">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 块来分别处理这两个子域名:

nginx"># 第一个前端应用(frontend1)
server {listen 80;server_name frontend1.example.com;location / {root /usr/share/nginx/html/frontend1;index index.html;try_files $uri /index.html;}# 反向代理后端 APIlocation /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;}# 反向代理后端 APIlocation /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。

dockercomposeyml__189">1. 创建 docker-compose.yml 文件

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

version: '3'services:nginx:image: nginxcontainer_name: my-nginxports:- "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/nginxnetworks:- nginx_networkrestart: alwaysnetworks: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.ppmy.cn/server/173735.html

相关文章

DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元

背景 在全球人工智能技术高速迭代的背景下,算力成本高企、异构资源适配复杂、模型部署效率低下等问题,始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点,而博云先进算力管理平台AIOS的全面适配,则为这一技术…

启动/关闭jar服务shell脚本【Linux】

启动sh 本jar包名root.jar 创建名字为 start_server.sh 脚本 放在jar同目录 如果提示没有权限,给sh脚本赋予权限 #!/bin/bash# 应用程序的名称和路径 APP_NAME"root.jar" LOG_FILE"root.log"# 检查应用程序是否已经在运行 if pgrep -f "…

计算机毕业设计SpringBoot+Vue.js码头船只货柜管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

c++实现在同一台主机两个程序实现实时通信

c代码实现同一台主机两个程序实现实时通信 对于进程间通信方式有很多种,对于本机两个程序中可以实时通信那么应该选择哪个呢?很多人最快想到的就是socket通信。 套接字适用于跨网络的进程间通信,具有网络透明性、灵活性和安全性高的优点&am…

MySQL如何给其他账号分配权限?

目录 基础权限分配流程 权限级别对照表 安全事项 MySQL数据库使用root账号为test账号分配权限的标准操作流程及注意事项: 基础权限分配 ‌1、root用户登录, 输入root密码后进入MySQL命令行环境‌ mysql -u root -p2、用户存在性校验 SELECT user,host FROM …

深度生成模型(五)——生成对抗网络 GAN

与传统自编码器(AE)相比,变分自编码器(VAE)在图像生成任务中能够实现更高的图像质量和更丰富的多样性。这主要归功于其利用隐空间中的均值和方差参数生成样本,并通过KL散度在训练过程中对隐空间进行正则化&…

蓝桥杯历年真题题解

1.轨道炮&#xff08;数学模拟&#xff09; #include <iostream> #include <map> using namespace std; const int N1010; int x[N],y[N],v[N]; char d[N]; int main() {int n;int ans-100;cin>>n;for(int i1;i<n;i)cin>>x[i]>>y[i]>>v…

面试时,如何回答好“你是怎么测试接口的?”

一、回答框架设计&#xff08;金字塔原理&#xff09; 总述&#xff1a; "我通常采用分层测试策略&#xff0c;遵循需求分析→场景拆解→用例设计→自动化实施→持续监控的闭环流程。以最近测试的支付中台项目为例&#xff0c;核心围绕功能正确性、异常鲁棒性、安全防护、…