Skip to content

项目部署文档

本文档介绍点狮微服务版本的生产环境部署流程,包括前端、后端的部署方式,以及Nginx配置、Docker部署等内容。

目录

环境要求

生产环境服务器配置建议

配置项最低要求推荐配置
CPU4核8核+
内存8GB16GB+
硬盘100GB SSD200GB+ SSD
操作系统CentOS 7+ / Ubuntu 18.04+CentOS 8+ / Ubuntu 20.04+

软件环境

软件版本要求说明
JDK17+后端运行环境
MySQL8.0+数据库
Redis6.0+缓存
Nacos2.x注册中心/配置中心
Nginx1.18+反向代理
Node.js16+前端构建(构建时需要)
Docker20.10+容器化部署(可选)

后端部署

方式一:传统JAR包部署

1.1 修改配置文件

编辑各模块的 application-prod.yaml 配置文件:

yaml
spring:
  # 数据库配置
  datasource:
    url: jdbc:mysql://your-mysql-host:3306/pointlion?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: your_db_user
    password: your_db_password
    driver-class-name: com.mysql.cj.jdbc.Driver

  # Redis 配置
  redis:
    host: your-redis-host
    port: 6379
    password: your_redis_password
    database: 0

# Nacos 配置
cloud:
  nacos:
    discovery:
      server-addr: your-nacos-host:8848
      namespace: prod
      group: DEFAULT_GROUP
    config:
      server-addr: your-nacos-host:8848
      file-extension: yaml
      namespace: prod

1.2 编译打包

在开发机器或构建服务器上执行打包:

bash
# 进入项目根目录
cd pointlion-cloud

# 清理并打包(跳过测试)
mvn clean package -DskipTests -Pprod

# 打包完成后,在各模块的 target 目录下生成 jar 包
# 例如:pointlion-cloud-gateway/target/pointlion-cloud-gateway.jar

1.3 上传部署包

将打包好的jar包上传到服务器指定目录,例如:

bash
# 创建部署目录
mkdir -p /opt/pointlion/apps
mkdir -p /opt/pointlion/logs

# 上传jar包到服务器
scp pointlion-cloud-gateway/target/pointlion-cloud-gateway.jar user@server:/opt/pointlion/apps/
scp pointlion-cloud-bd/target/pointlion-cloud-bd.jar user@server:/opt/pointlion/apps/
# ... 其他模块

1.4 编写启动脚本

创建服务启动脚本 /opt/pointlion/start.sh

bash
#!/bin/bash

# 点狮微服务启动脚本

# Java 环境
export JAVA_HOME=/usr/local/java/jdk-17
export PATH=$JAVA_HOME/bin:$PATH

# 应用目录
APP_HOME=/opt/pointlion/apps
LOG_HOME=/opt/pointlion/logs

# JVM 参数
JVM_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
JVM_OPTS="$JVM_OPTS -Dfile.encoding=UTF-8"
JVM_OPTS="$JVM_OPTS -Dlogging.file.path=$LOG_HOME"

# 启动函数
start_service() {
    local app_name=$1
    local jar_name=$2

    echo "正在启动 $app_name ..."

    nohup java $JVM_OPTS -jar $APP_HOME/$jar_name \
        --spring.profiles.active=prod \
        > $LOG_HOME/$app_name.out 2>&1 &

    echo "$app_name 启动完成"
}

# 启动顺序(按依赖关系)
start_service "nacos" "pointlion-cloud-nacos.jar"
sleep 10  # 等待Nacos启动

start_service "pointlion-cloud-bd" "pointlion-cloud-bd.jar"
sleep 5

start_service "pointlion-cloud-infra" "pointlion-cloud-infra.jar"
sleep 5

start_service "pointlion-cloud-gateway" "pointlion-cloud-gateway.jar"
sleep 5

start_service "pointlion-cloud-oa" "pointlion-cloud-oa.jar"
start_service "pointlion-cloud-hrm" "pointlion-cloud-hrm.jar"
start_service "pointlion-cloud-crm" "pointlion-cloud-crm.jar"

echo "所有服务启动完成!"

1.5 编写停止脚本

创建服务停止脚本 /opt/pointlion/stop.sh

bash
#!/bin/bash

