Nextcloud(Apache/PHP-FPM)浏览器端上传速度过慢优化咨询
Nextcloud浏览器端上传速度优化方案
不同上传方式的速度差异本质是链路处理逻辑不同:WinSCP走SFTP/SSH协议直写磁盘,完全不经过PHP、Nextcloud应用层处理,所以速度最高;HTTP/2下速度异常偏低基本是Apache HTTP/2配置、PHP参数、Nextcloud分块策略三者不匹配导致,按以下步骤逐一调整即可:
1. Apache HTTP/2 配置修正
Apache默认HTTP/2参数的流控窗口、内存分配阈值非常保守,是HTTP/2上传速度远低于HTTP1.1的核心原因,修改对应虚拟主机或全局HTTP/2配置:
- 调整HTTP/2流控参数,在配置中加入以下内容:
# 单流内存缓冲区调至25MB,流控窗口调至16MB H2StreamMaxMemSize 26214400 H2WindowSize 16777216 H2MaxSessionStreams 100 # 优先启用HTTP/2 Protocols h2 h2c http/1.1
- 调整请求读取规则,避免频繁小块刷写磁盘,修改
mod_reqtimeout模块配置:
RequestReadTimeout header=20-40,MinRate=500 body=200,MinRate=5000
- 保存配置后执行配置校验,重启Apache生效:
# Debian/Ubuntu apache2ctl configtest && systemctl restart apache2 # RHEL/CentOS/Rocky httpd -t && systemctl restart httpd
2. PHP 参数调优
结合你提供的phpinfo信息,默认PHP配置的上传限制、缓存参数偏保守,找到Apache加载的php.ini路径(可在phpinfo页面的Loaded Configuration File字段查看),修改以下参数:
# 基础上传大小限制,根据你的实际需求调整,数值要大于你要上传的单文件最大体积 upload_max_filesize = 20G post_max_size = 20G max_execution_time = 3600 max_input_time = 3600 memory_limit = 1G # 关闭不必要的输出缓冲,调大路径缓存减少磁盘IO output_buffering = Off realpath_cache_size = 4096K realpath_cache_ttl = 600
如果你的环境用PHP-FPM而非mod_php运行,还要修改对应FPM池的www.conf配置,将request_terminate_timeout值改为3600,重启PHP-FPM服务生效。
3. Nextcloud 自身配置调整
浏览器端上传默认走Nextcloud分块上传逻辑,默认分块体积过小会导致频繁的应用层校验、数据库写入拖慢速度:
- 打开Nextcloud配置文件
nextcloud根目录/config/config.php,加入以下配置:
// 分块大小从默认10MB调整为100MB,减少分片交互次数 'max_chunk_size' => 104857600, // 关闭上传过程中的实时预览生成,避免占用IO 'enable_previews' => false, // 开启文件锁避免并发写入冲突 'filelocking.enabled' => true,
- 如果你安装了文件杀毒、实时同步类第三方插件,临时禁用后测试上传速度,这类插件会对上传的每个分块做扫描处理,严重拖慢速度。
- 校验数据目录磁盘IO性能,在Nextcloud数据目录执行以下命令测试顺序写速度:
dd if=/dev/zero of=./test_write.img bs=1M count=2048 oflag=direct
正常机械盘顺序写速度应不低于80MB/s,SSD应不低于200MB/s,如果速度偏低优先排查磁盘、RAID卡配置问题。
4. 额外排查项
- 如果Apache前端套了CDN、反向代理,先绕过代理直连Apache源站测试,多数CDN默认的HTTP/2流控窗口极小,会直接将上传速度限制在几MB/s。
- 测试时关闭浏览器广告拦截、流量扫描类插件,这类插件会Hook上传请求做内容扫描,拖慢上传速度。
调整完成后再测试HTTP/2下的上传速度,正常应能跑满你带宽的上传上限,和HTTP1.1速度持平甚至更高。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

