Nextcloud 大文件上传:逐层检查大小、超时与临时空间
原文给出的默认最大上传文件大小为 512MB,可以提高到文件系统和操作系统所允许的范围。不过,有些硬限制不能通过调大参数绕过:
- 32 位操作系统架构:小于 2GB。
- IE6–IE8:小于 2GB。
- IE9–IE11:小于 4GB。
64 位文件系统通常有更高的限制,应查阅所用文件系统文档。上述 IE 条目是原文保留的历史浏览器限制,不能把它们当成当代浏览器的通用结论,也不能仅凭本页判断当前部署的实际默认值。
Nextcloud 同步客户端会把文件拆成较小的块上传,因此不受同一整文件请求上传大小限制影响;客户端配置详见客户端文档。
系统配置
- 原文要求安装最新 PHP;实际应选择当前 Nextcloud 版本支持的 PHP 版本。
- 原文建议关闭用户配额,使配额无限。这会改变资源限制,应按自己的容量管理需求决定,并不表示所有大文件上传都必须取消配额。
- 临时目录或分区必须足够容纳多个用户的并行上传。例如最大上传为 10GB、平均同时上传人数为 100 时,原文建议至少预留 10×100GB 的临时空间。
配置 Web 服务器
Nextcloud 自带 nextcloud/.htaccess。PHP-FPM 不会从 .htaccess 读取 PHP 设置,因此这种部署应使用 nextcloud/.user.ini 或实际加载的 PHP 配置。
先确认 Web 请求所用 PHP 的 Loaded Configuration File,找到对应的配置文件。原文在此写了以下 php_value 形式:
php_value upload_max_filesize 16G
php_value post_max_size 16G
语法校注:php_value 是 PHP 作为 Apache 模块时用于 Apache 配置或 .htaccess 的指令,不是 php.ini 的写法。php.ini 及 .user.ini 中应写 名称 = 值,对应示例见后文。PHP-FPM 部署不要直接把这些 Apache 指令抄进 .htaccess。
upload_max_filesize 和 post_max_size 可能不适用于 WebDAV 的单文件 PUT 请求或分块上传。在这些情况下,PHP 和 Web 服务器的超时值可能成为限制因素。
根据需求调整配置。如果 PHP 日志中出现超时,可以提高相关超时值,单位为秒。以下仍是原文的 Apache 模块写法:
php_value max_input_time 3600
php_value max_execution_time 3600
如果使用 php.ini,等价写法是:
max_input_time = 3600
max_execution_time = 3600
Apache 的 mod_reqtimeout 模块也可能让大文件上传中止。使用该模块且上传失败时,原文提出禁用模块或提高 RequestReadTimeout 的超时值。实际配置应结合日志和请求读取速率评估,不能只为一个失败上传直接去掉整个限制。
Web 服务器还有其他可能阻止大文件上传的参数,请按相应软件手册配置。
Apache
LimitRequestBody:原文指出 Apache HTTP Server 2.4.53 及之前的默认值为不限制,之后的默认值为 1GiB;新的默认值会限制未分块客户端。若影响当前部署,可以明确设为0或与本地上传限制相称的值。SSLRenegBufferSize。Timeout。
Apache 与 mod_fcgid
FcgidMaxRequestInMem。FcgidMaxRequestLen。
原文保留了一个 2016 年 2–3 月的历史提示:Apache 2.4 配合 mod_fcgid 时,显著提高 FcgidMaxRequestInMem,曾是绕过上传大文件导致段错误的 Apache mod_fcgid 缺陷 #51747 的方法。它不是一般部署必需设置;缺陷修复后可能不再需要这样增大参数。不要把这项旧补丁当作当前版本已证实仍需要的处理。
Apache 与 mod_proxy_fcgi
检查 ProxyTimeout。
NGINX
client_max_body_size。fastcgi_read_timeout:分块上传也可能在最终 MOVE 操作中遇到 504 超时,原文指出它常是相关排查项。client_body_temp_path。
确保 client_body_temp_path 指向空间足够的分区,并与 upload_tmp_dir 或后文的 tempdirectory 位于同一分区。原文为了性能建议使用专门存放交换和临时数据的独立磁盘。
如果站点前面还有 NGINX,例如负载均衡器,原文提醒:前端的 proxy_buffering 与 proxy_max_temp_file_size 会影响大文件下载缓存,后者默认的 1GB 可能成为相关排查项。如果能访问前端配置,可以关闭 proxy_buffering 或增大 proxy_max_temp_file_size;否则可在后端通过 add_header X-Accel-Buffering no; 发出禁用缓冲的提示。这一段针对下载与前端缓冲,不能混同为所有上传的文件大小上限。
配置 PHP
不使用 Nextcloud 的 .htaccess 或 .user.ini 时,也可以在 PHP 配置中设置。如果之前自行写过上传大小相关的 .htaccess 行,应先检查并注释掉冲突的设置。
原文另有 32 位环境提示:把 php.ini 中的 open_basedir 指令注释掉。此项会改变 PHP 路径访问约束,属于旧环境中的具体建议,不应在未核对运行环境时作为通用操作执行。
在 php.ini 中设置以下两个参数,数值应按实际需求选择:
upload_max_filesize = 16G
post_max_size = 16G
指定 PHP 使用的临时目录:
upload_tmp_dir = /var/big_temp_file/
原文要求关闭输出缓冲,否则可能遇到内存相关错误。在相应的 .user.ini 或 php.ini 中使用:
output_buffering = 0
Apache 模块模式若在 .htaccess 设置布尔配置,应按 PHP 手册使用相应的 Apache 指令;不要混用 INI 与 Apache 语法。
配置 Nextcloud
除了 PHP 的 upload_tmp_dir,还可以在 config.php 中设置 tempdirectory,指定上传文件的临时位置。这对无法访问 php.ini 的部署尤其有用,具体参数见配置参数文档。
如果自行设置了 session_lifetime,不要设得太短。它至少应覆盖最长一次上传所需时间,单位为秒。拿不准时,可以移除此项自定义设置,恢复到 config.sample.php 所示默认值。
调整服务器端分块大小
在上传带宽较高的环境中,可以调整服务器的上传分块大小来改善性能:
sudo -E -u www-data php occ config:system:set --type int --value 20971520 files.chunked_upload.max_size
该数值以字节为单位;示例的 20971520 字节实际是 20MiB(原文称作 20MB)。--value 0 表示不分块。原文给出的默认值为 104857600,即 100MiB。命令中的 www-data 应与实际 Web 服务用户一致;本稿未在 Nextcloud 实例上执行该配置命令。
对象存储中的大文件上传
对象存储上的分块上传,在处理时可能占用更多本地临时空间:各分块先从对象存储下载,再在 Nextcloud 服务器临时目录中组装成最终文件。应增大临时目录容量,并确保 PHP、Web 服务器及链路中的负载均衡器拥有足够的请求超时时间。
原文补充:较新的 Nextcloud Server 在以 S3 作为 Primary Storage 时会使用 S3 MultipartUpload,使分块直接流式写入 S3,最终 MOVE 请求不再需要在 Nextcloud 服务器上组装整个文件。这要求 memcache.distributed 使用 Redis 或 Memcached;否则会回到需要本地组装的旧行为。原文没有在此给出版本分界,部署前应按实际版本确认。
联合云共享
使用 Federated Cloud Sharing 共享大文件时,可以提高对联邦服务器的请求超时。在 config.php 中配置 davstorage.request_timeout,原文给出的默认值为 30 秒。
原文:Uploading big files > 512MB,Nextcloud 35 Administration Manual,Nextcloud 文档贡献者。文档采用 CC BY 3.0 Unported,参见官方仓库许可声明。本页将正文译为中文,保留全部原文代码,补充历史条目适用范围、INI 与 Apache 配置语法区别及 MiB 单位说明。语法校注参考 PHP 配置文件手册与Apache 模块配置手册。











暂无评论内容