Docker Compose + Nginx + 后端服务运行环境搭建全流程指南(redis、mongdb、nginx、nacos-registry)

🚀 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/wswss://domain/ws

3. 前端页面 404

检查:

复制代码
/opt/mydata/nginx/html/dist/

是否存在 index.html


🎯 总结

通过本文,你已经掌握了:

  • 如何规划 Docker 部署目录
  • 如何编写生产可用的 nginx.conf
  • 如何使用 docker-compose 管理多服务环境
  • 如何处理 HTTPS、WebSocket、CORS
  • 如何启动、停止、排查服务

这套环境已经完全适用于生产部署,也适合团队内部快速搭建测试环境。

如果你想,我可以继续帮你写一篇:

  • 《后端服务 Dockerfile 最佳实践》
  • 《Nginx 反向代理与 WebSocket 深度解析》
  • 《Docker Compose 一键部署脚本》

你想继续扩展哪一篇内容,我可以马上帮你写。

相关推荐
garmin Chen1 小时前
redis面试题
java·数据库·redis·缓存
典典分享指南1 小时前
用大模型把写作 SOP 变成可复用 Prompt
docker·jupyter·eclipse·phpstorm·myeclipse
2601_962181962 小时前
Redis Redis介绍、安装 - Redis客户端
数据库·redis·postman
2601_962128265 小时前
Nginx知识详解(理论+实战更易懂)
运维·nginx
Larru-Sun5 小时前
从零开始用 Docker 部署 Node.js 后端服务
docker·容器·node.js
程序员夏洛5 小时前
Redis 中如何实现分布式锁?
数据库·redis·分布式
feilieren6 小时前
ubuntu 安装 docker
linux·ubuntu·docker
judezh7 小时前
一个 Agent 平台要起 12 个容器,做演示能砍到几个?
docker
飞询7 小时前
ubuntu 安装 docker
ubuntu·docker
2601_962203517 小时前
Nginx 安装配置
运维·nginx