本文描述的应用场景:
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 响应的办法。希望能帮助到您。