Nextcloud/ownCloud上传大于512MB的文件的相关配置

Posted by 橙叶 on Sun, Oct 29, 2017

在正常情况下,Nextcloud的默认的最大上传限制为512MB,在你的的文件系统和操作系统允许的前提下,你可以提升这一限制。换一种说法,能上传的最大文件的大小还取决于你的浏览器和操作系统:

[ssbluelist]

  • 32位系统可上传小于2GB的文件
  • IE6~IE8可上传小于2GB的文件
  • IE9~IE11可上传小于4GB的文件
[/ssbluelist]

在64位系统中允许上传更大的文件,具体能上传多大仍然取决于你的操作系统的版本。

[infobox]使用Nextcloud sync 客户端可以无视这个上传限制,因为这个客户端会将文件切分后上传。[/infobox]

 

系统设置

[ssbluelist]

  • 确保所安装的PHP的版本在5.6.6以上,推荐使用最新版本的PHP
  • 禁用用户配额:将所有用户的配额设置为“无限制”
  • 对服务器的要求:临时文件空间(/tmp目录)和分区必须足够大以承载多个用户的多个并行上传,如果最大上传的限制为10GB,而约有100个用户(一般达不到这个数量)同时上传文件,那么至少要有100×10GB的空间来容纳临时文件(这儿牵涉到Linux的临时文件的分区)
[/ssbluelist]

配置你的网站服务器

[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(缓冲区大小)
[/ssbluelist]

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;
[/ssbluelist]

[infobox]确保client_body_temp_path指向具有足够空间的上传文件大小的分区,并且与upload_tmp_dir或temp目录(见下文)为相同的分区。为了获得最佳性能,最好将它们放在专用于交换和临时存储的单独的硬盘驱动器上。[/infobox]

如果Nginx作为反向代理服务器,那么还会有这样两项配置与之有关:

[ssbluelist]

  • proxy_buffering
  • proxy_max_temp_file_size
[/ssbluelist]

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