0
点赞
收藏
分享

微信扫一扫

Nginx/PHP文件上传限制说明

0、背景说明

通过PHP程序上述文件时,是否有限制取决多个因素,注意这里表述的是“是否有限制”, 这里的限制不光是常认为的大小的限制 ,还有上传时间的限制。 另外除了PHP服务本身之外,一般也和 PHP 上层的 代理集群有关系,常见的代理集群是 Nginx/Openrestry

1、关于代理集群限制上传

代理集群这里以常用的 Nginx 为例介绍

1.1、client_max_body_size

默认为1M,可以配置在 http 或者 server 、location 中。

一般的建议是配置在 具体的server中,因为nginx支持多server,每个server的功能不同,对于如果有上传需求时,上传的大小限制也许也不一样。

1.2、client_body_timeout

默认值是60秒,需要注意的是这个参数的含义:

Nginx的 client_body_timeout控制的仅仅是 请求主体 body 的传输时间。

所以如果在上传大文件的时候,客户端配置超时时间大于60秒,且实际上传时间也超过了60秒,上传的请求并不会中断。

Nginx 会继续等待客户端发送请求的其余部分,即使超过了client_body_timeout的设置。

只有当整个请求完成或客户端关闭连接时,NGINX才会终止该请求

1.3、client_header_timeout

读取请求头的超时时间,默认为60秒,和上面 client_body_timeout 读取body体一样,仅读取 header头部的时间。

从上面三个参数知道,Nginx 侧实际限制文件上传时,只限制文件的大小,不限制文件上传的时长

如果要限制文件的时长:

1)通过后端服务,比如PHP的 max_execution_time

2)通过客户端ajax请求配置timeout超时

附加配置项说明:

● proxy_connect_timeout

Nginx转发到后端的请求无法被立即处理时,被放到Nginx的待处理池中等待被处理的时间,默认为60秒。

● proxy_read_timeout

Nginx请求被后端处理后。Nginx等待后端处理结果的等待时间,默认为60秒。也就是服务器的响应时间

● proxy_send_timeout

Nginx请求被后端处理后,后端把数据返回给Nginx的时间,默认60秒。

2、关于PHP上传文件限制

PHP侧限制文件上传,一共有三个参数共同决定

2.1、max_execution_time

页面最的长执行时间,默认为30秒。 即使页面上传时设置超时时间超过这个值,30秒之后也会中断请求,页面报错。

配置为0,表示不做时间限制

2.2、post_max_size

定义POST上传数据时最大可上传的大小,默认为2M。

如果实际POST过来的数据大于该值,则 $_POST和 $_FILES 这两个全局变量就为空值。

2.3、upload_max_filesize

定义上传文件时可接受的文件大小的最大值。默认为8M。这个根据实际业务场景配合Nginx进行调整

和文件上传有关的配置项说明:

● file_uploads = On 开启文件上传

● post_max_size = 50M 最大Post数据大小

● upload_max_filesize = 50M 最大上传文件大小

● upload_tmp_dir = '/tmp/phpupload' 上传时临时目录,默认为空,系统指定

● max_execution_time = 120 单个PHP脚本在服务器最大执行时间,单位为秒

● max_input_time = 120 PHP脚本从客户端接受请求数据的最大时间,这个时间包含了POST、GET和文件上传等数据

● memory_limit = 100M 单个PHP脚本能申请到的最大内存空间

3、前端配置的上传文件时间限制

一般是在ajax请求中设置timeout属性来设置上传的超时时间限制

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>测试超时响应</title>
    <script src="./js/jquery/jquery.js"></script>
  </head>
  <body>
    <button>发起超长时间请求</button>
    <script>
      document.querySelector('button').onclick = function() {
        $.ajax({
          url: 'http://127.0.0.1:8080/uploadBigFile',
          // 通过timeout属性设置超时,单位是毫秒
          timeout: 120000,
          error: function(err) {
            console.log(err)
          },
          success: function(res) {
            console.log(res)
          }
        })
      }
    </script>
  </body>
</html>

所以在排查完毕 Nginx、PHP服务本身确认上传限制都在合理的范围之内还有超时报错那么很大可能是 客户端做了 timeout 超时限制

Nginx/PHP文件上传限制说明_upload_max_filesize

DailyJobOps

举报

相关推荐

0 条评论