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 一键部署脚本》

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

相关推荐
^ω^。2 小时前
Docker核心技术原理与数据持久化全面解析
docker
先跑起来再说2 小时前
Redis Stream 深入理解:它到底解决了什么问题
数据库·redis·缓存
Hi202402172 小时前
使用Docker Compose搭建LibreNMS网络监控系统
运维·网络·docker·容器
小北方城市网2 小时前
Spring Cloud Gateway 生产级实践:高可用架构、灰度发布与故障排查
spring boot·redis·分布式·缓存·架构·wpf
像少年啦飞驰点、2 小时前
零基础入门 Redis:从“缓存是什么”到自己动手写一个高并发计数器
spring boot·redis·缓存·编程入门·后端开发·小白教程
indexsunny3 小时前
互联网大厂Java求职面试实战:Spring Boot、微服务与Redis缓存技术解析
java·spring boot·redis·微服务·面试·电商·技术栈
wWYy.3 小时前
详解redis(13):数据结构GEO
数据库·redis·缓存
迎仔3 小时前
HTTPS 原理与配置参数通俗指南
redis·网络协议·https