签入版本

This commit is contained in:
2026-10-08 17:50:29 +08:00
parent 809750b47e
commit e213a9b31d
444 changed files with 39366 additions and 37533 deletions
@@ -8,7 +8,7 @@
```nginx
# =============================================================================
# Nginx 站点配置 — ThinkPHP 6 后端 API
# Nginx 站点配置 — Laravel 13 后端 API
# =============================================================================
# 用途:生产环境 Nginx 反向代理,将 HTTP 请求转发给 PHP-FPM 处理
# 配置路径:/etc/nginx/sites-available/rxthinkcmf
@@ -21,20 +21,18 @@ server {
# 绑定域名(替换为实际域名)
server_name api.example.com;
# 网站根目录指向 ThinkPHP 入口目录
# 网站根目录指向 Laravel 入口目录
# 注意:必须指向 public/ 子目录,而非项目根目录
root /www/api/public;
index index.php;
# -----------------------------------------------------------------
# URL 重写(ThinkPHP 必需)
# URL 重写(Laravel 必需)
# -----------------------------------------------------------------
# 将所有非真实文件请求转发到 index.php,由 ThinkPHP 路由解析
# 例:GET /api/user/page → /index.php?s=/api/user/page
# 将所有非真实文件请求转发到 index.php,由 Laravel 路由解析
# 例:GET /api/user/page → /index.php?/api/user/page(QUERY_STRING 传递)
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
try_files $uri $uri/ /index.php?$query_string;
}
# -----------------------------------------------------------------
@@ -89,19 +87,18 @@ server {
当项目部署在 CDN、云防护或负载均衡后面时,PHP 获取到的 `REMOTE_ADDR` 是代理服务器的 IP(通常为 `127.0.0.1`),而非真实客户端 IP。
框架内置 `ProxyMiddleware` 全局中间件,会自动从 `X-Forwarded-For` / `X-Real-IP` 请求头中提取真实客户端 IP。只需在 `.env` 的 `[API]` 段配置受信代理 IP:
框架内置 `ProxyMiddleware` 全局中间件,会自动从 `X-Forwarded-For` / `X-Real-IP` 请求头中提取真实客户端 IP。只需在 `.env` 中配置受信代理 IP:
```ini
[API]
# 受信代理 IP(逗号分隔,支持 CIDR 网段)
# .env — 受信代理 IP(逗号分隔,支持 CIDR 网段)
# 腾讯云 CDN 常用 IP 段(完整列表请参考云服务商文档)
PROXY_IPS = 127.0.0.1,::1,101.226.0.0/15,112.65.0.0/16,140.207.0.0/16,180.101.0.0/16,182.254.0.0/16,223.166.0.0/16
TRUSTED_PROXIES=127.0.0.1,::1,101.226.0.0/15,112.65.0.0/16,140.207.0.0/16,180.101.0.0/16,182.254.0.0/16,223.166.0.0/16
```
:::warning 重要
- 未配置 `PROXY_IPS` 时,默认信任 `127.0.0.1` 和 `::1`
- 未配置 `TRUSTED_PROXIES` 时,默认信任 `127.0.0.1` 和 `::1`
- **不要**在 Nginx 的 `fastcgi_param` 中手动覆盖 `REMOTE_ADDR`、`HTTP_X_REAL_IP`、`HTTP_X_FORWARDED_FOR`,否则会丢失 CDN 传递的真实 IP
- 配置后需清除运行时缓存:`rm -rf runtime/*`
- 若执行过 `php artisan config:cache`,修改 `.env` 后需 `php artisan config:clear`(或重新 `config:cache`)再重启 PHP-FPM
:::
## Apache 配置
@@ -109,7 +106,7 @@ PROXY_IPS = 127.0.0.1,::1,101.226.0.0/15,112.65.0.0/16,140.207.0.0/16,180.101.0.
项目 `public/.htaccess` 已配置好 URL 重写,确保启用 `mod_rewrite`:
```bash
# 启用 Apache 重写模块(ThinkPHP 路由依赖此模块)
# 启用 Apache 重写模块(Laravel 路由依赖此模块)
sudo a2enmod rewrite
# 编辑站点配置文件
@@ -118,7 +115,7 @@ sudo nano /etc/apache2/sites-available/000-default.conf
```apache
# =============================================================================
# Apache 虚拟主机配置 — ThinkPHP 6 后端 API
# Apache 虚拟主机配置 — Laravel 13 后端 API
# =============================================================================
# 配置路径:/etc/apache2/sites-available/000-default.conf
# 生效命令:sudo systemctl restart apache2
@@ -127,10 +124,10 @@ sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
# 绑定域名(替换为实际域名)
ServerName api.example.com
# 网站根目录指向 ThinkPHP 入口目录(必须是 public/)
# 网站根目录指向 Laravel 入口目录(必须是 public/)
DocumentRoot /www/api/public
# 允许 .htaccess 覆盖配置(ThinkPHP URL 重写依赖此设置)
# 允许 .htaccess 覆盖配置(Laravel URL 重写依赖此设置)
<Directory /www/api/public>
AllowOverride All # 允许 .htaccess 覆盖所有配置
Require all granted # 允许所有 IP 访问
@@ -153,8 +150,8 @@ sudo nano /etc/apache2/sites-available/000-default.conf
; =============================================================================
; php.ini 生产环境推荐配置
; =============================================================================
; 配置路径:/etc/php/8.2/fpm/php.ini(Nginx + PHP-FPM 场景)
; 生效命令:sudo systemctl restart php8.2-fpm
; 配置路径:/etc/php/8.3/fpm/php.ini(Nginx + PHP-FPM 场景)
; 生效命令:sudo systemctl restart php8.3-fpm
; =============================================================================
; -----------------------------------------------------------------------------
@@ -171,11 +168,11 @@ opcache.memory_consumption = 256 ; OPcache 共享内存大小(MB),
opcache.interned_strings_buffer = 16 ; 驻留字符串内存(MB)
opcache.max_accelerated_files = 10000 ; 最大缓存文件数(需大于项目 PHP 文件总数)
opcache.validate_timestamps = 0 ; 不检查文件修改时间(性能最优,更新代码后需重启 PHP-FPM)
opcache.save_comments = 1 ; 保留注释(ThinkPHP 注解依赖此配置)
opcache.save_comments = 1 ; 保留注释(反射文档注释、调试栈追踪依赖此配置)
```
:::warning OPcache 注意事项
`opcache.validate_timestamps = 0` 表示不检查文件修改时间,性能最优但更新代码后需要手动清除缓存:`php opcache:clear` 或重启 PHP-FPM。开发环境建议设为 `1`。
`opcache.validate_timestamps = 0` 表示不检查文件修改时间,性能最优但更新代码后需要手动清除缓存:重启 PHP-FPM。开发环境建议设为 `1`。
:::
```ini
@@ -189,15 +186,15 @@ max_input_time = 60 ; 解析请求数据的最大时间(秒)
; -----------------------------------------------------------------------------
; 文件上传
; -----------------------------------------------------------------------------
upload_max_filesize = 50M ; 单文件最大上传大小
upload_max_filesize = 50M ; 单文件最大上传大小(与 .env 中 FILE_MAX_SIZE 配合)
post_max_size = 50M ; POST 请求最大大小(必须 >= upload_max_filesize)
max_file_uploads = 20 ; 单次请求最大上传文件数
; -----------------------------------------------------------------------------
; 时区与会话
; -----------------------------------------------------------------------------
date.timezone = Asia/Shanghai ; 时区(与 .env 中 APP.DEFAULT_TIMEZONE 一致)
session.gc_maxlifetime = 7200 ; 会话过期时间(秒),默认 2 小时
date.timezone = Asia/Shanghai ; PHP 时区(Laravel 应用时区由 .env 的 APP_TIMEZONE 决定,默认 Asia/Shanghai,两者需一致)
session.gc_maxlifetime = 7200 ; 会话过期时间(秒),与 .env 中 SESSION_LIFETIME=120 分钟一致
```
### PHP-FPM 配置
@@ -206,8 +203,8 @@ session.gc_maxlifetime = 7200 ; 会话过期时间(秒),默认 2 小
; =============================================================================
; PHP-FPM 进程池配置
; =============================================================================
; 配置路径:/etc/php/8.2/fpm/pool.d/www.conf
; 生效命令:sudo systemctl restart php8.2-fpm
; 配置路径:/etc/php/8.3/fpm/pool.d/www.conf
; 生效命令:sudo systemctl restart php8.3-fpm
; =============================================================================
[www]
@@ -245,11 +242,11 @@ crontab -e
# 添加定时任务:每分钟执行一次任务调度器
# 格式:分 时 日 月 周 命令
# * * * * * = 每分钟
# cd /www/api → 切换到项目目录(ThinkPHP 需要工作目录定位配置文件)
# cd /www/api → 切换到项目目录(Artisan 需要工作目录定位配置文件)
# /usr/bin/php → PHP 绝对路径(crontab 环境变量不完整,必须用绝对路径)
# think job:run → 执行 ThinkPHP 命令行任务调度
# >> /dev/null 2>&1 → 丢弃输出(有日志系统记录,不需要控制台输出)
* * * * * cd /www/api && /usr/bin/php think job:run >> /dev/null 2>&1
# artisan job:run → 执行 RXThinkCMF 任务调度(扫描 job 表执行到期任务)
# >> /dev/null 2>&1 → 丢弃输出(任务执行结果记录在任务日志表中)
* * * * * cd /www/api && /usr/bin/php artisan job:run >> /dev/null 2>&1
# 验证 crontab 是否配置成功
crontab -l
@@ -270,7 +267,7 @@ crontab -l
# /mo 1 → 每 1 分钟执行一次
# /f → 强制覆盖同名任务
# =============================================================================
schtasks /create /tn "RXThinkCMF_Job" /tr "cmd /c cd /d D:\xampp\htdocs\v3\thinkphp6 && C:\xampp\php\php.exe think job:run" /sc minute /mo 1 /f
schtasks /create /tn "RXThinkCMF_Job" /tr "cmd /c cd /d D:\laragon\www\RXThinkCMF_Laravel13_EleVue && D:\laragon\bin\php\php-8.3\php.exe artisan job:run" /sc minute /mo 1 /f
# 或通过图形界面:Win+R → 输入 taskschd.msc → 回车
```
@@ -287,12 +284,12 @@ schtasks /create /tn "RXThinkCMF_Job" /tr "cmd /c cd /d D:\xampp\htdocs\v3\think
; =============================================================================
[program:rxthinkcmf-job]
command = php /www/api/think job:daemon ; 守护进程模式运行任务调度
directory = /www/api ; 工作目录
autostart = true ; Supervisor 启动时自动启动此进程
autorestart = true ; 进程退出后自动重启
user = www-data ; 运行用户
stdout_logfile = /var/log/rxthinkcmf-job.log ; 标准输出日志路径
command = php /www/api/artisan job:daemon ; 守护进程模式运行任务调度
directory = /www/api ; 工作目录
autostart = true ; Supervisor 启动时自动启动此进程
autorestart = true ; 进程退出后自动重启
user = www-data ; 运行用户
stdout_logfile = /var/log/rxthinkcmf-job.log ; 标准输出日志路径
```
```bash
@@ -309,6 +306,20 @@ sudo supervisorctl start rxthinkcmf-job
sudo supervisorctl status rxthinkcmf-job
```
### 队列常驻进程(Supervisor)
本项目队列驱动为 Redis(`QUEUE_CONNECTION=redis`),生产环境需常驻进程消费队列:
```ini
[program:rxthinkcmf-queue]
command = php /www/api/artisan queue:work --tries=3 --timeout=60
directory = /www/api
autostart = true
autorestart = true
user = www-data
stdout_logfile = /var/log/rxthinkcmf-queue.log
```
## 多数据库部署注意事项
### MySQL
@@ -320,10 +331,10 @@ sudo systemctl start mysql
# 创建生产数据库
# CHARACTER SET utf8mb4 → 支持 emoji 等四字节字符
# COLLATE utf8mb4_general_ci → 不区分大小写的排序规则
mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mysql -u root -proot -e "CREATE DATABASE \`rxthinkcmf.laravel13.elevue\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
# 导入初始化数据(项目自带的 SQL 文件)
mysql -u root -proot rxthinkcmf.thinkphp6.elevue < document/mysql/rxthinkcmf.thinkphp6.elevue.sql
mysql -u root -proot rxthinkcmf.laravel13.elevue < document/mysql/rxthinkcmf.laravel13.elevue.sql
```
### PostgreSQL
@@ -333,33 +344,29 @@ mysql -u root -proot rxthinkcmf.thinkphp6.elevue < document/mysql/rxthinkcmf.thi
sudo systemctl start postgresql
# 安装 PHP 的 PostgreSQL 扩展(如果尚未安装)
sudo apt install php8.2-pgsql
sudo apt install php8.3-pgsql
# 重启 PHP-FPM 使扩展生效
sudo systemctl restart php8.2-fpm
sudo systemctl restart php8.3-fpm
# 创建数据库(-u postgres 以 postgres 用户执行)
sudo -u postgres createdb rxthinkcmf.thinkphp6.elevue
sudo -u postgres createdb rxthinkcmf.laravel13.elevue
```
### SQLite
```bash
# 创建数据库文件存放目录
mkdir -p /www/api/runtime
# 创建空的 SQLite 数据库文件(touch 创建空文件即可)
touch /www/api/runtime/database.sqlite
touch /www/api/database/database.sqlite
# 设置文件权限(664 = owner/group 可读写,others 只读)
chmod 664 /www/api/runtime/database.sqlite
chmod 664 /www/api/database/database.sqlite
```
```ini
; .env 配置(切换到 SQLite 数据库)
[DATABASE]
TYPE = sqlite ; 数据库类型改为 sqlite
DATABASE = /www/api/runtime/database.sqlite ; SQLite 文件路径
DB_CONNECTION=sqlite ; 数据库类型改为 sqlite
DB_DATABASE=/www/api/database/database.sqlite ; SQLite 文件路径(绝对路径)
```
### 数据库连接池
@@ -382,17 +389,19 @@ chmod -R 755 /www/api/ # 目录 755,文件 644
chown -R www-data:www-data /www/api/ # 设置 owner 为 Web 服务器用户
# -----------------------------------------------------------------------------
# 运行时目录(必须可写 — ThinkPHP 缓存、日志、编译模板)
# 运行时目录(必须可写 — Laravel 缓存、日志、编译视图、框架引导缓存)
# -----------------------------------------------------------------------------
chmod -R 777 /www/api/runtime/ # 777 确保 PHP-FPM 进程可写入
chown -R www-data:www-data /www/api/runtime/
chmod -R 777 /www/api/storage/ # 777 确保 PHP-FPM 进程可写入
chown -R www-data:www-data /www/api/storage/
chmod -R 777 /www/api/bootstrap/cache/ # 配置/路由缓存文件写入位置
chown -R www-data:www-data /www/api/bootstrap/cache/
# -----------------------------------------------------------------------------
# 上传目录(必须可写 — 用户上传文件存储位置)
# -----------------------------------------------------------------------------
mkdir -p /opt/data/uploads # 创建上传目录(如不存在)
chmod -R 755 /opt/data/uploads # 目录可写
chown -R www-data:www-data /opt/data/uploads # 设置 owner
mkdir -p /www/api/public/uploads # 创建上传目录(如不存在)
chmod -R 755 /www/api/public/uploads # 目录可写
chown -R www-data:www-data /www/api/public/uploads
```
## SSL 证书(HTTPS)
@@ -421,3 +430,7 @@ server {
return 301 https://$server_name$request_uri; # 301 跳转到 HTTPS
}
```
:::tip 启用 HTTPS 后的前端配置
前端 `.env` 中的 API 地址需改为 `https://` 域名,`.env` 的 `CORS_ALLOW_ORIGIN` 同步改为 `https://admin.example.com`,避免跨域失败。
:::