Become a sponsor

本章概要
从服务器准备到应用上线的完整部署操作清单,适用于生产环境首次部署和后续版本更新。
timedatectl set-timezone Asia/ShanghaiPHP 环境:
pdo_mysql、mbstring、json、openssl、fileinfo、gdredis(缓存驱动)数据库:
CREATE DATABASE \rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;`mysql -u root -proot rxthinkcmf.thinkphp6.elevue < document/mysql/rxthinkcmf.thinkphp6.elevue.sqlRedis(可选):
redis-cli pingNode.js(前端构建):
npm install -g pnpm后端:
composer install --no-dev --optimize-autoloader.env 文件(数据库、JWT 密钥、文件上传等)php -r "echo bin2hex(random_bytes(32));"chmod -R 755 runtime/、chmod -R 755 public/uploads/php think runcrontab -e → * * * * * cd /www/api && php think job:run前端:
cd ui && pnpm installpnpm buildui/dist/ 目录)到服务器# =============================================================================
# 后端 API 站点配置
# =============================================================================
server {
listen 80; # 监听 80 端口
server_name api.example.com; # 绑定域名
root /www/api/public; # ThinkPHP 入口目录
index index.php; # 默认索引文件
# URL 重写(ThinkPHP 路由必需)
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last; # 非真实文件请求转发到 index.php
}
}
# PHP-FPM 转发
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 监听地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 安全:禁止上传目录执行 PHP
location ~ /uploads/.*\.php$ { deny all; }
}
# =============================================================================
# 前端 SPA 站点配置
# =============================================================================
server {
listen 80; # 监听 80 端口
server_name admin.example.com; # 绑定域名
root /www/admin/dist; # 前端构建产物目录
index index.html; # 默认索引文件
# Vue Router History 模式(所有非文件请求回退到 index.html)
location / {
try_files $uri $uri/ /index.html;
}
# API 反向代理到后端
location /api/ {
proxy_pass http://127.0.0.1:8000; # 后端服务地址
proxy_set_header Host $host; # 传递原始 Host
proxy_set_header X-Real-IP $remote_addr; # 传递客户端 IP
}
}.env 中 APP_DEBUG = false.env 中 SHOW_ERROR_MSG = false.env 中 JWT.SECRET 已修改为强随机密钥.env 中 CORS.ALLOW_ORIGIN 已限制为实际域名# -----------------------------------------------------------------------------
# 第 1 步:备份(更新前必须备份)
# -----------------------------------------------------------------------------
# 备份项目代码(cp -r 递归复制整个目录)
cp -r /www/api /www/api_backup_$(date +%Y%m%d)
# 备份数据库(mysqldump 导出 SQL,$(date +%Y%m%d) 自动生成日期后缀)
mysqldump -u root -proot rxthinkcmf.thinkphp6.elevue > /backup/db_$(date +%Y%m%d).sql
# -----------------------------------------------------------------------------
# 第 2 步:更新代码
# -----------------------------------------------------------------------------
cd /www/api # 进入项目目录
composer install --no-dev --optimize-autoloader # 安装依赖(排除开发依赖,优化自动加载)
# -----------------------------------------------------------------------------
# 第 3 步:更新数据库(如有迁移脚本)
# -----------------------------------------------------------------------------
mysql -u root -proot rxthinkcmf.thinkphp6.elevue < document/mysql/migration.sql
# -----------------------------------------------------------------------------
# 第 4 步:清除缓存
# -----------------------------------------------------------------------------
php think clear # 清除 ThinkPHP 运行时缓存(模板、路由、配置等)
# -----------------------------------------------------------------------------
# 第 5 步:重启 PHP-FPM(使 OPcache 失效,加载新代码)
# -----------------------------------------------------------------------------
sudo systemctl restart php8.2-fpm# -----------------------------------------------------------------------------
# 第 1 步:构建前端
# -----------------------------------------------------------------------------
cd ui && pnpm install && pnpm build # 安装依赖并执行生产构建
# -----------------------------------------------------------------------------
# 第 2 步:部署构建产物
# -----------------------------------------------------------------------------
cp -r dist/* /www/admin/dist/ # 将构建产物复制到 Nginx 站点目录
# -----------------------------------------------------------------------------
# 第 3 步:重载 Nginx(不断开现有连接)
# -----------------------------------------------------------------------------
sudo nginx -s reload# -----------------------------------------------------------------------------
# 后端回滚(恢复代码 + 数据库)
# -----------------------------------------------------------------------------
# 恢复项目代码
cp -r /www/api_backup_20260920/* /www/api/
# 恢复数据库
mysql -u root -proot rxthinkcmf.thinkphp6.elevue < /backup/db_20260920.sql
# 重启 PHP-FPM(清除 OPcache,加载旧代码)
sudo systemctl restart php8.2-fpm
# -----------------------------------------------------------------------------
# 前端回滚(恢复构建产物)
# -----------------------------------------------------------------------------
cp -r /www/admin_backup_20260920/dist/* /www/admin/dist/
# 重载 Nginx(应用旧的前端文件)
sudo nginx -s reload