当前位置: 首页 > article >正文

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

文章目录

    • 整合版部署文档
    • 部署架构图
    • 1. 项目目录结构
    • 增加注释的 Dockerfile 配置
      • (1) 后端服务1 Dockerfile (`backend/service1/Dockerfile`)
      • (2) 后端服务2 Dockerfile (`backend/service2/Dockerfile`)
    • Dockerfile 配置说明
    • 重要注意事项
    • 3. Nginx 配置
      • (1) 主配置文件 (`nginx/nginx.conf`)
      • (2) 前端路由配置 (`nginx/conf.d/app.conf`)
      • (3) 管理后台配置 (`nginx/conf.d/admin.conf`)
    • 4. Docker Compose 配置
    • 5. 部署操作流程
    • 6. 关键配置说明
      • (1) 网络通信原理
        • (2) 健康检查机制
    • 7. 高级优化配置
      • HTTPS 配置示例
      • 安全增强配置
    • 8. 常见问题解决
    • 9. 方案优势
    • 10. 验证部署成功


整合版部署文档


部署架构图

用户访问
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";}# 代理后端服务1location /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";}# 代理后端服务2location /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:alpineports:- "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/nginxnetworks:- app-networkrestart: unless-stoppedhealthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 3s# 后端服务1service1:build:context: ./backend/service1environment:- SPRING_PROFILES_ACTIVE=prod- TZ=Asia/Shanghainetworks:- app-networkrestart: unless-stoppeddeploy:resources:limits:memory: 512M# 后端服务2service2:build:context: ./backend/service2environment:- SPRING_PROFILES_ACTIVE=prod- TZ=Asia/Shanghainetworks:- app-networkrestart: unless-stoppeddeploy:resources:limits:memory: 512M# 自定义网络
networks:app-network:driver: bridgeipam: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: 30stimeout: 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强制HTTPSadd_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
大家可以直接克隆。
本文档参考《尚硅谷-尚庭公寓》

相关文章:

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

