在正常情况下,Nextcloud的默认的最大上传限制为512MB,在你的的文件系统和操作系统允许的前提下,你可以提升这一限制。换一种说法,能上传的最大文件的大小还取决于你的浏览器和操作系统:
[ssbluelist]
- 32位系统可上传小于2GB的文件
- IE6~IE8可上传小于2GB的文件
- IE9~IE11可上传小于4GB的文件
在64位系统中允许上传更大的文件,具体能上传多大仍然取决于你的操作系统的版本。
[infobox]使用Nextcloud sync 客户端可以无视这个上传限制,因为这个客户端会将文件切分后上传。[/infobox]
系统设置
[ssbluelist]
- 确保所安装的PHP的版本在5.6.6以上,推荐使用最新版本的PHP
- 禁用用户配额:将所有用户的配额设置为“无限制”
- 对服务器的要求:临时文件空间(/tmp目录)和分区必须足够大以承载多个用户的多个并行上传,如果最大上传的限制为10GB,而约有100个用户(一般达不到这个数量)同时上传文件,那么至少要有100×10GB的空间来容纳临时文件(这儿牵涉到Linux的临时文件的分区)
配置你的网站服务器
[infobox]Nextcloud利用其程序根目录下的的.htaccess文件来控制上传限制。因为php-fpm无法读取.htaccess文件,所以相关的PHP设置必须要设置在
nextcloud/.user.ini中。[/infobox]
在.htaccess文件中中设置以下参数,可将上传文件大小限制设置为16GB:
php_value upload_max_filesize = 16G php_value post_max_size = 16G
当然,具体要设置为多少取决于你的需求。
而另一个限制了大文件的上传的因素是PHP的超时(timeout),如果你在日志中看到超时的记录,可以将PHP的超时的数值调得大一些:
php_value max_input_time 3600 php_value max_execution_time 3600
说到timeout,不仅PHP会有timeout,HTTP服务器也会有。例如Apache的
mod_reqtimeout
模块,它也可能会导致大文件上传的失败。如果你在使用这个模块并且遇到了超时的问题,那么可以考虑在Apache配置中禁用它:
使用命令禁用:
a2dismod reqtimeout
service apache2 restart
或者直接删除该模块的配置文件:
rm /etc/apache2/mods-enabled/reqtimeout.*
service apache2 restart
(实际环境中Apache的安装方式可能有所不同,禁用该模块方式也可能不同)
其它限制
除了上文所述的会限制到大文件上传的地方,一些HTTP服务器的配置也会影响到大文件的上传:
Apache
[ssbluelist]
- LimitRequestBody(请求实体限制)
- SSLRenegBufferSize(缓冲区大小)
1.LimitRequestBody:这项配置一般在Apache做反响代理服务器用到,具体用法是在Apache配置文件中加上这样一句(后面所跟的数值的单位为K):
LimitRequestBody 102400 #允许上传最大为100k的文件
2.SSLRenegBufferSize:在进行SSL握手之前,Apache会将请求先存放到缓冲区中,这项配置决定了缓冲区的大小:
SSLRenegBufferSize 262144 #缓冲区大小为262144Bytes
Apache with mod_fcgid
[ssbluelist]
[/ssbluelist]Nginx
Nginx中有这样几个影响上传文件的配置选项:
[ssbluelist]
- client_max_body_size(最大请求实体)示例:
client_max_body_size 512M; #最大请求实体为512M
- fastcgi_buffers(指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答)示例:
fastcgi_buffers 64 4K; #为小于256k的PHP页面分配64个4k缓冲区
- fastcgi_read_timeout(FastCGI服务器的响应超时时间)示例:
fastcgi_read_timeout 60 #超时时间为1分钟
- client_body_temp_path(指定POST上传的文件地址)示例:
client_body_temp_path /spool/nginx/client_temp 3 2; #请求实体临时路径 3、2为存放临时文件的目录名的数字位数
- fastcgi_request_buffering(这个是1.7.11版本的一个新的配置选项)一般予以关闭:
fastcgi_request_buffering off;
[infobox]确保client_body_temp_path指向具有足够空间的上传文件大小的分区,并且与upload_tmp_dir或temp目录(见下文)为相同的分区。为了获得最佳性能,最好将它们放在专用于交换和临时存储的单独的硬盘驱动器上。[/infobox]
如果Nginx作为反向代理服务器,那么还会有这样两项配置与之有关:
[ssbluelist]
- proxy_buffering
- proxy_max_temp_file_size
PHP的配置
如果你不想使用Nextcloud的.htaccess或.user.ini文件,也可以直接去修改PHP的配置,如果要这样做,确保注释掉.htaccess中的与文件上传有关的那几行。如果您在32位系统上运行Nextcloud,则您的php.ini文件中的任何open_basedir指令都需要注释掉。
在php.ini中设置下面的两个参数,以修改最大文件上传限制为16G(或其他数值):
upload_max_filesize = 16G post_max_size = 16G
为PHP设置你想使用的临时目录的位置,例如:
upload_tmp_dir = /var/big_temp_file/
输出缓冲必须在.htaccess或.user.ini或php.ini中关闭,否则返回与内存相关的错误:
output_buffering = 0
Nextcloud配置
如果你无法修改php.ini,那么你也可以在config.php中指定
upload_tmp_dir
的值,例如在文件中加入这样一行:
'tempdirectory' => '/var/big_temp_file/',
详细的内容可以参见官方文档中关于config.php的介绍。
如果在config.php(参见Config.php参数)文件中配置了session_lifetime设置,那么请确保它不是太低。此设置需要至少配置为最长上传时间(以秒为单位)。如果不确定,就从配置中完全删除它,将其重置为config.sample.php中显示的默认值。
在管理页面中配置上传大小限制
说了这么多,最简单的方法还是在管理页面中直接修改上传大小(这个途径受制上文中所有内容):
前提是.htaccess文件正常工作。
额,你可能遇到这样的尴尬的情况:
将.htaccess文件的用户设置为www-data就可以了:
chown www-data .htaccess
comments powered by Disqus