调整post_max_size至128M后遇502错误,求PHP-FPM+Nginx配置方案
问题解答
1. 修改post_max_size时需同步调整的关键参数
当你把post_max_size调至128M时,必须同步调整以下参数才能避免502等错误:
upload_max_filesize(php.ini):该值不能超过post_max_size,建议设为128M,否则大文件上传会被PHP直接拦截。memory_limit(php.ini):PHP进程处理大文件上传需要足够内存,必须大于post_max_size,比如设为256M或更高——你遇到的子进程退出码70,大概率是进程因内存不足崩溃导致的。max_input_time(php.ini):设置PHP处理请求输入的最长时间,大文件上传耗时久,建议设为600秒(10分钟)或更长,默认值通常无法满足大文件上传需求。client_max_body_size(Nginx配置):必须与post_max_size保持一致(128M),否则Nginx会先于PHP拦截超大请求,直接返回413错误。fastcgi_read_timeout(Nginx配置):设置Nginx等待PHP-FPM响应的最长时间,需大于文件上传所需时间,建议设为600秒。request_terminate_timeout(PHP-FPM pool配置):该参数是PHP-FPM进程的强制超时时间,优先级高于max_execution_time,需设为比max_input_time更长的值,比如720秒,避免进程在上传完成前被强制终止。
2. PHP-FPM + Nginx 配置调优方案
PHP-FPM 调优
- 进程池参数:
pm.max_children:根据服务器CPU核心数和内存设置,比如CPU核心数×2~4。假设8核CPU、32G内存,每个PHP进程占50M内存,可设为400左右,避免过多进程耗尽内存。pm.start_servers:设为max_children的1/4,比如100,保证启动时的基础进程数。pm.min_spare_servers/pm.max_spare_servers:分别设为max_children的1/8和1/2,比如50和200,维持合理的空闲进程数,避免频繁创建销毁进程。pm.max_requests:设置每个进程处理N次请求后重启,避免内存泄漏,建议设为1000~5000。
- 日志监控:开启
slowlog并设置request_slowlog_timeout(比如10秒),记录慢请求,方便排查上传卡顿或超时问题。
Nginx 调优
- 客户端请求处理:
client_body_buffer_size:设置请求体缓冲区大小,比如16M,减少大文件上传时的磁盘IO操作。client_body_timeout/client_header_timeout:设为600秒,避免上传过程中因超时断开连接。
- FastCGI 交互:
fastcgi_buffer_size/fastcgi_buffers:比如设为16k和4 16k,根据服务器内存调整,提升PHP响应的缓冲效率。fastcgi_temp_file_write_size:设置临时文件单次写入大小,比如32M,避免磁盘IO瓶颈。
- 基础连接配置:
worker_processes:设为CPU核心数,充分利用多核资源。worker_connections:设为10240或更高,支持更多并发连接。
3. 核心参数的最大值说明
post_max_size/upload_max_filesize:理论上无硬性上限,受服务器可用内存和操作系统文件大小限制,实际可设到1G甚至更大,但建议不超过服务器可用内存的1/4,避免内存耗尽。memory_limit:可设为-1(无限制),但极度不推荐,实际最大值建议根据服务器内存调整,比如32G内存可设为4G~8G。max_execution_time/max_input_time:可设为0(无限制),但不建议,实际最大值可设到3600秒(1小时),满足大文件上传需求。pm.max_children:无固定最大值,由服务器内存决定,按每个PHP进程占用20~200M内存估算,确保系统和其他服务有足够内存剩余。client_max_body_size:理论上无上限,受操作系统内核参数(如fs.file-max)和内存限制,实际可设到1G以上,需配合其他参数同步调整。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

