尚硅谷-尚庭公寓部署文档


整合版部署文档


部署架构图

用户访问
Nginx 网关
前端静态资源
后端API代理
app.domain.com
admin.domain.com
service1:8080
service2:8081

1. 项目目录结构

deploy/
├── docker-compose.yml          # 容器编排主文件
├── frontend/                   # 前端静态资源
│   ├── app/                    # 主应用构建产物
│   │   ├── index.html
│   │   ├── static/
│   │   └── favicon.ico
│   └── admin/                  # 管理后台构建产物
│       ├── index.html
│       ├── static/
│       └── favicon.ico
├── backend/                    # 后端服务
│   ├── service1/               # 服务1
│   │   ├── Dockerfile
│   │   └── service1.jar
│   └── service2/               # 服务2
│       ├── Dockerfile
│       └── service2.jar
└── nginx/                      # Nginx配置
    ├── nginx.conf
    └── conf.d/                 # 站点配置
        ├── app.conf            # 主应用配置
        └── admin.conf          # 管理后台配置

增加注释的 Dockerfile 配置

(1) 后端服务1 Dockerfile (backend/service1/Dockerfile)

# 使用官方 OpenJDK 17 基础镜像
FROM eclipse-temurin:17-jdk

# 设置容器内工作目录为 /app
WORKDIR /app

# 将宿主机当前目录下的 service1.jar 复制到容器工作目录
COPY service1.jar .

# 声明容器运行时暴露的端口(8080)
EXPOSE 8080

# 容器启动时执行的命令 - 运行 Java 应用
CMD ["java", "-jar", "service1.jar"]

(2) 后端服务2 Dockerfile (backend/service2/Dockerfile)

# 使用官方 OpenJDK 17 基础镜像
FROM eclipse-temurin:17-jdk

# 设置容器内工作目录为 /app
WORKDIR /app

# 将宿主机当前目录下的 service2.jar 复制到容器工作目录
COPY service2.jar .

# 声明容器运行时暴露的端口(8081)
EXPOSE 8081

# 容器启动时执行的命令 - 运行 Java 应用
CMD ["java", "-jar", "service2.jar"]

Dockerfile 配置说明

指令说明
FROM指定基础镜像,这里使用官方 OpenJDK 17 镜像作为运行环境
WORKDIR设置工作目录,后续命令都在此目录执行
COPY将本地文件复制到容器内,这里复制编译好的 JAR 包
EXPOSE声明容器运行时监听的端口号,便于文档化和端口映射
CMD指定容器启动时执行的命令,这里是运行 Java 应用程序

重要注意事项

  1. JAR 文件位置
    确保 JAR 文件与 Dockerfile 在同一目录下,否则构建会失败

  2. 端口映射
    docker-compose.yml 中不需要显式映射后端端口,因为:

    • 服务通过 Docker 内部网络通信
    • 外部访问通过 Nginx 代理
  3. 多阶段构建(高级用法)
    如需在容器内编译代码,可使用多阶段构建:

    # 第一阶段:构建应用
    FROM maven:3.8.6 AS build
    WORKDIR /app
    COPY . .
    RUN mvn clean package -DskipTests
    
    # 第二阶段:运行应用
    FROM eclipse-temurin:17-jdk
    WORKDIR /app
    COPY --from=build /app/target/service1.jar .
    CMD ["java", "-jar", "service1.jar"]
    
  4. 环境变量配置
    应用配置应通过 docker-compose.yml 的环境变量注入:

    environment:
      - DB_URL=jdbc:mysql://db:3306/app
      - REDIS_HOST=redis
    
  5. 时区设置
    如需统一时区,可在 Dockerfile 中添加:

    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    

3. Nginx 配置

(1) 主配置文件 (nginx/nginx.conf)

