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”
文档结束 — 建议在修改任何配置前,先创建服务器快照或备份配置文件,以便快速回滚。