# 点狮微服务停止脚本

echo "正在停止点狮微服务..."

# 查找并停止所有Java服务
ps aux | grep "pointlion-cloud" | grep java | awk '{print $2}' | while read pid
do
    echo "正在停止进程: $pid"
    kill -15 $pid
done

# 等待进程完全停止
sleep 5

# 检查是否还有残留进程
REMAINING=$(ps aux | grep "pointlion-cloud" | grep java | wc -l)
if [ $REMAINING -gt 0 ]; then
    echo "强制停止残留进程..."
    ps aux | grep "pointlion-cloud" | grep java | awk '{print $2}' | xargs -I {} kill -9 {}
fi

echo "所有服务已停止"

1.6 配置系统服务(可选)

创建systemd服务文件 /etc/systemd/system/pointlion-gateway.service

ini
[Unit]
Description=PointLion Cloud Gateway Service
After=network.target

[Service]
Type=simple
User=pointlion
Group=pointlion
WorkingDirectory=/opt/pointlion/apps
Environment="JAVA_HOME=/usr/local/java/jdk-17"
Environment="LOG_HOME=/opt/pointlion/logs"
ExecStart=/usr/local/java/jdk-17/bin/java -jar /opt/pointlion/apps/pointlion-cloud-gateway.jar --spring.profiles.active=prod
ExecStop=/bin/kill -15 $MAINPID
Restart=on-failure
RestartSec=10s
StandardOutput=append:/opt/pointlion/logs/gateway.log
StandardError=append:/opt/pointlion/logs/gateway-error.log

[Install]
WantedBy=multi-user.target

启用服务:

bash
# 重新加载systemd配置
systemctl daemon-reload

# 启动服务
systemctl start pointlion-gateway

# 开机自启
systemctl enable pointlion-gateway

# 查看状态
systemctl status pointlion-gateway

方式二:Docker部署(推荐)

2.1 后端Dockerfile

创建 Dockerfile

dockerfile
# 多阶段构建 - 构建阶段
FROM maven:3.8-openjdk-17 AS builder

WORKDIR /build

# 复制pom文件并下载依赖
COPY pom.xml .
RUN mvn dependency:go-offline -B

# 复制源代码并打包
COPY src ./src
RUN mvn clean package -DskipTests -Pprod

# 运行阶段
FROM openjdk:17-jdk-slim

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' > /etc/timezone

# 创建应用目录
WORKDIR /app

