这里是文章模块栏目内容页
php+nginx环境上传大文件经常出现502错误怎么解决?

本文描述的应用场景:

php做后端语言,处理手机端上传文件,采用nginx服务器代理php-fpm的9000端口,进行fastcig模式的搭配。首先出现问题后,第一想到的是php的php.ini配置文件是否支持了大文件上传即参数:

#php运行的最大内存 
memory_limit = 1024M
#php最大执行超时时间,0表示不超时,建议设置 一个大值例如600秒。这里0用于测试。
#0很危险不超时如果出现php的代码问题,就导致服务器宕机,例如 把0作为被除数。一个while死循环等;
max_execution_time = 0  
#最大接收post 数据大大小
post_max_size = 5000M 
#最大允许上传的文件大小
upload_max_filesize = 5000M

这里设置的值都比较大,用于测试,通常安装php推荐的参数,比他略大即可,

如果服务器的硬件性能的确比较好,可以把内存设置更大。


但是以上的参数修改,只能解决可以上传大文件。没有解决 文件超过100M后,由于采用非wifi网络,传输过程中,容易中断,服务器出现 502响应的情况,怎么办呢?


这里通过查看php-fpm的日志,和 nginx-error.log的日志找到了原因:

首先看 nginx的错误日志

错误日志:
2020/11/24 11:44:29 [error] 8541#0: *24396 writev() failed (32: Broken pipe) while sending request to upstream, 
client: 117.136.99.170, server: test1.nginx.com, 
request: "PUT /remote.php/webdav/电影/IMG_0605.MOV HTTP/1.1",
upstream: "fastcgi://unix:/home//tmp/php-cgi.sock:", host: "116.12.73.30:81"

看这个日志,可以初步判定是php-fpm 出现的错误,因为 

writev() failed (32: Broken pipe) while sending request to upstream

这一句里面 有个upstream 单词,在我们配置nginx 虚拟主机一节,php-fpm 就是通过这个和nginx工作的;

所以,自然的就去看php-fpm的错误日志;


下面是php-fpm的错误日志:

[24-Nov-2020 11:44:29] WARNING: [pool www] child 14927, script '/home/www/remote.php'
 (request: "PUT /webdav/电影/IMG_0605.MOV") execution timed out (303.701764 sec), terminating
[24-Nov-2020 11:44:29] WARNING: [pool www] child 14927 exited on signal 15 (SIGTERM) 
after 640.353034 seconds from start
[24-Nov-2020 11:44:29] NOTICE: [pool www] child 15614 started
[24-Nov-2020 11:45:19] WARNING: [pool www] child 14931, script '/home/www/remote.php' 
(request: "PUT /webdav/电影/IMG_0605.MOV") executing too slow (37.696823 sec), logging
[24-Nov-2020 11:45:19] NOTICE: child 14931 stopped for tracing

这里有两警告信息:一个是  

execution timed out (303.701764 sec),

执行超时 ,执行了303.7秒,超时了。接着php-fpm的处理进程退出了执行:

child 14927 exited on signal 15 (SIGTERM) 
after 640.353034 seconds from start
executing too slow (37.696823 sec),

上面一条是 php处理比较耗时的记录。


最后找到 php-fpm.conf 这个配置文件进行参数调整。

pm.max_children = 80
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 80
request_terminate_timeout = 600
request_slowlog_timeout = 30
slowlog = var/log/slow.log
pm.status_path = /status

把 

request_terminate_timeout 的值从300 调整为 600

pm.max_children = 80
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 80

php-fpm的服务器进程数增多 。最后测试,问题解决了。


以上就是处理nginx 和php-fpm 大文件上传经常返回502 响应的办法。希望能帮助到您。