Files
IT-Docs/Discuz! 论坛附件上传参数设置与服务器内存配置建议.md

131 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 一致,如 10737418241G 字节) 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_childrenPHP-FPM 进程数) × memory_limit ≤ 可用 PHP 总内存
示例:2G 内存,可用 PHP 总内存约 1.4G,设 memory_limit = 256M,则 max_children ≤ 51.4G / 256M ≈ 5.5,向下取整)
## 四、常见问题排查(FAQ
### Q1:上传大文件时进度条卡住或直接失败?
可能原因:
(1)Web 服务器层限制未调大(client_max_body_size 等)
2PHP 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"
文档结束 — 建议在修改任何配置前,先创建服务器快照或备份配置文件,以便快速回滚。