一、问题背景
今日运维人员告知我,突然网站的登录页访问变白屏,我登录后台发现服务一切正常,Nginx也正常运行,我尝试访问网站登录页,并连点十几次会访问正常,之后就会正常,但是登录以后也会某些页面存在白屏状态,查看浏览器请求发现某些JS、CSS文件没有正常返回,Nginx的访问日志出现206等问题,想到前几天刚续费了HTTPS的域名证书,证书也换过了,然后切换到内网HTTP发现正常,猜想应该是Nginx中的HTTPS的配置有问题,缓存类配置可能存在问题。
二、问题现象
总结出现以下异常:
- HTTPS访问登录页白屏,连续刷新20次后偶现正常;
- HTTP内网访问正常,无异常;
- 浏览器开发者工具显示:大体积JS文件(如
chunk-vendors.js)加载失败,状态码为206 Partial Content; - Nginx访问日志记录:
arduino
体验AI代码助手
代码解读
复制代码
10.xx.xxx.90 - - 443 [25/Oct/2025:17:40:20 +0800] "GET /js/chunk-vendors.6112ac08.js HTTP/1.1" 206 1 "https://xxxx/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
三、问题定位与根因分析
1. 核心问题:Nginx代理缓冲区不足
(1)Nginx代理工作原理
当Nginx作为反向代理时,其处理上游响应的流程如下:
- 接收后端服务返回的响应数据;
- 将数据缓存到内存缓冲区中;
- 若缓冲区不足,则将数据写入临时文件(
proxy_max_temp_file_size控制); - 最终将数据发送给客户端(浏览器)。
(2)默认配置的限制
Nginx默认配置的缓冲区大小为:
nginx
体验AI代码助手
代码解读
复制代码
proxy_buffer_size 4k|8k; # 响应头缓冲区 proxy_buffers 8 4k|8k; # 响应体缓冲区(数量 × 大小) proxy_busy_buffers_size 8k|16k; # 忙碌时可发送的最大缓冲区
- 总缓冲容量:
8 × 4k = 32KB,不足以承载1~2MB的前端资源; - HTTPS加重问题:TLS加密/解密消耗更多CPU资源,导致缓冲区更容易被撑满;
- 206状态码的含义:
Partial Content,表示响应未完整传输,Nginx在临时文件写入过程中可能因超时或中断导致加载失败。
(3)为何HTTP正常?
HTTP无需加密,Nginx处理速度更快,缓冲区在短时间内能完成数据传输,因此未触发问题。