文章目录 整合版部署文档部署架构图1. 项目目录结构增加注释的 Dockerfile 配置(1) 后端服务1 Dockerfile (backend/service1/Dockerfile)(2) 后端服务2 Dockerfile (backend/service2/Dockerfile) Dockerfile 配置说明重要注意事项3. Nginx 配置(1) 主配置文件 (nginx/nginx.c…...

使用函数证明给定的三个数是否能构成三角形

问题描述 给定三条边&#xff0c;请你判断一下能不能组成一个三角形。 输入数据第一行包含一个数M&#xff0c;接下有M行&#xff0c;每行一个实例&#xff0c;包含三个正数A,B,C。其中A,B,C <1000; 对于每个测试实例&#xff0c;如果三条边长A,B,C能组成三角形的话&#x…...

【数据结构】——二叉树堆(下)

一、堆中两个重要的算法 我们前面学习了树的概念和结构&#xff0c;还要树的一种特殊树--二叉树&#xff0c;然后我们学习了堆&#xff0c;知道了堆分为大堆和小堆&#xff0c;接下来我们就使用堆来进行一个排序。 在学习我们的堆排序前&#xff0c;我们先详细学习一下我们堆…...

t009-线上代驾管理系统

项目演示地址 摘 要 使用旧方法对线上代驾管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在线上代驾管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…...

目标检测预测框置信度(Confidence Score)计算方式

预测框的置信度&#xff08;Confidence Score&#xff09;是目标检测模型输出的一个关键部分&#xff0c;它衡量了模型对一个预测框中包含特定类别对象的确定程度。 不同的目标检测模型&#xff08;如Faster R-CNN、SSD、YOLO、DETR等&#xff09;在计算置信度时有其特有的机制…...

【题解-洛谷】B4295 [蓝桥杯青少年组国赛 2022] 报数游戏

题目&#xff1a;B4295 [蓝桥杯青少年组国赛 2022] 报数游戏 题目描述 某班级男生人数为 X X X 人&#xff0c;女生人数为 Y Y Y 人&#xff0c;现全班同学围成一个圆圈&#xff0c;并按照顺时针方向为每名同学编号&#xff08;从 1 1 1 到 X Y XY XY&#xff09;。现给…...

Bootstrap项目 - 个人作品与成就展示网站

文章目录 前言一、项目整体概述1. 项目功能介绍1.1 导航栏1.2 首页模块1.3 关于我模块1.4 技能模块1.5 作品模块1.6 成就模块1.7 博客模块1.8 联系我模块 2. 技术选型说明 二、项目成果展示1. PC端展示1.1 首页1.2 关于我1.3 技能1.4 作品1.5 成就1.6 博客1.7 联系我 2. 移动端…...

新能源汽车霍尔线束介绍

新能源汽车作为传统燃油车的重要替代方案&#xff0c;其核心驱动系统依赖于高效、精准的电子控制技术。在这一体系中&#xff0c;霍尔线束作为关键传感器组件&#xff0c;承担着电机转速、位置信号的实时采集与传输任务&#xff0c;其性能直接影响整车动力输出的稳定性和能量利…...

2023网络应用专业-Python程序设计复习题目

2023技校网络应用专业-Python程序设计复习题目 须知: 个人信息要填写正确,在线答题时间不限,可以反复作答,次数不限,最后取最高分。 第一部分:单选题 1. 在Python交互模式下&#xff0c;输入下面代码: >>> “{0:.2f}”.format(12345.6789) 回车后显示的结果为: [单选…...

Termux可用中间人网络测试工具Xerosploit

Termux可用中间人网络测试工具Xerosploit。 Xerosploit 是一款基于 MITM 的本地网络渗透测试工具包。 食用方法&#xff1a; git clone https://github.com/LionSec/xerosploit cd xerosploit sudo python3 install.py 运行&#xff1a; sudo xerosploit 使用备注&#xff1…...

气镇阀是什么?

01、阀门介绍&#xff1a; 油封机械真空泵的压缩室上开一小孔&#xff0c;并装上调节阀&#xff0c;当打开阀并调节入气量&#xff0c;转子转到某一位置&#xff0c;空气就通过此孔掺入压缩室以降低压缩比&#xff0c;从而使大部分蒸汽不致凝结而和掺入的气体一起被排除泵外起此…...

SmolVLM2: The Smollest Video Model Ever(七)

编写测试代码与评价指标 现在的数据集里面只涉及tool的分类和手术phase的分类&#xff0c;所以编写的评价指标还是那些通用的&#xff0c;但是&#xff1a; predicted_labels:[The current surgical phase is CalotTriangleDissection, Grasper, Hook tool exists., The curre…...

RFID综合项目实训 | 基于C#的一卡通管理系统

目录 基于C#的一卡通管理系统 【实验目的】 【实验设备】 【实验内容】 【实验步骤】 实验准备 第一部分 界面布局设计 ​第二部分 添加串口通讯函数及高频标签操作功能函数(部分代码&#xff09; 第五部分 实验运行效果 基于C#的一卡通管理系统 【实验目的】 熟悉 …...

mysql如何设置update时间字段自动更新?

之前在给网站做表设计的时候时间字段都是用的datetime类型&#xff0c;初始值都是设置的CURRENT_TIMESTAMP。 由于给文章表设计的有创建时间和更新时间两个字段&#xff0c;但是更新时间字段需要在更新文章后再次更新&#xff0c;当时由于不了解mysql还可以设置自动更新时间戳…...

数据库备份与恢复专业指南

数据库备份与恢复专业指南 一、备份与恢复核心概念 关键结论:数据库备份是数据安全的最后防线,恢复能力才是真正的备份有效性检验标准。 AI大模型专栏:https://duoke360.com/tutorial/path/ai-lm 1.1 备份类型 物理备份:直接复制数据库文件(如MySQL的.ibd文件、Oracle的.d…...

【第4章 图像与视频】4.5 操作图像的像素

文章目录 前言示例-获取和修改图像数据图像数据的遍历方式图像滤镜负片滤镜黑白滤镜浮雕滤镜filter滤镜属性 前言 getImageData() 与 putImageData() 这两个方法分别用来获取图像的像素信息&#xff0c;以及向图像中插入像素。与此同时&#xff0c;如果有需要&#xff0c;也可…...

Science Advances 上海理工大学与美国杜克大学(Duke University)共同开发了一种仿生复眼相机

编辑丨%科学家开发了一种 AI 辅助的仿生复眼相机。炎炎夏日&#xff0c;相信各位读者都有被蚊子骚扰过的恼火记忆。但往往想要清剿蚊子的时候&#xff0c;却被它灵巧地躲开&#xff0c;再难找到。诸如蚊子这种节肢动物的视觉系统已经进化了 5 亿多年&#xff0c;从寒武纪一直到…...

正点原子Z20 ZYNQ ​​​开发板​​发布!板载FMC LPC、LVDS LCD和WIFI蓝牙等接口,资料丰富!

正点原子Z20 ZYNQ ​​​开发板​​发布&#xff01;板载FMC LPC、LVDS LCD和WIFI&蓝牙等接口&#xff0c;资料丰富&#xff01; 正点原子新品Z20 ZYNQ开发板来啦&#xff01;核心板全工业级设计&#xff0c;主控芯片型号是XC7Z020CLG484-2I。开发板由核心板底板组成&…...

软件测评中心如何确保软件品质?需求分析与测试计划很关键

软件测评中心承担着对软件进行评估、测试和审查的任务&#xff0c;它有一套规范的流程来确保软件的品质&#xff0c;并且能够向客户和开发者提供详实的软件状况分析报告。 需求分析环节 这一环节至关重要&#xff0c;必须与客户和开发团队保持密切交流。我们需要从他们那里精…...

004 flutter基础 初始文件讲解(3)

之前&#xff0c;我们正向的学习了一些flutter的基础&#xff0c;如MaterialApp&#xff0c;Scaffold之类的东西&#xff0c;那么接下来&#xff0c;我们将正式接触原代码&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyAp…...

2025LitCTF 复现

easy_file 登录界面 尝试admin 和密码1 没成功 结果尝试了弱口令 admin 用户和 password 密码就登录成功了 文件上传 新建一个空的 新建木马.txt 文件发现上传成功 然后写入一句话木马 <?php eval($_POST[a]); ?> 上传失败 说明可能是有字符被过滤了&#xff0c;猜…...

英语中最难学的部分是时态‌

英语中最难学的部分是时态‌。英语的时态体系包含16种时态&#xff0c;每种时态都有其独特的用法和规则&#xff0c;这使得时态成为英语学习中的一个难点‌ 。 时态的定义和分类 时态可以分为时间和体态两个维度&#xff1a; ‌时间‌&#xff1a;现在时、过去时、将来时、过…...

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析 自动驾驶技术从来都不是“单兵作战”。如果你细看一辆自动驾驶汽车,它其实是一个传感器的集合体:摄像头、激光雷达(LiDAR)、毫米波雷达、超声波传感器、GPS……这些传感器各自发挥作…...

使用C# 快速删除Excel表格中的重复行数据-详解

目录 简介 使用工具 C# 删除Excel工作表中的重复行 C# 删除指定Excel单元格区域中的重复行 C# 基于特定列删除重复行 RemoveDuplicates 方法快速比较 简介 重复行是指在Excel表格中完全相同的多行数据。这些冗余行的存在可能源于多种原因&#xff0c;例如&#xff1a; …...

WPF-Prism学习笔记之 “导航功能和依赖注入“

新建空白模板(Prism) 新建好后会有自动创建ViewModels和Views 在"MainWindow.xaml"文件里面标题去绑定了一个属性"Title"&#xff0c;而"MainWindowViewModel.cs"里面继承一个非常重要的"BindbleBase"(prism框架里面非常重要的)。所以…...

中国城市间地理距离矩阵(2024)

1825 中国城市间地理距离矩阵(2024) 数据简介 中国城市间地理距离矩阵数据集&#xff0c;通过审图号GS(2024)0650的中国城市地图在Albers投影坐标系中进行计算得出矩阵表格&#xff0c;单位为KM&#xff0c;方便大家研究使用。 中国城市地理距离矩阵数据通过计算城市中心距离…...

【孙悟空喝水】2022-2-7

缘由C编程问题求解:9634: 孙悟空喝水-编程语言-CSDN问答 void 孙悟空喝水() {//缘由https://ask.csdn.net/questions/7639865?spm1005.2025.3001.5141int x 2&#xff0c; n 0; double s 0, ss 0;std::cin >> n;while ((int)s < n)s 1.0 / x, ss (x - 1.0) / …...

`sysctl`命令深度剖析:如何优化内核参数以提升服务器网络/IO性能?

更多服务器知识&#xff0c;尽在hostol.com 嘿&#xff0c;各位Linux服务器的“老司机”和“赛车手”们&#xff01;咱们把服务器比作一辆高性能跑车&#xff0c;日常跑起来是很快&#xff0c;但你有没有想过&#xff0c;这辆“跑车”出厂时的默认设置&#xff0c;可能只是为了…...

AxumStatusCode细化Rust Web标准格式响应

1. Axum 中的 StatusCode 概述 axum::http::StatusCode 提供了 HTTP 状态码的枚举&#xff0c;涵盖了从 100 到 599 的所有标准状态码。 通过使用这些状态码&#xff0c;您可以精确地控制 HTTP 响应的语义&#xff0c;例如成功、客户端错误、服务器错误等。 1.1 常用状态码 …...

【备战秋招】C++音视频开发经典面试题整理

1、简要介绍一下对 H.264 的了解&#xff1f; 1&#xff09;基础描述 H.264 是由国际标准组织机构&#xff08;ISO&#xff09;下属的运动图象专家组&#xff08;MPEG&#xff09;和国际电传视讯联盟远程通信标准化组织&#xff08;ITU-T&#xff09;开发的系列编码标准之一。…...