问题描述: 公司ios和Android客户端时有上传图片失败的情况,经过测试确认只有大文件上传失败。
nginx.conf 配置
#user nobody;
worker_processes 4; # 进程数,建议跟CPU核数相同
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 65535; # origin is 1024
multi_accept on;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8; # 头文件中的默认的字符集
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
server_names_hash_bucket_size 1280;
client_header_buffer_size 1280m;
large_client_header_buffers 4 1280m;
client_max_body_size 1000m; # 允许客户端请求的最大单文件字节数
client_body_buffer_size 2560m; # 缓冲区代理缓冲用户端请求的最大字节数
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10; # 原始值为 65
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k; # 缓存文件夹大小
proxy_temp_path /tmp/proxy_temp_dir; # 缓存目录
proxy_cache_path /tmp/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=7d max_size=2g;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/javascript application/xml application/xml+rss;
include conf.d/*.conf;
}
一、 故障原因
- 当上传的文件大于 “proxy_temp_file_write_size“ 设置的值时,nginx会先将文件写入“proxy_temp_path ”缓存目录(默认为nginx安装目录下/proxy_temp目录)
- 3服务器没有创建 /tmp/proxy_temp_dir 目录
- 4服务器 /tmp/proxy_temp_dir nobody用户没有写权限
二、 解决步骤
- 3 服务器:创建 /tmp/proxy_temp_dir 更改拥有者为nobody
- 4 服务器:/tmp/proxy_temp_dir 更改拥有者为nobody
- nginx 重启 问题解决
三、 注意事项
- nginx 如果开启缓存参数,当前运行nginx的用户对两个参数设置的目录和上层目录一定要有写入权限。
- proxy_temp_path
- proxy_cache_path