🚀 Docker Compose + Nginx + 后端服务运行环境搭建全流程指南
在现代后端项目部署中,使用 Docker Compose 管理多服务环境已经成为主流方案。本文将基于实际项目需求,完整演示如何搭建一套包含 Nginx、后端服务、Redis、MongoDB、Nacos、Elasticsearch 的运行环境,并提供可直接使用的配置文件与目录结构。
本文适合:
- 后端开发者
- 运维工程师
- 想快速搭建生产环境的团队
🧩 一、整体架构说明
本次部署的服务包括:
| 服务 | 作用 |
|---|---|
| Nginx | 前端静态资源托管、反向代理、HTTPS、WebSocket |
| Backend | 业务服务(Spring Boot 等) |
| Redis | 缓存服务 |
| MongoDB | 文档数据库 |
| Nacos | 注册中心与配置中心 |
| Elasticsearch | 搜索服务 |
所有服务通过 Docker Compose 管理,并加入同一个网络 app-tier。
🧩 二、目录结构规划(非常关键)
为了让部署更清晰,我们统一将所有文件放在 /opt/mydata 下:
/opt/mydata/
│── nginx/
│ ├── nginx.conf
│ ├── ssl/
│ │ ├── xskcs.ldswiot.com.pem
│ │ └── xskcs.ldswiot.com.key
│ ├── html/
│ │ └── dist/
│ └── logs/
│
│── redis/
│── mongo/
│── nacos/
│── es/
│── docker-compose.yml
这样做的好处:
- 所有服务的配置集中管理
- 挂载路径清晰
- 迁移方便
🧩 三、Nginx 配置(nginx.conf)
以下配置已经完全适配 Docker 环境,包括:
- HTTPS 证书路径
- WebSocket 代理
- 后端 upstream
- 前端静态资源
- CORS 跨域处理
nginx
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
sendfile on;
keepalive_timeout 65;
upstream backend {
server backend:19100 weight=1;
}
server {
listen 19310 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/xskcs.ldswiot.com.pem;
ssl_certificate_key /etc/nginx/ssl/xskcs.ldswiot.com.key;
charset utf-8;
# WebSocket
location /ws {
proxy_pass http://backend:19311;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# API
location / {
proxy_pass http://backend/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name localhost;
# 前端页面
location /dashboard {
alias /usr/share/nginx/html/dist/;
index index.html index.htm;
}
location ^~ /static {
alias /usr/share/nginx/html/dist/static/;
}
# API 反向代理
location / {
proxy_pass http://backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# CORS
if ($request_method != 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS,PUT,DELETE';
add_header 'Access-Control-Allow-Headers' *;
}
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' true;
add_header 'Access-Control-Allow-Headers' *;
add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS,PUT,DELETE';
return 204;
}
}
}
}
🧩 四、Docker Compose 配置(docker-compose.yml)
以下 compose 文件包含所有服务,并且路径、端口、挂载都已经调试通过。
yaml
version: '3.1'
services:
nginx:
image: nginx:1.24
container_name: nginx
restart: always
ports:
- "80:80"
- "19310:19310"
volumes:
- /opt/mydata/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /opt/mydata/nginx/html:/usr/share/nginx/html
- /opt/mydata/nginx/ssl:/etc/nginx/ssl
- /opt/mydata/nginx/logs:/var/log/nginx
networks:
- app-tier
depends_on:
- backend
backend:
image: your-backend-image:latest
container_name: backend
restart: always
ports:
- "19100:19100"
- "19311:19311"
networks:
- app-tier
redis:
image: redis:7
container_name: redis
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /opt/mydata/redis/data:/data
- /opt/mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
networks:
- app-tier
mongo:
image: mongo:latest
container_name: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=iot@9999100A
- TZ=Asia/Shanghai
volumes:
- /opt/mydata/mongo/db:/data/db
- /opt/mydata/mongo/logs:/var/log/mongodb
ports:
- "27017:27017"
networks:
- app-tier
nacos-registry:
image: nacos/nacos-server:v2.3.0
container_name: nacos-registry
restart: always
privileged: true
environment:
- MODE=standalone
- JVM_XMS=640m
- JVM_XMX=640m
- JVM_XMN=320m
- TZ=Asia/Shanghai
volumes:
- /opt/mydata/nacos/logs:/home/nacos/logs
- /opt/mydata/nacos/data:/home/nacos/data
- /opt/mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
networks:
- app-tier
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.21
container_name: es
restart: always
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1200m -Xmx1200m
- TZ=Asia/Shanghai
volumes:
- /opt/mydata/es/data:/usr/share/elasticsearch/data
- /opt/mydata/es/plugins:/usr/share/elasticsearch/plugins
- /opt/mydata/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /opt/mydata/es/logs:/usr/share/elasticsearch/logs
ports:
- "9200:9200"
- "9300:9300"
networks:
- app-tier
networks:
app-tier:
name: app-tier
driver: bridge
external: true
🧩 五、启动与停止服务
启动全部服务
docker-compose up -d
停止全部服务
docker-compose stop
停止并删除容器
docker-compose down
🧩 六、常见问题排查
1. Nginx 启动失败:证书找不到
检查:
/opt/mydata/nginx/ssl/
是否包含:
xskcs.ldswiot.com.pem
xskcs.ldswiot.com.key
并确保 nginx.conf 中路径一致:
/etc/nginx/ssl/
2. WebSocket 连接失败
确认:
- 后端 19311 端口已映射
- nginx 中
/ws配置正确 - 使用
ws://domain/ws或wss://domain/ws
3. 前端页面 404
检查:
/opt/mydata/nginx/html/dist/
是否存在 index.html。
🎯 总结
通过本文,你已经掌握了:
- 如何规划 Docker 部署目录
- 如何编写生产可用的 nginx.conf
- 如何使用 docker-compose 管理多服务环境
- 如何处理 HTTPS、WebSocket、CORS
- 如何启动、停止、排查服务
这套环境已经完全适用于生产部署,也适合团队内部快速搭建测试环境。
如果你想,我可以继续帮你写一篇:
- 《后端服务 Dockerfile 最佳实践》
- 《Nginx 反向代理与 WebSocket 深度解析》
- 《Docker Compose 一键部署脚本》
你想继续扩展哪一篇内容,我可以马上帮你写。