项目部署文档
本文档介绍点狮微服务版本的生产环境部署流程,包括前端、后端的部署方式,以及Nginx配置、Docker部署等内容。
目录
环境要求
生产环境服务器配置建议
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核+ |
| 内存 | 8GB | 16GB+ |
| 硬盘 | 100GB SSD | 200GB+ SSD |
| 操作系统 | CentOS 7+ / Ubuntu 18.04+ | CentOS 8+ / Ubuntu 20.04+ |
软件环境
| 软件 | 版本要求 | 说明 |
|---|---|---|
| JDK | 17+ | 后端运行环境 |
| MySQL | 8.0+ | 数据库 |
| Redis | 6.0+ | 缓存 |
| Nacos | 2.x | 注册中心/配置中心 |
| Nginx | 1.18+ | 反向代理 |
| Node.js | 16+ | 前端构建(构建时需要) |
| Docker | 20.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: prod1.2 编译打包
在开发机器或构建服务器上执行打包:
bash
# 进入项目根目录
cd pointlion-cloud
# 清理并打包(跳过测试)
mvn clean package -DskipTests -Pprod
# 打包完成后,在各模块的 target 目录下生成 jar 包
# 例如:pointlion-cloud-gateway/target/pointlion-cloud-gateway.jar1.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 pointlion2.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/ws3.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/pointlion3.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: 检查以下几点:
- 确认后端服务是否正常启动
- 检查Nginx配置中的代理地址是否正确
- 查看Nginx错误日志:
tail -f /var/log/nginx/pointlion-error.log - 确认前端环境变量配置是否正确
Q3: Docker容器启动失败?
A: 排查步骤:
bash
# 查看容器状态
docker ps -a
# 查看容器日志
docker logs <container_id>
# 进入容器排查
docker exec -it <container_id> sh
# 查看容器资源使用
docker statsQ4: WebSocket连接失败?
A: 检查:
- Nginx配置中是否包含WebSocket代理配置
- 后端WebSocket服务是否正常启动
- 如果使用HTTPS,确保WebSocket地址使用
wss://协议 - 检查防火墙是否放行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 --reloadQ6: 性能优化建议?
A: 优化建议:
后端优化
- 调整JVM参数:
-Xms2g -Xmx4g - 启用GC日志:
-Xlog:gc* - 使用多实例部署
- 调整JVM参数:
数据库优化
- 配置合适的连接池大小
- 添加必要的索引
- 定期清理过期数据
Redis优化
- 配置最大内存:
maxmemory - 设置淘汰策略:
maxmemory-policy - 开启持久化
- 配置最大内存:
Nginx优化
- 开启Gzip压缩
- 配置静态资源缓存
- 调整worker进程数
Q7: 如何实现零停机部署?
A: 零停机部署方案:
- 滚动更新:逐个重启服务实例
- 蓝绿部署:准备两套环境,切换流量
- 容器化部署:使用Docker/K8s实现快速回滚
附录
端口说明
| 服务 | 默认端口 | 说明 |
|---|---|---|
| Gateway | 48080 | 后端服务统一入口 |
| MySQL | 3306 | 数据库服务 |
| Redis | 6379 | 缓存服务 |
| Nacos | 8848 | 注册中心/配置中心 |
| Nginx HTTP | 80 | HTTP访问端口 |
| Nginx HTTPS | 443 | HTTPS访问端口 |
部署检查清单
部署完成后,请检查以下项目:
- [ ] 所有后端服务正常启动
- [ ] Nacos控制台能看到所有服务
- [ ] 前端页面可以正常访问
- [ ] 登录功能正常
- [ ] API接口调用正常
- [ ] WebSocket连接正常
- [ ] 文件上传功能正常
- [ ] 流程审批功能正常
- [ ] 日志正常输出
- [ ] 数据库连接正常
- [ ] Redis连接正常
- [ ] SSL证书正常(HTTPS)
- [ ] 自动启动配置完成
- [ ] 备份策略配置完成
监控建议
生产环境建议配置以下监控:
服务监控
- 服务存活状态
- CPU、内存使用率
- JVM运行状态
数据库监控
- 连接数
- 慢查询
- 主从同步状态
Redis监控
- 内存使用率
- 命令执行次数
- 键值分布
Nginx监控
- 访问日志
- 错误率
- 响应时间