# 从构建阶段复制jar包
COPY --from=builder /build/target/*.jar app.jar

# 创建日志目录
RUN mkdir -p /app/logs

# 暴露端口
EXPOSE 48080

# JVM参数
ENV JAVA_OPTS="-Xms512m -Xmx1024m"

# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar"]

2.2 构建镜像

bash
# 构建镜像
docker build -t pointlion-cloud-gateway:1.0.0 .

# 查看镜像
docker images | grep pointlion

2.3 Docker Compose编排

创建 docker-compose.yml

yaml
version: '3.8'

services:
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: pointlion-mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: pointlion
      TZ: Asia/Shanghai
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    networks:
      - pointlion-network
    restart: unless-stopped

  # Redis缓存
  redis:
    image: redis:6.2-alpine
    container_name: pointlion-redis
    command: redis-server --requirepass your_redis_password
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - pointlion-network
    restart: unless-stopped

  # Nacos注册中心
  nacos:
    image: nacos/nacos-server:v2.2.0
    container_name: pointlion-nacos
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql
      MYSQL_SERVICE_DB_NAME: nacos_config
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: your_root_password
      TZ: Asia/Shanghai
    ports:
      - "8848:8848"
      - "9848:9848"
    networks:
      - pointlion-network
    depends_on:
      - mysql
    restart: unless-stopped

  # 网关服务
  gateway:
    image: pointlion-cloud-gateway:1.0.0
    container_name: pointlion-gateway
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
      SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/pointlion?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: your_root_password
      SPRING_REDIS_HOST: redis
      SPRING_REDIS_PORT: 6379
      SPRING_REDIS_PASSWORD: your_redis_password
    ports:
      - "48080:48080"
    networks:
      - pointlion-network
    depends_on:
      - mysql
      - redis
      - nacos
    restart: unless-stopped

  # 基础数据服务
  bd:
    image: pointlion-cloud-bd:1.0.0
    container_name: pointlion-bd
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/pointlion?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: your_root_password
    networks:
      - pointlion-network
    depends_on:
      - mysql
      - nacos
    restart: unless-stopped

  # 基础设施服务
  infra:
    image: pointlion-cloud-infra:1.0.0
    container_name: pointlion-infra
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/pointlion?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: your_root_password
    networks:
      - pointlion-network
    depends_on:
      - mysql
      - nacos
    restart: unless-stopped

  # OA业务服务
  oa:
    image: pointlion-cloud-oa:1.0.0
    container_name: pointlion-oa
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/pointlion?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: your_root_password
    networks:
      - pointlion-network
    depends_on:
      - mysql
      - nacos
      - bd
    restart: unless-stopped

networks:
  pointlion-network:
    driver: bridge

volumes:
  mysql-data:
  redis-data:

2.4 一键部署脚本

创建 deploy.sh 部署脚本:

bash
#!/bin/bash

# 点狮微服务Docker部署脚本

set -e  # 遇到错误立即退出

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查Docker是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装,请先安装 Docker"
        exit 1
    fi
    log_info "Docker 版本: $(docker --version)"
}

# 检查Docker Compose是否安装
check_docker_compose() {
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose 未安装,请先安装 Docker Compose"
        exit 1
    fi
    log_info "Docker Compose 版本: $(docker-compose --version)"
}

# 构建镜像
build_images() {
    log_info "开始构建 Docker 镜像..."

    # 构建网关镜像
    log_info "构建网关镜像..."
    cd pointlion-cloud-gateway
    docker build -t pointlion-cloud-gateway:1.0.0 .
    cd ..

    # 构建基础数据镜像
    log_info "构建基础数据镜像..."
    cd pointlion-cloud-bd
    docker build -t pointlion-cloud-bd:1.0.0 .
    cd ..

    # 构建基础设施镜像
    log_info "构建基础设施镜像..."
    cd pointlion-cloud-infra
    docker build -t pointlion-cloud-infra:1.0.0 .
    cd ..

    # 构建OA服务镜像
    log_info "构建OA服务镜像..."
    cd pointlion-cloud-oa
    docker build -t pointlion-cloud-oa:1.0.0 .
    cd ..

    log_info "所有镜像构建完成"
}

# 启动服务
start_services() {
    log_info "启动 Docker Compose 服务..."
    docker-compose up -d
    log_info "服务启动完成"
}

# 停止服务
stop_services() {
    log_info "停止 Docker Compose 服务..."
    docker-compose down
    log_info "服务已停止"
}

# 查看服务状态
status_services() {
    log_info "查看服务状态..."
    docker-compose ps
}

# 查看日志
view_logs() {
    local service=$1
    if [ -z "$service" ]; then
        docker-compose logs -f
    else
        docker-compose logs -f "$service"
    fi
}

# 主函数
main() {
    case "$1" in
        build)
            check_docker
            build_images
            ;;
        start)
            check_docker
            check_docker_compose
            start_services
            ;;
        stop)
            check_docker
            check_docker_compose
            stop_services
            ;;
        restart)
            check_docker
            check_docker_compose
            stop_services
            sleep 3
            start_services
            ;;
        status)
            check_docker
            check_docker_compose
            status_services
            ;;
        logs)
            check_docker
            check_docker_compose
            view_logs "$2"
            ;;
        deploy)
            check_docker
            check_docker_compose
            build_images
            start_services
            ;;
        *)
            echo "用法: $0 {build|start|stop|restart|status|logs|deploy}"
            echo ""
            echo "命令说明:"
            echo "  build    - 构建 Docker 镜像"
            echo "  start    - 启动服务"
            echo "  stop     - 停止服务"
            echo "  restart  - 重启服务"
            echo "  status   - 查看服务状态"
            echo "  logs     - 查看日志 (可选参数: 服务名)"
            echo "  deploy   - 构建并启动服务"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

使用方式:

bash
# 赋予执行权限
chmod +x deploy.sh

# 构建镜像
./deploy.sh build

# 启动服务
./deploy.sh start

# 查看状态
./deploy.sh status

# 查看日志
./deploy.sh logs gateway

# 停止服务
./deploy.sh stop

# 一键部署(构建+启动)
./deploy.sh deploy

前端部署

3.1 修改环境配置

编辑 .env.production 文件:

bash
# 页面标题
VITE_APP_TITLE=点狮管理系统

# 生产环境API地址(通过Nginx代理,使用相对路径)
VITE_BASE_API=/admin-api

# WebSocket地址
VITE_WEBSOCKET_URL=ws://your-domain.com/im/ws

3.2 安装依赖并构建

bash
# 进入前端项目目录
cd pointlion-cloud-ui

# 安装依赖
pnpm install

# 构建生产版本
pnpm build

构建完成后,会在 dist 目录下生成静态文件。

3.3 部署静态文件

bash
# 创建部署目录
mkdir -p /usr/share/nginx/html/pointlion

# 复制构建产物
cp -r dist/* /usr/share/nginx/html/pointlion/

# 设置权限
chown -R nginx:nginx /usr/share/nginx/html/pointlion
chmod -R 755 /usr/share/nginx/html/pointlion

3.4 前端Dockerfile(可选)

dockerfile
# 构建阶段
FROM node:16-alpine AS builder

WORKDIR /build

# 安装pnpm
RUN npm install -g pnpm

# 复制依赖文件
COPY package.json pnpm-lock.yaml ./

# 安装依赖
RUN pnpm install --frozen-lockfile

# 复制源代码并构建
COPY . .
RUN pnpm build

# 运行阶段
FROM nginx:alpine

# 复制构建产物到Nginx目录
COPY --from=builder /build/dist /usr/share/nginx/html

# 复制Nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 暴露端口
EXPOSE 80

# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]

Nginx配置

4.1 HTTP配置

创建配置文件 /etc/nginx/conf.d/pointlion-http.conf

nginx
# 点狮管理系统 - HTTP配置
server {
    listen       80;
    server_name  your-domain.com;

    # 字符集
    charset utf-8;

    # 日志配置
    access_log  /var/log/nginx/pointlion-access.log  main;
    error_log   /var/log/nginx/pointlion-error.log   warn;

    # 前端静态文件
    location / {
        root   /usr/share/nginx/html/pointlion;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;

        # 缓存配置
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        root   /usr/share/nginx/html/pointlion;
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # 管理后台API代理
    location /admin-api/ {
        proxy_pass http://127.0.0.1:48080/admin-api/;

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 缓冲配置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;
    }

    # 用户App API代理
    location /app-api/ {
        proxy_pass http://127.0.0.1:48080/app-api/;

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }

    # WebSocket 配置 - IM 即时通讯
    location /im/ws {
        proxy_pass http://127.0.0.1:48080/im/ws;

        # WebSocket 必需配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 禁用缓冲
        proxy_buffering off;
    }

    # 文件上传大小限制
    client_max_body_size 100m;
    client_body_buffer_size 10m;
}

4.2 HTTPS配置

创建配置文件 /etc/nginx/conf.d/pointlion-https.conf

nginx
# 点狮管理系统 - HTTPS配置
server {
    listen       443 ssl http2;
    server_name  your-domain.com;

    # 字符集
    charset utf-8;

    # SSL证书配置
    ssl_certificate      /etc/nginx/conf.d/ssl/your-domain.crt;
    ssl_certificate_key  /etc/nginx/conf.d/ssl/your-domain.key;

    # SSL会话缓存
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

    # SSL协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    # HSTS (可选)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # 日志配置
    access_log  /var/log/nginx/pointlion-ssl-access.log  main;
    error_log   /var/log/nginx/pointlion-ssl-error.log   warn;

    # 前端静态文件
    location / {
        root   /usr/share/nginx/html/pointlion;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;

        # 缓存配置
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        root   /usr/share/nginx/html/pointlion;
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # 管理后台API
    location /admin-api/ {
        proxy_pass http://127.0.0.1:48080/admin-api/;

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 缓冲配置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;
    }

    # 用户App API
    location /app-api/ {
        proxy_pass http://127.0.0.1:48080/app-api/;

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }

    # WebSocket 配置 - IM 即时通讯
    location /im/ws {
        proxy_pass http://127.0.0.1:48080/im/ws;

        # WebSocket 必需配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 请求头设置
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket 超时配置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 禁用缓冲
        proxy_buffering off;
    }

    # 文件上传大小限制
    client_max_body_size 100m;
    client_body_buffer_size 10m;
}

# HTTP自动跳转HTTPS
server {
    listen       80;
    server_name  your-domain.com;
    return 301 https://$server_name$request_uri;
}

4.3 配置生效

bash
# 检查Nginx配置语法
nginx -t

# 重载Nginx配置
nginx -s reload

# 或使用systemctl
systemctl reload nginx

常见问题

Q1: 后端服务启动失败,提示端口被占用?

A: 检查端口占用情况:

bash
# 检查端口占用
netstat -tunlp | grep 48080

# 或使用lsof
lsof -i:48080

# 查找占用进程
ps aux | grep pointlion

# 停止占用进程
kill -9 <pid>

Q2: 前端页面空白,API请求404?

A: 检查以下几点:

  1. 确认后端服务是否正常启动
  2. 检查Nginx配置中的代理地址是否正确
  3. 查看Nginx错误日志:tail -f /var/log/nginx/pointlion-error.log
  4. 确认前端环境变量配置是否正确

Q3: Docker容器启动失败?

A: 排查步骤:

bash
# 查看容器状态
docker ps -a

# 查看容器日志
docker logs <container_id>

# 进入容器排查
docker exec -it <container_id> sh

# 查看容器资源使用
docker stats

Q4: WebSocket连接失败?

A: 检查:

  1. Nginx配置中是否包含WebSocket代理配置
  2. 后端WebSocket服务是否正常启动
  3. 如果使用HTTPS,确保WebSocket地址使用 wss:// 协议
  4. 检查防火墙是否放行WebSocket端口

Q5: 数据库连接失败?

A: 检查:

bash
# 测试数据库连接
mysql -h your-host -u your-user -p

# 检查MySQL服务状态
systemctl status mysql

# 检查防火墙
firewall-cmd --list-ports

# 开放MySQL端口
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

Q6: 性能优化建议?

A: 优化建议:

  1. 后端优化

    • 调整JVM参数:-Xms2g -Xmx4g
    • 启用GC日志:-Xlog:gc*
    • 使用多实例部署
  2. 数据库优化

    • 配置合适的连接池大小
    • 添加必要的索引
    • 定期清理过期数据
  3. Redis优化

    • 配置最大内存:maxmemory
    • 设置淘汰策略:maxmemory-policy
    • 开启持久化
  4. Nginx优化

    • 开启Gzip压缩
    • 配置静态资源缓存
    • 调整worker进程数

Q7: 如何实现零停机部署?

A: 零停机部署方案:

  1. 滚动更新:逐个重启服务实例
  2. 蓝绿部署:准备两套环境,切换流量
  3. 容器化部署:使用Docker/K8s实现快速回滚

附录

端口说明

服务默认端口说明
Gateway48080后端服务统一入口
MySQL3306数据库服务
Redis6379缓存服务
Nacos8848注册中心/配置中心
Nginx HTTP80HTTP访问端口
Nginx HTTPS443HTTPS访问端口

部署检查清单

部署完成后,请检查以下项目:

  • [ ] 所有后端服务正常启动
  • [ ] Nacos控制台能看到所有服务
  • [ ] 前端页面可以正常访问
  • [ ] 登录功能正常
  • [ ] API接口调用正常
  • [ ] WebSocket连接正常
  • [ ] 文件上传功能正常
  • [ ] 流程审批功能正常
  • [ ] 日志正常输出
  • [ ] 数据库连接正常
  • [ ] Redis连接正常
  • [ ] SSL证书正常(HTTPS)
  • [ ] 自动启动配置完成
  • [ ] 备份策略配置完成

监控建议

生产环境建议配置以下监控:

  1. 服务监控

    • 服务存活状态
    • CPU、内存使用率
    • JVM运行状态
  2. 数据库监控

    • 连接数
    • 慢查询
    • 主从同步状态
  3. Redis监控

    • 内存使用率
    • 命令执行次数
    • 键值分布
  4. Nginx监控

    • 访问日志
    • 错误率
    • 响应时间