events {}
http {
    include /etc/nginx/conf.d/*.conf;
    
    # 全局优化配置
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    keepalive_timeout 65;
    server_tokens off;
}

(2) 前端路由配置 (nginx/conf.d/app.conf)

server {
    listen 80;
    server_name app.domain.com;

    location / {
        root /usr/share/nginx/html/app;
        try_files $uri $uri/ /index.html;
        index index.html;
        
        # 缓存与安全头
        expires 1y;
        add_header Cache-Control "public";
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";
    }

    # 代理后端服务1
    location /api/service1 {
        proxy_pass http://service1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 75s;
    }
}

(3) 管理后台配置 (nginx/conf.d/admin.conf)

server {
    listen 80;
    server_name admin.domain.com;

    location / {
        root /usr/share/nginx/html/admin;
        try_files $uri $uri/ /index.html;
        index index.html;
        
        # 禁用缓存
        add_header Cache-Control "no-store, no-cache, must-revalidate";
    }

    # 代理后端服务2
    location /api/service2 {
        proxy_pass http://service2:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # 健康检查端点
    location = /health {
        return 200 'OK';
        add_header Content-Type text/plain;
    }
}

4. Docker Compose 配置

version: '3.8'

services:
  # Nginx网关服务
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./frontend/app:/usr/share/nginx/html/app:ro
      - ./frontend/admin:/usr/share/nginx/html/admin:ro
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./logs/nginx:/var/log/nginx
    networks:
      - app-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 3s

  # 后端服务1
  service1:
    build:
      context: ./backend/service1
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - TZ=Asia/Shanghai
    networks:
      - app-network
    restart: unless-stopped
    deploy:
      resources:
        limits:
          memory: 512M

  # 后端服务2
  service2:
    build:
      context: ./backend/service2
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - TZ=Asia/Shanghai
    networks:
      - app-network
    restart: unless-stopped
    deploy:
      resources:
        limits:
          memory: 512M

# 自定义网络
networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

5. 部署操作流程

# 1. 准备目录结构
mkdir -p deploy/{frontend/{app,admin},backend/{service1,service2},nginx/conf.d,logs/nginx}

# 2. 放入项目文件
cp -r /path/to/app/dist/* deploy/frontend/app/
cp -r /path/to/admin/dist/* deploy/frontend/admin/
cp /path/to/service1.jar deploy/backend/service1/
cp /path/to/service2.jar deploy/backend/service2/

# 3. 创建Nginx配置文件
# 将上述nginx配置写入对应文件

# 4. 启动服务
docker-compose up -d --build

# 5. 验证部署
curl -I http://localhost/app/index.html
docker-compose logs -f nginx

6. 关键配置说明

(1) 网络通信原理

app.domain.com/api
admin.domain.com/api
Nginx
service1:8080
service2:8081
  • 所有服务通过app-network通信
  • 容器间通过服务名自动解析(如service1:8080
  • 静态资源通过卷挂载实时更新
(2) 健康检查机制
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost/health"]
  interval: 30s
  timeout: 3s
  • 每30秒检查Nginx状态
  • 失败自动重启容器
  • 通过/health端点监控

7. 高级优化配置

HTTPS 配置示例

server {
    listen 443 ssl;
    server_name app.domain.com;
    
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # HSTS强制HTTPS
    add_header Strict-Transport-Security "max-age=31536000" always;
    
    # 其他配置保持不变...
}

安全增强配置

server {
    # 安全头部
    add_header Content-Security-Policy "default-src 'self'";
    add_header X-XSS-Protection "1; mode=block";
    
    # 禁用不安全方法
    if ($request_method !~ ^(GET|POST)$ ) {
        return 405;
    }
}

8. 常见问题解决

问题现象解决方案
静态资源加载404chmod -R 755 deploy/frontend 确保权限正确
API代理超时(504)检查proxy_connect_timeout配置,验证容器间网络:docker-compose exec nginx ping service1
SPA路由刷新404确认Nginx配置包含try_files $uri $uri/ /index.html
跨域问题(CORS)在代理配置中添加Access-Control-Allow-*头信息
端口冲突修改docker-compose.yml中的端口映射:"8080:80"

9. 方案优势

  1. 高效部署:静态资源实时挂载,无需重建容器
  2. 资源优化:使用轻量级Alpine镜像(23MB),内存限制控制
  3. 生产级特性
    • 健康检查自动恢复
    • 日志持久化
    • 安全头部防护
  4. 灵活扩展
    # 添加新前端
    mkdir deploy/frontend/new-app
    # 添加Nginx配置
    vi deploy/nginx/conf.d/new-app.conf
    # 重载服务
    docker-compose exec nginx nginx -s reload
    

10. 验证部署成功

# 1. 检查容器状态
docker-compose ps

# 2. 测试端点访问
curl -H "Host: app.domain.com" http://localhost/api/service1/health
curl -H "Host: admin.domain.com" http://localhost/api/service2/health

# 3. 检查日志
tail -f deploy/logs/nginx/access.log

这个部署只能使用自己电脑配置的域名访问才可以,
使用ip地址或者手机进行访问的时候会发现前端访问不到后端的服务,
但是却可以访问到前端页面和后端服务的OpenApi,
后面查了好久也没有找到是什么问题,就放弃了,要是有大佬知道的话,
还请指点一下ლ(́◉◞౪◟◉‵ლ)感谢


本部署文档和代码以上传gitee上:https://gitee.com/banhuayue/shangting-apartment.git
大家可以直接克隆。
本文档参考《尚硅谷-尚庭公寓》

### 关于硅谷 Java 项目——尚庭公寓 #### 项目背景与目标 尚庭公寓是一个基于 Java 技术栈开发的物业管理系统,旨在通过现代化的技术手段提升物业管理工作效率。该项目涵盖了从前端到后端的整体架构设计,适合初学者和中级开发者深入学习 Java Web 开发的核心技能[^1]。 --- #### 项目核心模块解析 以下是尚庭公寓项目的几个主要部分及其功能描述: ##### 1. **项目业务概述** - 尚庭公寓的主要业务场景包括租客管理、房屋租赁管理、费用结算以及管理员权限控制等。 - 这些功能的设计围绕实际生活中的物业管理需求展开,提供了完整的解决方案。 ##### 2. **移动端支持** - 提供轻量级的移动应用界面,方便住户随时查看账单、提交维修申请等功能。 - 使用 HTML5 和 Vue.js 构建响应式页面,确保跨平台兼容性。 ##### 3. **后台管理系统** - 后台采用 Spring Boot 框架构建,集成了 MyBatis-Plus 作为持久层框架。 - 实现了用户认证、角色授权、数据增删改查等一系列基础功能。 ##### 4. **核心业务流程** - 用户注册 -> 房屋信息录入 -> 租赁合同签订 -> 收费通知 -> 维修工单处理。 - 流程清晰明了,便于维护和扩展。 ##### 5. **技术选型** - 前端:Vue.js / Element UI - 后端:Spring Boot / MyBatis-Plus - 数据库:MySQL - 接口文档工具:Knife4j 这些技术的选择充分考虑了性能、易用性和可维护性。 --- #### 初始化准备工作详解 为了快速上手尚庭公寓项目,可以按照以下步骤完成环境搭建: ##### 1. **导入数据库** - 下载官方提供的 SQL 文件并执行脚本初始化表结构和测试数据。 ##### 2. **创建工程** - 使用 IntelliJ IDEA 或 Eclipse 新建 Maven 工程,并引入必要的依赖项。 ##### 3. **Spring Boot 初始配置** - 编辑 `pom.xml` 添加所需插件和支持版本号。 - 配置 `application.yml` 文件指定数据库连接参数和其他全局设置。 ##### 4. **MyBatis Plus 集成** - 修改 `pom.xml` 中加入 MyBatis-Plus 的相关依赖。 - 在 `application.yml` 设置扫描路径及分页插件选项。 ##### 5. **代码生成器** - 利用 MyBatis-Plus 自带的代码生成器自动生成实体类、Mapper 及 Service 层接口。 --- #### 登录功能实现案例分析 以教师登录为例,展示如何调用服务方法获取特定用户的详细信息: ```java @Override public Teacher getTeacherById(Long userId) { Teacher teacher = baseMapper.selectById(userId); return teacher; } ``` 上述逻辑展示了通过 ID 查询对应记录的过程,其中 `baseMapper` 是由 MyBatis 自动生成的基础 Mapper 对象[^2]。 --- #### GitHub 存储库地址 如果希望进一步研究源码或者参与贡献,可以通过以下链接访问公开仓库: [GitHub 地址](https://github.com/sungongtai/lease)[^3] 此存储库包含了完整的项目文件夹结构、README 文档以及其他辅助资源,非常适合自学或团队协作实践[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值