使用 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;}# 反向代理后端 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 服务器:
# 后端 API 配置(轮询负载均衡)
upstream backend_servers {server 192.168.1.1:8080;server 192.168.1.2:8080;
}
这样,所有请求到 /api/
路径的请求将通过 Nginx 反向代理,轮询转发到两个后端 API 服务器(192.168.1.1:8080
和 192.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.com
和 frontend2.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;}# 反向代理后端 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。
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