nginx+php上传大文件问题

公司后台要做大文件上传想到的。
在http里上传的文件是以二进制形式存放在post请求的body里的,那么nginx是接受完整个post再发送给fastcgi吗?还是和fastcgi建立完连接就直接塞过去?
如果是前者的话,所谓的上传超时是nginx的超时?毕竟本地的fastcgi应该是很快的才对。
如果是后者的话,那nginx本身有控制post大小的设置,它是如何保证post大小的,content-length?

阅读 2k
1 个回答

超时有两种情况:

1、Nginx与fastcgi通信超时

Nginx与后端PHP通过fastcgi协议通信,会有超时时间设置,从请求连接建立,到指定时间一次请求还没完成,就会超时。

Nginx超时配置一般有:

fastcgi_connect_timeout 
fastcgi连接超时时间,默认60秒

fastcgi_send_timeout 
nginx 进程向 fastcgi 进程发送请求过程的超时时间,默认值60秒

fastcgi_read_timeout 
fastcgi 进程向 nginx 进程发送输出过程的超时时间,默认值60秒 

2、PHP脚本执行超时

当Nginx通过fastcgi连接到后端的php-fpm后,后面要执行PHP脚本,如果脚本执行时间过长。比如,文件太大,网速太慢,导致PHP执行时间超过了预设时间。

PHP执行超时时间一般是:max_execution_time,可以通过set_time_limit(20);语法设置超时时间。

POST数据时,请求体的长度确实是由Content-Length来控制的。Nginx会先解析请求头,找到请求体的长度,之后接受指定长度的内容。如果你写代码实现post请求,将content-length设置一个比较小的数字,会发现,接收方接受的数据会被截断。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题