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”

文档结束 — 建议在修改任何配置前,先创建服务器快照或备份配置文件,以便快速回滚。

类似文章

发表回复