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

文章目錄

    • 整合版部署文檔
    • 部署架構圖
    • 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
大家可以直接克隆。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85043.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio 介紹

如何關閉或徹底刪除一個工程 基于Android Studio的android入門——如何關閉或徹底刪除一個工程 搜索內容 Android Studio高效指南:快速查找技巧大揭秘 build命令:gradle app:assembleDebug 命令解析 1. 命令結構與作用 核心功能:該命令…

JAVA與C語言之間的差異(一)

一、代碼習慣以及主函數 JAVA中{在使用的時候不要換行 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");}} 其次&#xff0c;以main函數為主函數&#xff1a; public …

華為OD機試真題——開放日活動/取出盡量少的球(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《開放…

我的3種AI寫作節奏搭配模型,適合不同類型寫作者

—不用內耗地高效寫完一篇內容&#xff0c;原來可以這樣搭配AI ?? 開場&#xff1a;為什么要“搭配節奏”寫作&#xff1f; 很多人以為用AI寫作&#xff0c;就是丟一句提示詞&#xff0c;然后“等它寫完”。 但你有沒有遇到這些情況&#xff1a; AI寫得很快&#xff0c;學境…

【知識點】第1章:程序設計基本方法

文章目錄 知識點整理計算機的概念程序設計語言Python 語言概述Python 語言開發環境配置程序的基本編寫方法 練習題簡答題判斷題 知識點整理 計算機的概念 計算機的定義&#xff1a;計算機是根據指令操作數據的設備。 計算機的兩個基本特性&#xff1a; 功能性&#xff1a;計…

const ‘不可變’到底是值不變還是地址不變

const的基礎規則 聲明時必須初始化? const a; // ? 報錯&#xff1a;Missing initializer in const declaration const b 10; // ? 正確塊級作用域?&#xff08;const 的作用域僅限于聲明它的代碼塊&#xff09; if (true) {const x 100; } console.log(x); // ? 報錯…

Netty 實戰篇:為自研 RPC 框架加入異步調用與 Future 支持

我們在上篇實現了一個輕量級 RPC 框架&#xff0c;現在要進一步優化 —— 加入異步響應支持&#xff0c;讓 RPC 通信變得真正高效、非阻塞、支持并發。 一、為什么需要異步調用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次發送請求后&#xff0c;必須等待服…

for(auto a:b)和for(auto a:b)的區別

#include<iostream> using namespace std; int main() {string s( "hello world" );for (auto c:s)c t ;cout<<s<<endl; //結果為hello worldfor (auto &c:s)c t ;cout<<s<<endl; //結果為ttttttttttt }for(auto a:b)中b為一…

超級對話2:大跨界且大綜合的學問融智學應用場景述評(不同第三方的回應)之二

摘要&#xff1a;《人機協同文明升維行動框架》提出以HIAICI/W公式推動認知革命&#xff0c;構建三大落地場景&#xff1a;1&#xff09;低成本認知增強神經接口實現300%學習效率提升&#xff1b;2&#xff09;全球學科活動化閃電戰快速轉化知識體系&#xff1b;3&#xff09;人…

多方法解決MNIST數字識別

全連接層 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.optim as optim from tqdm import tqdm # 用于進度條顯示 import os# 定義數據預處理(標準化+Tensor轉換) transform = transforms.Compose([transforms.ToTensor…

安裝 Node.js 和配置 cnpm 鏡像源

一、安裝 Node.js 方式一&#xff1a;官網下載&#xff08;適合所有系統&#xff09; 訪問 Node.js 官網 推薦選擇 LTS&#xff08;長期支持&#xff09;版本&#xff0c;點擊下載安裝包。 根據系統提示一步步完成安裝。 方式二&#xff1a;通過包管理器安裝&#xff08;建…

vue 自定義組件的事件綁定

基本知識點 &#x1f3af;什么是自定義事件 自定義事件是子組件向父組件發送消息的機制&#xff0c;通常用于通知父組件發生了某些行為或狀態變化。 &#x1f4cc; 基本語法 子組件觸發事件&#xff08;$emit&#xff09; this.$emit(事件名, 參數);或在 const emit de…

進程同步機制-信號量機制-記錄型信號量機制中的的wait和signal操作

wait和signal是記錄型信號量機制中用于實現進程同步與互斥的兩個重要操作&#xff0c; wait 操作 wait(semaphores *S) {S->value --;if (S->value<0) block(S->list) }請求資源&#xff1a;S->value --; 這一步表示進程請求一個單位的資源&#xff0c;將信號…

sd webui 安裝sd-webui-TemporalKit 加載報錯解決辦法

ModuleNotFoundError: No module named moviepy.editer 報錯內容類似上面截圖&#xff0c;我的已經解決&#xff0c;暫時無法截圖了 處理方法&#xff1a; 重點說明&#xff1a;插件目錄必須是TemporalKit&#xff0c;不能更改 進入到安裝目錄&#xff1a;extensions\Tempor…

decimal.js庫處理js浮點數精度誤差問題

1、經常遇到前端計算金額的時候出現精度誤差問題&#xff0c;導致前后端計算的金額不一致導致校驗過不去的情況&#xff0c;相信有不少人寫過Math.floor(e*100)/100來實現保留2位小數&#xff0c;但是這么寫就會出現上面的精度問題。怎么解決呢&#xff1f;這里使用的是decimal…

如何將 WSL 的 Ubuntu-24.04 遷移到其他電腦

在使用 Windows Subsystem for Linux (WSL) 時&#xff0c;我們可能會遇到需要將現有的 WSL 環境遷移到其他電腦的情況。無論是為了備份、更換設備&#xff0c;還是在不同電腦之間共享開發環境&#xff0c;掌握遷移 WSL 子系統的方法都是非常有用的。本文將以 Ubuntu-24.04 為例…

RISCV——內核及匯編

RISCV——內核及匯編 小狼http://blog.csdn.net/xiaolangyangyang 1、寄存器組&#xff08;ABI&#xff09; 2、異常及中斷 XV6 trap&#xff08;二&#xff09;RISCV中斷異常處理/定時器中斷 mie&#xff1a;中斷開關mip&#xff1a;中斷狀態mstatus.mie&#xff1a;全局中斷…

算法日記32:埃式篩、gcd和lcm、快速冪、乘法逆元

一、埃式篩&#xff08;計算質數&#xff09; 1.1、概念 1.1.1、在傳統的計算質數中&#xff0c;我們采用單點判斷&#xff0c;即判斷(2~sqrt(n))是否存在不合法元素&#xff0c;若存在則判否&#xff0c;否則判是 1.1.2、假設&#xff0c;此時我們需要求1~1000的所有質數&am…

使用 mysqldump 獲取 MySQL 表的完整創建 DDL

要獲取 MySQL 中某個表的完整創建 DDL&#xff08;僅結構&#xff0c;不含數據&#xff09;&#xff0c;可以使用 mysqldump 工具的以下命令&#xff1a; 基本命令格式 bash mysqldump -h [主機名] -u [用戶名] -p --no-data --single-transaction --routines --triggers --…

Debian 系統 Python 開發全解析:從環境搭建到項目實戰

Debian 系統 Python 開發全解析:從環境搭建到項目實戰 在當今數字化時代,Python 憑借其簡潔易讀的語法和強大的功能,成為了最受歡迎的編程語言之一。Debian 作為一款穩定、安全且開源的 Linux 操作系統,為 Python 開發提供了理想的環境。本文將詳細介紹在 Debian 系統上進…