Nginx配置
在nginx.conf 添加如下配置即可解决。
bash
sendfile on;
keepalive_timeout 65;
client_max_body_size 20M;
client_header_buffer_size 16k;
gzip_http_version 1.1;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6] .";
gzip_vary on;
gzip on;
gzip_min_length 1000;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
Nginx配置片段主要涉及文件传输优化、连接管理、请求体限制、请求头缓冲以及响应压缩五大核心功能。以下是逐项解析:
- 文件传输与连接管理
sendfile on;
启用高效文件传输模式(零拷贝技术),直接将文件从磁盘复制到Socket缓冲区,减少上下文切换和内存拷贝次数,显著提升静态文件(如图片、视频)的传输性能。
keepalive_timeout 65;
设置客户端连接保持活动状态的最长时间为65秒。长连接可减少重复TCP握手开销,但需平衡服务器资源占用(如并发连接数)。 - 请求体与头限制
client_max_body_size 20M;
限制客户端请求体(如上传文件、POST数据)的最大大小为20MB。若超过此值,服务器返回413 Request Entity Too Large错误(与您之前的提问直接相关)。
client_header_buffer_size 16k;
设置客户端请求头的缓冲区大小为16KB。用于处理包含较大头字段(如长URL、多Cookie)的请求,避免因缓冲区不足导致400错误。 - 响应压缩(Gzip)
gzip on;
全局启用Gzip压缩功能,减少响应体体积,提升页面加载速度。
gzip_http_version 1.1;
仅对HTTP/1.1及以上版本的请求启用压缩(HTTP/1.0默认不支持)。
gzip_proxied expired no-cache no-store private auth;
控制对代理请求的压缩行为:
expired:已过期的缓存内容仍压缩
no-cache/no-store:禁止缓存的内容仍压缩
private:仅客户端缓存的内容仍压缩
auth:需认证的内容仍压缩
gzip_disable "MSIE [1-6] .";
禁用对旧版IE浏览器(IE1-6)的压缩,因其可能无法正确处理压缩内容。
gzip_vary on;
添加Vary: Accept-Encoding响应头,告知缓存服务器和代理需根据客户端支持的压缩格式缓存不同版本,避免缓存污染。
gzip_min_length 1000;
仅对大于1000字节(1KB)的响应体启用压缩,避免小文件压缩开销超过收益。
gzip_comp_level 5;
设置压缩级别为5(1-9级,值越高压缩率越高但CPU消耗越大),平衡压缩效率与资源消耗。
gzip_buffers 4 16k;
分配4个16KB的缓冲区(共64KB)用于存储压缩后的数据,避免压缩过程中频繁申请内存。
gzip_types ...;
指定启用压缩的MIME类型列表,包括:
文本类:text/plain、text/css、text/javascript、application/xml
脚本类:application/x-javascript、application/x-httpd-php
图片类:image/jpeg、image/gif、image/png(注:图片本身已压缩,二次压缩收益有限,但Nginx仍会尝试)