如何修复 503 Service Unavailable 错误
503 Service Unavailable 是一个 HTTP 5xx 状态码,表示服务器暂时无法处理请求。与 500(服务器内部错误)不同,503 通常意味着服务器端「知情」地拒绝或无法响应 —— 可能是正在维护、过载、或者其依赖的后端服务不可用。好消息是:503 绝大多数情况下是临时的,找到瓶颈并重启相关服务即可恢复。
本指南覆盖 503 的 7 个常见根本原因,并提供针对 Nginx、Apache 和 WordPress 的分步修复方法。按顺序执行下面的六个步骤,通常在 9 分钟内即可定位并解决问题。
503 Service Unavailable 是什么意思?
当浏览器或客户端收到 HTTP/1.1 503 Service Unavailable 时,它表示服务器当前无法处理请求,但这是一个临时状态。503 经常伴随一个 Retry-After 响应头,告诉客户端在多少秒之后重试。
与 502 Bad Gateway 的关键区别在于:502 是「网关收到了无效响应」,而 503 是「服务端主动表示自己不可用」。常见的触发场景包括:
- Web 服务器(Nginx/Apache)正在重启或重新加载配置;
- 后端应用(PHP-FPM、Node.js、数据库)崩溃或未启动;
- 服务器资源耗尽:CPU 100%、内存用尽、磁盘满;
- 网站处于计划维护模式;
- 反向代理或负载均衡器无法连接到上游;
- 连接数超过配置上限,被限流;
- DDoS 攻击或流量洪峰压垮了应用。
503 错误的常见原因
下表汇总了 503 最常见的 7 类原因,帮助你快速对照排查:
| 原因 | 如何识别 | 修复方法 |
|---|---|---|
| Web 服务器未运行 | systemctl status 显示 inactive/failed |
启动并设置开机自启 |
| 后端服务崩溃 | Nginx 日志报 no live upstreams |
重启 PHP-FPM / 应用进程 |
| 服务器资源耗尽 | top、free -h 显示满载 |
扩容或释放内存/磁盘 |
| 维护模式开启 | 站点根目录存在 .maintenance 文件 |
删除该文件或退出维护模式 |
| 配置语法错误 | nginx -t 报 syntax error |
修正配置后 reload |
| 连接数超限 | 日志报 worker_connections not enough |
调大 worker_connections |
| 流量洪峰 / DDoS | 访问量激增,响应变慢后 503 | 启用限流、WAF 或 CDN 防护 |
分步修复指南
下面是系统化修复 503 的六个步骤。请按顺序执行,每完成一步都重新测试一次。
步骤 1:检查 Web 服务器是否在运行
503 最直接的原因是 Web 服务器进程本身没在运行。先用 systemd 确认状态:
# Nginx
systemctl status nginx
# Apache
systemctl status apache2
查看输出中的 Active: 行。如果是 inactive 或 failed,启动它并设置为开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
# Apache
sudo systemctl start apache2
sudo systemctl enable apache2
如果服务启动后立刻退出,跳到步骤 2 查看日志找出原因。
步骤 2:查看服务器错误日志
错误日志会告诉你 503 究竟发生在哪一层。同时检查 Web 服务器和应用日志:
# Nginx 错误日志
sudo tail -n 100 /var/log/nginx/error.log
# Apache 错误日志
sudo tail -n 100 /var/log/apache2/error.log
# systemd 服务日志(通用)
sudo journalctl -u nginx --since "30 min ago" --no-pager
重点关注这几类信息:
no live upstreams while connecting to upstream—— 后端全部不可用;connect() failed (111: Connection refused)—— 上游未监听;worker_connections not enough—— 连接数超限;permission denied—— 文件或 socket 权限问题。
步骤 3:检查后端/上游服务
如果 Web 服务器正常但 503 依旧,问题大概率出在它背后的应用层。逐个确认后端服务状态:
# PHP-FPM
systemctl status php-fpm
# 或 php8.2-fpm
systemctl status php8.2-fpm
# 数据库
systemctl status mysql
systemctl status postgresql
# Node.js(PM2)
pm2 status
# 测试本地后端是否响应
curl -I http://127.0.0.1:9000
确认 Web 服务器的 proxy_pass 或 fastcgi_pass 指向的地址和端口与上游实际监听的一致。重启崩溃的上游服务:
sudo systemctl restart php-fpm
步骤 4:检查服务器资源
资源耗尽是 503 的高频原因,尤其是内存被 OOM Killer 回收后端进程、磁盘满导致无法写入临时文件。用下面命令快速体检:
# CPU 和进程
top -bn1 | head -n 20
# 内存
free -h
# 磁盘空间
df -h
# 检查是否被 OOM Killer 干掉过进程
dmesg | grep -i "out of memory"
sudo journalctl -k | grep -i oom
如果磁盘使用率接近 100%,清理日志、缓存或临时文件;如果内存不足,考虑升级服务器规格或优化应用(例如调小 PHP-FPM 的 pm.max_children)。
步骤 5:检查维护模式或配置问题
很多 CMS(尤其是 WordPress)在升级时会自动创建一个 .maintenance 文件,导致所有页面返回 503。检查站点根目录:
ls -la /var/www/html/.maintenance
如果该文件存在且你确认不在升级中,删除它:
sudo rm /var/www/html/.maintenance
同时验证 Web 服务器配置是否有语法错误:
# Nginx
sudo nginx -t
# Apache
sudo apachectl configtest
任何 syntax error 都必须先修正,否则 reload 后服务可能直接不可用。
步骤 6:重启服务并测试
完成上述修复后,依次重启 Web 服务器和后端服务,然后验证:
# 重启服务
sudo systemctl restart php-fpm
sudo systemctl restart nginx
# 本地测试
curl -I http://localhost
# 期望响应:HTTP/1.1 200 OK
# 外部测试(替换为你的域名)
curl -I https://example.com
看到 200 OK(或 301/302 重定向)即说明 503 已解决。最后用浏览器实际访问一次,确认端到端功能正常。
Nginx 503 专项修复
Nginx 出现 503 通常与上游不可用或限流配置有关。下面是几个高频场景及对应配置。
场景 1:上游全部宕机。当 upstream 块里所有 server 都不可用时,Nginx 会返回 503。确认上游地址正确,并建议配置备用上游:
upstream app_backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081 backup;
}
server {
location / {
proxy_pass http://app_backend;
proxy_next_upstream error timeout http_502 http_503 http_504;
}
}
场景 2:限流触发 503。当你配置了 limit_req 而请求超过阈值时,Nginx 默认返回 503。可在 http 或 server 块中调整:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
# 把超限响应码改为 429 更语义化
limit_req_status 429;
proxy_pass http://app_backend;
}
}
场景 3:连接数不够。高并发下 worker_connections 耗尽也会触发 503。适当调大:
# nginx.conf 的 events 块
events {
worker_connections 4096;
multi_accept on;
}
修改后记得测试并重载:
sudo nginx -t && sudo nginx -s reload
WordPress 503 专项修复
WordPress 的 503 有其特有的触发点,主要与维护机制和插件冲突有关。
1. 删除残留的 .maintenance 文件。WordPress 在自动更新时会创建该文件,若更新中断则可能残留,导致持续 503:
sudo rm /var/www/html/.maintenance
2. 排查插件冲突。某个插件崩溃会导致 PHP 致命错误,进而被反向代理呈现为 503。通过重命名插件目录临时禁用全部插件:
mv /var/www/html/wp-content/plugins /var/www/html/wp-content/plugins.bak
如果站点恢复正常,再逐个恢复插件定位元凶。
3. 开启 WP_DEBUG 查看真实错误。在 wp-config.php 中启用调试,把错误输出到日志而非页面:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
然后查看 /var/www/html/wp-content/debug.log,找到导致 503 的具体 PHP 错误并修复。
快速参考表
5xx 系列错误容易混淆,下表帮你快速区分:
| 状态码 | 含义 | 典型原因 |
|---|---|---|
| 500 | 内部服务器错误 | 应用代码异常、PHP 致命错误 |
| 502 | 错误网关 | 上游返回无效响应或未运行 |
| 503 | 服务不可用 | 维护中、过载、后端全部宕机 |
| 504 | 网关超时 | 上游响应超时 |
常见问题
503 错误会自己恢复吗?
部分情况会。如果 503 由流量洪峰或临时维护引起,等流量下降或维护结束后通常会自动恢复。但如果是后端崩溃、配置错误或资源耗尽,必须人工介入修复。建议始终查看错误日志确认根因,而不是被动等待。
503 和 502 有什么区别?
502 表示网关/代理从上游收到了无效响应(上游在运行但响应异常);503 表示服务端主动表示自己或其后端整体不可用,通常是临时状态。简言之:502 是「上游坏了」,503 是「服务现在没法用」。
为什么只有部分页面返回 503?
这通常意味着只有处理特定请求的后端不可用。例如只有 PHP 页面 503 而静态资源正常,说明 PHP-FPM 出了问题;只有某条 API 路由 503,则可能是对应微服务实例宕机。结合错误日志和 proxy_pass 配置定位具体上游。
如何防止 503 再次发生?
做好三件事:一是配置监控告警,在 CPU/内存/磁盘接近上限时提前预警;二是为关键服务设置开机自启和自动重启(Restart=always);三是引入负载均衡和健康检查,避免单点故障,并在维护时使用蓝绿部署而非直接停服。
总结
503 Service Unavailable 本质上是服务器在告诉你「我现在没法处理请求,但这是临时的」。修复的关键在于快速定位是哪一层不可用:是 Web 服务器本身、后端应用、服务器资源,还是维护机制。按照本指南的六个步骤 —— 检查 Web 服务器状态、查看错误日志、排查后端上游、检查服务器资源、确认维护模式与配置、重启并测试 —— 你可以在 9 分钟内覆盖绝大多数 503 场景。
对于 Nginx,重点检查 upstream 块与限流配置;对于 WordPress,优先处理 .maintenance 文件和插件冲突并开启 WP_DEBUG。养成监控资源、设置自动重启和蓝绿部署的习惯,能从源头大幅降低 503 的发生概率。