Apache2+PHP大文件上传失败:出现caught SIGWINCH日志及上传错误码1
Apache2+PHP大文件上传失败:出现caught SIGWINCH日志及上传错误码1
看起来你碰到的是大文件上传里很常见的配置遗漏问题,结合错误码1和Apache日志里的SIGWINCH信息,咱们一步步来解决:
先搞懂错误码1到底是什么意思
你看到的Error in file upload: 1对应的是PHP的UPLOAD_ERR_INI_SIZE常量——说白了就是你上传的文件大小超过了php.ini里upload_max_filesize的限制。你已经设置了post_max_size=20G,但这个参数管的是整个POST请求的总大小(包括文件和其他表单数据),而upload_max_filesize是单独限制单个上传文件的大小,而且它的值必须小于等于post_max_size才行。
补全PHP里的关键配置
打开你的/etc/php/8.1/apache2/php.ini,检查并修改这几个参数:
upload_max_filesize = 20G(和post_max_size保持一致,确保能装下3.4G的文件)max_execution_time = 300(上传大文件肯定需要更长时间,默认60秒大概率不够,改成5分钟以上都没问题)max_input_time = 300这个是限制PHP处理输入数据的时间,同样得调大memory_limit = 512M(避免上传过程中内存不够用,根据你的服务器配置来,至少得比单文件大小的一半多)
调整Apache的请求限制
Apache本身也有自己的大小和超时限制,这些会直接影响上传:
- 打开Apache的主配置文件(比如
/etc/apache2/apache2.conf)或者你的虚拟主机配置文件,添加或者修改:LimitRequestBody 21474836480 # 这是20G对应的字节数,1G=1073741824字节 Timeout 600 # 把超时时间改成10分钟,保证大文件能传完 - 至于日志里的
caught SIGWINCH,这个信号一般意味着Apache进程被意外终止了,很大概率是上传大文件时内存占用太高,或者进程超时被系统杀掉。你可以去看看Apache的MPM配置(比如/etc/apache2/mods-available/mpm_prefork.conf),调整一下进程数避免内存过载:
这些参数根据你的服务器内存来调,比如内存小的话就降低StartServers 4 MinSpareServers 2 MaxSpareServers 8 MaxRequestWorkers 32 MaxConnectionsPerChild 1000MaxRequestWorkers,别让同时处理太多大文件上传把内存耗光。
验证配置并重启服务
- 你可以执行
php -i | grep -E "upload_max_filesize|post_max_size"来确认PHP的配置有没有生效,或者在你的PHP页面里写个phpinfo()查看实际生效的参数。 - 最后重启Apache服务:
sudo systemctl restart apache2
额外排查点
如果还是不行,再检查这两个地方:
- 服务器的磁盘空间够不够,还有你代码里的目标路径
/opt/upload/有没有写入权限(注意你代码里输出的是传到/tmp,但实际路径是/opt/upload/,别搞混了) - 如果有防火墙或者反向代理服务器(比如Nginx),看看它们有没有额外的大小限制
备注:内容来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

