解决宝塔面板 Nginx + PHP7.1 上传文件 404错误
前几天把网站迁移了一下,WEB 环境也从 lnmp 的一键脚本换成了宝塔面板。
今天突然发现无法上传大文件。
具体表现为:
- 小于 500KB 的文件可以上传
- 长时间的等待,最后返回 404 错误。
排查过程
首先想到的是 PHP 的配置问题。然后就进宝塔后台看了一眼 PHP 的相关设置,如下图。
PHP 的配置看起来很正常,并没有什么问题。
然后又想到了是不是 Nginx 的配置有问题?然后又看了 Nginx 的配置文件。如下:
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server
{
listen 888;
server_name www.bt.cn;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}
这里似乎也没什么异常?
这就比较难受了。
然后又去看了一眼 Nginx 的错误日志,也并没有发现不对的地方。唯一一处异常是:
[error] 16567#0: *366561 upstream prematurely closed connection while reading response header from upstream, client: 0.0.0.0, server: xxx.xxx.xxx, request: "POST /wp-admin/media-new.php HTTP/2.0", upstream: "fastcgi://unix:/tmp/php-cgi-71.sock:", host: "demo.nicetheme.xyz", referrer: "https://xxx.xxx/wp-admin/media-new.php"
找不出问题,场面一下子就变得紧张了起来。
万般无奈之下,Google 了一下相关关键词。有用的结果并没有。
唯一一个状况和我一样的,说是需要在 Nginx 的配置文件里边引入 proxy.conf 。但是我本身就是引入的啊!!!
何解?
解决
在 Google 上虽然没有找到解决办法,但是给到了一些提示。于是我看了下 proxy.conf 这个文件,发现这行配置:
client_body_buffer_size 512k;
试着把它修改为:
client_body_buffer_size 50m;
然后重启了 Nginx。
然后、然后就可以了?
我是谁?我在哪?我在做什么?
评论 (9)
:good: 大米竟然会更新网站了...
没事的时候乱更...
为什么我改了还是传不了 呢
估计是我们的情况不一样。 你可能得另外想办法。
:ku: 大米竟然会更新网站了...啧啧啧
谢谢大佬解决我的问题
催更 :good:
client_max_body_size 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中,在哪个临时文件中呢?
client_body_temp 指定的路径中,默认该路径值是/tmp/.
所以配置的client_body_temp地址,一定让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。
这个问题我们遇到过。
20648 open() "/usr/local/openresty-1.9.7.5/nginx/client_body_temp/0000000019" failed (13: Permission denied)
/usr/local/openresty-1.9.7.5/nginx/client_body_temp/这个文件夹权限改为执行Nginx的用户群组就可以解决。
也就是说你通过这个设置把它从临时文件改到了内存中,在高并发时会有一些压力。然后请检查临时文件写入问题,如权限,磁盘空间等