白屏不等于程序崩了,这句话我大概说过几百遍。同样一个「网站打开后是空白」的现象,底下可能是十几种完全不同的原因:服务器压根没接客、接了但一个字没吐、吐了内容但浏览器不敢渲染,也可能是域名根本没指到你以为了的那台机器。你要是上来就翻 index.php,多半在错误的地方找钥匙,翻半天还容易把本来好的代码改坏。

网站打开后是空白,先分清「没应答」和「答了但空」
浏览器上看着都是白,实际差别大了。按 F12 打开网络面板,找到那条主请求:看它是转了老半天最后 failed,还是 200 回来但响应体一片空。前者往网络、防火墙、DNS 那边想,后者往 PHP、模板、输出缓冲那边想。这一步花不了两分钟,能省掉后面一堆瞎猜。
命令行更快:curl -I https://你的域名 。返回 200 加 Content-Length: 0,说明后端跑完了什么都没输出;502 或 504 是另一回事,php-fpm 或后端超时;要是直接报 curl: (52) Empty reply from server,那 web 服务本身可能就没在正常接客,或者中间某台设备把连接掐了。三种结果,三个方向。
一条 curl 顶得上十次刷新
curl -sS -o /tmp/a.html -w “%{http_code} %{size_download}\n” https://你的域名 —— 状态码和下载字节数一起出来。字节数是 0 或者只有一丁点,基本能确认是后端没输出。再跑一次加 –compressed 的,两次结果差很多,那问题大概率出在 gzip 那一层,压缩开了但内容没配好,浏览器收到的东西解不出来,就白给你看。
这一步还有个额外好处:绕开浏览器缓存和插件。有时候你清了三遍缓存还是白,别人打开却正常,那说明问题根本不在服务器。curl 拿到的是最原始的响应,用它当基准,后面所有对比才有意义。
200 回来但正文是空,八成在这三个地方
第一种,PHP 抛了致命错误,偏偏 display_errors 是 Off。生产环境都关着,报错就写进日志里,页面上一点提示都没有,白白一片。临时验证可以在入口文件加两行 ini_set(‘display_errors’,1); error_reporting(E_ALL); 看一眼,看到报错马上改回来,别长期开着。
第二种,主题或插件挂掉,尤其是刚更新过、刚装过新插件之后。WordPress 的话打开 wp-config.php,把 WP_DEBUG 和 WP_DEBUG_LOG 打开,日志会落到 wp-content/debug.log。第三种比较阴,opcache 里还留着旧代码,文件改了但跑的还是老版本,重启一下 php-fpm 再试。
日志要看两个地方,别只盯 nginx
nginx 的 error.log 记的是它自己的问题,php-fpm 的日志记的是 PHP 那边的。宝塔一般在 /www/wwwlogs/ 底下,php-fpm 的慢日志在 /www/server/php/版本号/var/log/ 这类路径,不同版本放的位置不完全一样,找不到就翻面板里的日志页面对一下。看日志有个细节,服务器时区常是 UTC,你本地晚上八点出事,日志里可能是中午十二点,时间对不上就容易找错那一条。
access.log 里那条主请求也值得看:状态码 200 但 body 很小、或者出现 499,都有意思。499 是客户端先断开,说明浏览器等不下去自己撤了,这往往指向响应太慢——不是「没有内容」的白,是白等一场的那种白。
502 和 504 也会白给你看,但查法反着来
502 大多是 php-fpm 没起来、进程池满了、或者 nginx 配的 upstream 端口对不上。504 是等超时,后端卡住了,常见于数据库连不上、外部接口一直不返回。这两个都不是「程序崩了」,别拿查代码的劲头去查它们,白费力气。
换主题、停插件这种笨办法,往往最快
听着土,但二分法确实好使。先备份,把主题切回默认的,插件目录整个改名让它们全部失效,再打开看白不白。白了就说明是那堆东西里的某一个,一半一半往回加,几轮就定位到了。流量高峰别折腾,挑人少的时候做。
还有一种特别容易被忽略的:文件编码里带了 BOM,或者 <?php 前面多了空行和空格。header 发不出去,但又不一定报错,页面就那么空着。这类问题本地测不出来,因为本地 display_errors 常常是开的,一上传就变白。
DNS、证书、CDN,这几个也会演出白屏
域名解析还指着旧服务器,新机器上什么都没有,打开当然白。证书过期浏览器给的是警告页,不是白屏,这俩得分开。CDN 也爱掺和:回源失败的时候,有些节点返回的是 200 加一个空 body,看着特别像程序问题,得去翻回源日志才知道真相。
顺手说个老坑,https 强制跳转配好了,但源站那台机器其实没装证书,或者只监听 80。跳过去之后握手失败,用户看到的就一片白或者干脆超时。这种在 curl 里会报 SSL 相关错误,一看便知。
浏览器那一端也别放过
缓存、扩展拦截、内容编码头对不上、正文被 JS 提前清空、CSP 拦了脚本,都有可能。用无痕窗口加禁用扩展对比一次,Ctrl+F5 强制刷新一次,两种结果不一样,那就是本地环境的事,服务器没毛病。
真按顺序来,就四步:先 curl 看状态码和字节数,再开浏览器网络面板确认是不是同一回事,接着翻 nginx 和 php-fpm 两边的日志,最后才动文件——切主题、停插件、开调试。顺序别倒,倒了就是拿时间换教训。改之前备份,改完记得把调试开关关回去。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!