网站打不开时状态码怎么看?200、403、404、502、504 的基础判断方法

网站打不开时,很多人第一反应是“服务器是不是宕机了”。但从运维角度看,打不开并不等于服务器坏了,更准确的判断入口应该是:先看浏览器或请求返回了什么 HTTP 状态码。
同样是访问失败,403 可能是权限或安全策略拦截,404 可能是路径或伪静态问题,502 往往和后端服务异常有关,504 则更多指向超时、程序慢、数据库慢或上游无响应。甚至有时候状态码是 200,页面却是空白,这反而说明请求已经成功到达,只是页面内容、前端资源或程序输出出了问题。
下面我会按真实服务器排障思路,把 200、403、404、502、504 这几个常见状态码拆开讲清楚。
一、先看状态码在哪里看,不要只看浏览器提示
很多用户只看到浏览器显示“无法访问此网站”“页面打不开”,但这些提示不够准确。建议先用下面几种方式确认状态码。
1. 浏览器开发者工具查看
在 Chrome 浏览器中按:
F12 → Network → 刷新页面 → 查看第一个文档请求
重点看这几个字段:
| 字段 | 作用 |
|---|---|
| Status | HTTP 状态码,例如 200、403、404、502 |
| Type | 请求类型,例如 document、css、js、xhr |
| Size | 是否真正返回了内容 |
| Time | 响应耗时,判断是否慢或超时 |
| Response Headers | 判断状态码来自 CDN、Nginx 还是后端程序 |
如果首页主请求就是 502,通常是后端服务问题。
如果首页是 200,但 CSS、JS、图片大量 404,页面就可能显示错乱或空白。
2. 用 curl 命令看状态码
在本地电脑或服务器上执行:
curl -I https://www.example.com
示例返回:
HTTP/2 502
server: nginx
content-type: text/html
如果想看完整访问过程,可以用:
curl -I -L https://www.example.com
-L 会跟随 301、302 跳转,适合排查 HTTP 跳 HTTPS、www 跳主域名等问题。
3. 对比 CDN 前后状态码
如果网站用了 CDN,建议分别测试:
curl -I https://www.example.com
curl -I --resolve www.example.com:443:源站IP https://www.example.com
第二条命令可以绕过 DNS 解析,直接把域名指向源站 IP,判断问题到底在 CDN 还是源站。
二、200:状态码正常,但页面还是打不开
200 表示服务器已经成功响应请求,但这并不代表页面一定正常。
常见情况包括:
| 表现 | 可能原因 |
|---|---|
| 状态码 200,但页面空白 | PHP 报错、模板输出为空、前端 JS 异常 |
| 首页 200,但样式全乱 | CSS、JS、图片资源 404 或跨域失败 |
| 返回 200,但内容不是预期页面 | CDN 缓存错页面、伪静态规则错误、默认站点指错 |
| 返回 200,但页面加载很慢 | 程序查询慢、数据库慢、外部接口阻塞 |
重点排查方向
1. 看页面源代码是否有内容
浏览器右键查看源代码,如果源代码为空或只有少量 HTML,说明后端程序没有正常输出。
2. 检查 PHP / 程序错误日志
Nginx + PHP-FPM 环境常看:
tail -f /www/wwwlogs/example.com.error.log
tail -f /www/server/php/82/var/log/php-fpm.log
Laravel 项目可以看:
tail -f storage/logs/laravel.log
WordPress 可以临时开启:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
3. 检查静态资源是否加载失败
打开浏览器开发者工具,看是否有大量:
404 css
404 js
403 font
如果主页面 200,但资源文件异常,用户看到的页面依然可能像“打不开”。
适合的服务器配置建议
如果是企业官网、WordPress、ZBlog、Laravel 后台这类业务,建议使用:
| 配置项 | 推荐配置 |
|---|---|
| CPU | Intel E-2334 / E-2434 |
| 内存 | 32GB |
| 硬盘 | 960GB NVMe SSD |
| 带宽 | 30M CN2 / CMIN2 / CU 优化线路,或 100M BGP |
| 系统 | Ubuntu 22.04 / CentOS 7.x |
| 环境 | Nginx + PHP 8.2 + MySQL 8.0 |
这类配置的优势不是“单纯跑得起来”,而是在 PHP 动态页面、数据库查询、缓存读取、后台管理同时运行时,仍然有足够的 CPU 单核性能和 NVMe 随机读写能力。
三、403:服务器拒绝访问,不一定是网站坏了
403 Forbidden 表示请求到了服务器,但服务器拒绝返回内容。
这类问题最容易被误判成“服务器打不开”,实际上服务器通常是在线的,只是访问权限、规则或安全策略不允许访问。
常见原因
| 场景 | 典型原因 |
|---|---|
| 访问目录出现 403 | 没有 index.html / index.php,且禁止目录浏览 |
| 部分文件 403 | 文件权限不对 |
| 后台登录页 403 | WAF、安全插件、IP 白名单拦截 |
| CDN 返回 403 | CDN 防盗链、Referer、区域访问策略 |
| API 返回 403 | Token、鉴权、签名错误 |
重点检查位置
1. 检查站点默认首页文件
网站根目录应至少有:
index.html
index.php
如果访问根目录没有首页文件,Nginx 又关闭了目录浏览,就会返回 403。
2. 检查文件权限
常见权限建议:
find /www/wwwroot/example.com -type d -exec chmod 755 {} \;
find /www/wwwroot/example.com -type f -exec chmod 644 {} \;
如果是 Laravel,还需要保证这些目录可写:
chmod -R 775 storage bootstrap/cache
3. 检查 Nginx 规则
例如后台被限制了 IP:
location /admin {
allow 1.2.3.4;
deny all;
}
如果当前访问 IP 不在允许列表内,就会直接 403。
深度解决思路
403 不能只看“权限不足”,还要判断是哪一层拒绝:
| 返回层级 | 判断方法 |
|---|---|
| CDN 拒绝 | Response Headers 中看到 CDN 服务商标识 |
| Nginx 拒绝 | error.log 里出现 forbidden |
| 程序拒绝 | 页面样式仍是程序模板,例如 Laravel / WordPress |
| WAF 拒绝 | 特定参数、POST 请求或后台路径才触发 |
如果只有某些地区用户 403,要重点检查 CDN 区域访问策略、防火墙国家地区限制、源站安全组策略。
四、404:路径不存在,重点看目录、路由和伪静态
404 Not Found 表示服务器没有找到对应资源。
很多 404 不是文件真的不存在,而是请求路径没有被正确转交给程序处理。
常见原因
| 场景 | 可能原因 |
|---|---|
| 首页正常,文章页 404 | 伪静态规则缺失 |
| 后台页面 404 | 路由未配置或部署目录错误 |
| 图片 404 | 上传目录迁移失败 |
| API 404 | 前端请求路径和后端路由不一致 |
| www 正常,非 www 404 | 站点绑定域名不完整 |
WordPress 常见伪静态
Nginx 可参考:
location / {
try_files $uri $uri/ /index.php?$args;
}
如果缺少这一段,首页可能正常,但文章详情页、分类页全部 404。
Laravel 常见伪静态
Laravel 项目应将运行目录指向:
/public
Nginx 规则通常类似:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
如果网站根目录错误地指向项目根目录,而不是 public,就可能出现首页异常、资源路径异常、路由 404 等问题。
404 的排查顺序
建议按这个顺序看:
- 域名是否绑定到正确站点;
- 网站根目录是否正确;
- 文件是否真实存在;
- 伪静态规则是否匹配程序;
- CDN 是否缓存了旧路径;
- 程序路由是否存在;
- 前端请求地址是否写错。
404 不建议一上来就重启服务器,因为大多数 404 和服务器负载无关,更多是路径、规则、部署目录的问题。
五、502:网关错误,重点查后端服务是否正常
502 Bad Gateway 是网站运维中非常常见的故障码。它通常表示 Nginx 收到了请求,但无法从后端服务拿到正确响应。
如果是 Nginx + PHP-FPM,常见链路是:
用户 → CDN → Nginx → PHP-FPM → PHP 程序 → MySQL
只要 Nginx 到 PHP-FPM 这一段异常,就可能出现 502。
常见原因
| 原因 | 表现 |
|---|---|
| PHP-FPM 停止 | 全站 502 |
| PHP 版本切换错误 | PHP 页面 502,静态文件正常 |
| socket 路径错误 | Nginx 无法连接 PHP-FPM |
| PHP 进程数耗尽 | 高峰期偶发 502 |
| 程序致命错误 | 特定页面 502 |
| 内存不足 | 服务被系统杀掉 |
重点命令
查看 PHP-FPM 状态:
systemctl status php-fpm
宝塔环境可检查对应 PHP 版本:
/etc/init.d/php-fpm-82 status
查看 Nginx 错误日志:
tail -n 100 /www/wwwlogs/example.com.error.log
常见错误类似:
connect() to unix:/tmp/php-cgi-82.sock failed
upstream prematurely closed connection
recv() failed while reading response header from upstream
这些信息比浏览器上的“502”更有价值。
深度解决方案
1. 修复 Nginx 与 PHP-FPM 连接配置
如果 Nginx 配置的是:
fastcgi_pass unix:/tmp/php-cgi-82.sock;
就要确认这个 socket 文件真实存在。
也可以改为 TCP 方式:
fastcgi_pass 127.0.0.1:9000;
前提是 PHP-FPM 监听的也是 127.0.0.1:9000。
2. 提高 PHP-FPM 承载能力
高并发下偶发 502,可能是 PHP-FPM 子进程不够。可以检查:
pm = dynamic
pm.max_children = 80
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
配置不能盲目调大,要结合内存估算。
如果单个 PHP 进程占用 80MB,pm.max_children = 80 理论上可能占用约 6.4GB 内存,还要给 MySQL、Redis、系统缓存预留空间。
3. 使用更适合动态网站的服务器配置
如果网站是 WordPress 多插件、WooCommerce、Laravel 后台、跨境电商独立站,建议不要使用过低配置。
推荐配置:
| 业务场景 | 推荐服务器配置 |
|---|---|
| 企业官网 / 博客 | E-2334 / 32GB / 960GB NVMe / 30M CN2 |
| WordPress 多插件站 | E-2434 / 32GB / 960GB NVMe / 100M BGP |
| 跨境电商独立站 | Gold 6138 / 64GB / 960GB NVMe / CN2 + BGP |
| 高并发 API / 后台系统 | AMD EPYC / 64GB / NVMe / BGP 多线 |
502 的核心不是“服务器重启一下”,而是要确认后端服务是否稳定、PHP-FPM 是否够用、数据库是否拖慢请求。
六、504:请求超时,问题通常比 502 更深
504 Gateway Timeout 表示网关等待上游响应超时。
简单理解:
502 = 后端返回异常或连接失败
504 = 后端一直没返回,等超时了
504 常见于程序慢、数据库慢、接口慢、上传下载耗时过长、源站到 CDN 响应太慢。
常见原因
| 场景 | 可能原因 |
|---|---|
| 后台打开慢后 504 | 数据库查询慢 |
| 提交订单后 504 | 支付接口、库存接口、邮件接口阻塞 |
| 上传大文件 504 | Nginx / PHP 超时时间过短 |
| 高峰期 504 | PHP-FPM 队列堵塞 |
| CDN 504 | CDN 回源到源站超时 |
重点检查
1. 查看 Nginx 超时配置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
如果程序确实需要较长处理时间,可以适当提高:
fastcgi_read_timeout 180s;
proxy_read_timeout 180s;
但这只是缓解,不是根治。
2. 检查 PHP 执行时间
max_execution_time = 120
memory_limit = 512M
如果 PHP 最大执行时间是 30 秒,而 Nginx 等待 180 秒,也没有意义,因为 PHP 已经先退出了。
3. 检查 MySQL 慢查询
开启慢查询日志后,可以分析哪些 SQL 拖慢网站:
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
常见优化方向包括:
- 给查询字段加索引;
- 避免后台列表一次性加载大量数据;
- 分页查询;
- 缓存热门数据;
- 把耗时任务改成队列异步执行。
深度解决方案
504 不应该只靠“加大超时时间”解决。正确思路是:
| 层级 | 优化方向 |
|---|---|
| Nginx | 合理设置 fastcgi / proxy timeout |
| PHP | 控制单次请求执行时间,避免同步执行重任务 |
| MySQL | 慢查询分析、索引优化、连接数优化 |
| Redis | 缓存热点数据,减少重复查询 |
| 队列 | 邮件、通知、导出、同步任务异步化 |
| 服务器 | 提升 CPU、内存、NVMe 随机读写能力 |
如果网站经常在后台操作、订单提交、数据导出时出现 504,说明瓶颈多半已经不在“带宽”,而是在程序执行链路和数据库响应速度上。
七、状态码排障不要只看一个点,要看完整链路
一个网站访问请求通常经过:
用户浏览器
↓
本地 DNS
↓
CDN / WAF
↓
源站 Nginx / Apache
↓
PHP-FPM / Node.js / Java
↓
MySQL / Redis / 外部接口
状态码可能来自任何一层。
所以排查时建议先问三个问题:
1. 是所有用户打不开,还是部分地区打不开?
如果只有国内部分地区异常,可能是 DNS、线路、CDN 节点问题。
如果所有地区都异常,优先查源站服务、Web 服务、程序和数据库。
2. 是首页打不开,还是某个页面打不开?
首页异常通常影响较大。
某个页面异常,则更可能是路由、权限、数据库查询、插件或特定接口问题。
3. 是静态文件正常,动态页面异常吗?
可以分别测试:
curl -I https://www.example.com/test.html
curl -I https://www.example.com/index.php
如果静态文件正常,PHP 页面 502/504,说明 Nginx 大概率没问题,重点查 PHP-FPM 和程序。
八、常见状态码快速判断表
| 状态码 | 表面含义 | 重点判断 |
|---|---|---|
| 200 | 请求成功 | 页面空白、资源异常、程序输出错误 |
| 403 | 禁止访问 | 权限、WAF、IP 白名单、防盗链 |
| 404 | 页面不存在 | 路径、伪静态、站点目录、程序路由 |
| 502 | 网关错误 | PHP-FPM、后端服务、socket、进程崩溃 |
| 504 | 网关超时 | 慢查询、程序阻塞、接口超时、回源慢 |
九、推荐的服务器与环境组合
对于常见官网、博客、外贸站、后台系统,建议至少采用下面这种基础组合:
CPU:Intel E-2334 / E-2434
内存:32GB
硬盘:960GB NVMe SSD
带宽:30M CN2 / CMIN2 / CU 或 100M BGP
系统:Ubuntu 22.04 / CentOS 7.x
Web:Nginx
程序:PHP 8.2 / MySQL 8.0 / Redis
如果是跨境电商、独立站、API 服务或访问量较高的业务,可以升级到:
CPU:Gold 6138 / AMD EPYC
内存:64GB - 128GB
硬盘:960GB NVMe / 2 × 960GB NVMe
带宽:CN2 优化线路 + BGP 多线
缓存:Redis
数据库:独立 MySQL 或主从架构
服务器配置不是越高越好,而是要和业务瓶颈匹配:
- 频繁 502:重点看 PHP-FPM、内存、进程数;
- 频繁 504:重点看程序耗时、数据库和上游接口;
- 大量 404:重点看路径、伪静态和发布流程;
- 大量 403:重点看权限、安全策略和 WAF;
- 200 但页面异常:重点看前端资源、程序输出和缓存。
十、总结:状态码是网站故障的第一张诊断单
网站打不开时,不要只凭浏览器提示判断问题。
先看状态码,再看状态码来自哪一层,最后结合日志和服务器资源做定位。
简单记忆:
200:请求成功,但页面内容可能有问题
403:服务器拒绝访问
404:路径或资源不存在
502:后端服务异常
504:后端响应超时
真正有效的排障方式,不是反复刷新页面,也不是直接重启服务器,而是按照:
状态码 → 返回层级 → 日志 → 服务状态 → 程序链路 → 服务器资源
一步一步缩小范围。
这样处理网站打不开的问题,效率会高很多,也能避免把权限、路径、程序、数据库、线路等完全不同的问题混在一起判断。