131 lines
6.1 KiB
Markdown
131 lines
6.1 KiB
Markdown
# Discuz! 论坛附件上传参数设置与服务器内存配置建议
|
||
|
||
适用场景:Discuz! 论坛(X3.4 / X3.5)
|
||
适用系统:Linux / Windows Server
|
||
适用环境:Nginx / Apache / IIS + PHP + MySQL
|
||
|
||
## 一、附件上传涉及的参数层级
|
||
附件上传的限制并非由单一参数决定,而是由 客户端 → Web服务器 → PHP → Discuz后台 → 用户组权限 五级联动控制。任何一个环节设置过小,都会导致上传失败。
|
||
参数层级示意图
|
||
客户端浏览器
|
||
↓
|
||
Web服务器(Nginx/Apache/IIS) ← client_max_body_size / LimitRequestBody / maxAllowedContentLength
|
||
↓
|
||
PHP 配置文件(php.ini) ← upload_max_filesize / post_max_size / memory_limit / max_execution_time / max_input_time
|
||
↓
|
||
Discuz 后台全局设置 ← 【全局】→【上传设置】→“最大附件尺寸”
|
||
↓
|
||
Discuz 用户组权限 ← 【用户】→【用户组】→【附件相关】→“最大附件尺寸”
|
||
|
||
## 二、各层级参数详解与推荐值
|
||
### 2.1 PHP 配置文件(php.ini)
|
||
这是最核心的底层限制,所有上传文件必须先过这一关。
|
||
|
||
参数 作用 推荐值 说明
|
||
upload_max_filesize 单个文件大小上限 根据需求,如 500M / 1G 字面意思,一个附件最大不能超过此值
|
||
post_max_size 整个 POST 请求大小上限 ≥ upload_max_filesize + 10M 必须大于等于前者,因 POST 请求包含表单字段
|
||
memory_limit 单个 PHP 脚本最大可用内存 建议 128M ~ 512M,视服务器物理内存而定 影响图片缩略图生成、插件运行等,不宜过小
|
||
max_execution_time PHP 脚本最大执行时间(秒) 根据文件大小调整,如 300 ~ 7200 大文件上传需足够时间,设为 0 表示无限制
|
||
max_input_time PHP 接收输入数据最大时间(秒) 与 max_execution_time 保持一致 接收文件超时也会导致失败
|
||
配置示例(支持 1G 附件):
|
||
upload_max_filesize = 1024M
|
||
post_max_size = 1024M
|
||
memory_limit = 256M
|
||
max_execution_time = 3600
|
||
max_input_time = 3600
|
||
|
||
### 2.2 Web 服务器层限制
|
||
PHP 之前的第一道关卡,容易被忽略。
|
||
|
||
Web 服务器 参数 推荐设置 配置文件位置
|
||
Nginx client_max_body_size 与 post_max_size 一致,如 1024M http / server / location 块
|
||
Apache LimitRequestBody 与 post_max_size 一致,如 1073741824(1G 字节) httpd.conf 或 .htaccess
|
||
IIS maxAllowedContentLength 与 post_max_size 一致,如 1073741824 请求筛选模块
|
||
Nginx 配置示例:
|
||
nginx
|
||
client_max_body_size 1024M;
|
||
|
||
### 2.3 Discuz 后台全局设置
|
||
位置:【全局】 → 【上传设置】 → 【附件设置】
|
||
|
||
参数 说明 推荐设置
|
||
最大附件尺寸 全站统一的附件大小上限 建议 ≤ upload_max_filesize,留 10~20M 余量
|
||
允许附件类型 如 zip, rar, jpg, png 按需设置,避免上传可执行文件等风险类型
|
||
缩略图设置 是否生成缩略图 如开启,需确保 memory_limit 足够。
|
||
|
||
### 2.4 Discuz 用户组权限
|
||
位置:【用户】 → 【用户组】 → 【编辑】 → 【附件相关】
|
||
|
||
参数 说明 推荐设置
|
||
最大附件尺寸 该用户组允许上传的附件大小 可分级设置:管理员/版主 > 普通会员
|
||
允许附件类型 可单独覆写全局设置 如需限制特定用户组,可在此调整。
|
||
|
||
### 2.5 用户附件下载限制
|
||
以下参数均在/etc/nginx/8.2/conf.d/xxx.conf中,具体路径根据你的配置决定
|
||
send_timeout 3600s; #发送响应超时
|
||
keepalive_timeout 3600s; #长连接超时
|
||
fastcgi_read_timeout 3600s; #PHP-FPM 响应超时
|
||
client_max_body_size 2048M;
|
||
client_body_timeout 3600s;
|
||
client_header_timeout 60s;
|
||
client_body_buffer_size 20M;
|
||
|
||
## 三、服务器内存大小与参数设置推荐
|
||
### 3.1 核心原则
|
||
memory_limit ≠ 附件上限:它限制的是 PHP 脚本总内存占用,包括程序本身、图片处理、插件等。
|
||
|
||
留足余量:建议 memory_limit 比实际附件限制大 20%~30%,以应对图片缩略图等突发内存需求。
|
||
|
||
总内存分配参考:总内存 = 系统预留 + MySQL + PHP-FPM(所有进程) + 其他服务
|
||
|
||
### 3.2 不同内存配置推荐表
|
||
物理内存 MySQL 占用 系统预留 可用 PHP 总内存 推荐 memory_limit 推荐附件上限
|
||
1G ~200M ~200M ~600M 128M 80M ~ 100M
|
||
2G ~300M ~300M ~1.4G 256M 200M ~ 300M
|
||
4G ~500M ~400M ~3.1G 512M 500M ~ 800M
|
||
8G ~1G ~500M ~6.5G 1G 1G ~ 2G
|
||
说明:以上为通用建议值,若论坛图片处理频繁或插件较多,应适当提高 memory_limit,相应降低附件上限。
|
||
|
||
### 3.3 并发场景考虑
|
||
公式:max_children(PHP-FPM 进程数) × memory_limit ≤ 可用 PHP 总内存
|
||
|
||
示例:2G 内存,可用 PHP 总内存约 1.4G,设 memory_limit = 256M,则 max_children ≤ 5(1.4G / 256M ≈ 5.5,向下取整)
|
||
|
||
## 四、常见问题排查(FAQ)
|
||
### Q1:上传大文件时进度条卡住或直接失败?
|
||
可能原因:
|
||
(1)Web 服务器层限制未调大(client_max_body_size 等)
|
||
(2)PHP max_input_time / max_execution_time 过小
|
||
(3)临时目录空间不足(upload_tmp_dir)
|
||
|
||
### Q2:小文件能传,大文件就失败?
|
||
排查方向:
|
||
(1)检查是否触发了 Web 服务器的 client_max_body_size
|
||
(2)检查 PHP memory_limit 是否过小(尤其处理图片时)
|
||
|
||
### Q3:为什么 Discuz 后台显示的最大附件和 php.ini 不一样?
|
||
原因:Discuz 会取 upload_max_filesize、post_max_size、memory_limit 中的最小值作为建议上限。若 memory_limit 较小,会直接显示为附件限制。
|
||
|
||
## 五、安全建议
|
||
(1)限制附件类型:避免上传 php、sh、exe 等可执行文件
|
||
(2)开启病毒扫描(如有条件)
|
||
(3)定期清理临时目录:/tmp 或 upload_tmp_dir
|
||
(4)监控磁盘空间:附件目录和临时目录需预留足够空间
|
||
|
||
## 六、附录:常用命令速查
|
||
Linux 下查看 PHP 配置
|
||
php -i | grep upload_max
|
||
php -i | grep post_max
|
||
php -i | grep memory_limit
|
||
修改 php.ini 后重载服务
|
||
#Nginx + PHP-FPM
|
||
sudo systemctl restart php-fpm
|
||
sudo systemctl reload nginx
|
||
|
||
#Apache
|
||
sudo systemctl restart httpd
|
||
查找实际使用的 php.ini 位置
|
||
php -i | grep "Loaded Configuration File"
|
||
文档结束 — 建议在修改任何配置前,先创建服务器快照或备份配置文件,以便快速回滚。
|
||
|