介绍
访问 Web 服务器或应用程序时,服务器接收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。 HTTP 状态代码是三位数字代码,分为五个不同的类别。 状态码的类别可以通过它的第一个数字来识别:
- 1xx:信息
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
本指南侧重于识别和排除最常见的 HTTP 错误 代码,即 从系统管理员的角度来看,4xx 和 5xx 状态码。 有很多情况会导致 Web 服务器响应带有特定错误代码的请求——我们将介绍常见的潜在原因和解决方案。
客户端和服务器错误概述
客户端错误,或从 400 到 499 的 HTTP 状态代码,是用户客户端发送的 HTTP 请求的结果(即 Web 浏览器或其他 HTTP 客户端)。 尽管这些类型的错误与客户端相关,但了解用户遇到的错误代码通常有助于确定潜在问题是否可以通过服务器配置来修复。
当 Web 服务器知道发生了错误或无法处理请求时,它会返回服务器错误或从 500 到 599 的 HTTP 状态代码。
一般故障排除提示
- 使用 Web 浏览器测试 Web 服务器时,请在更改服务器后刷新浏览器
- 检查服务器日志以获取有关服务器如何处理请求的更多详细信息。 例如,Apache 或 Nginx 等 Web 服务器会生成两个名为
access.log
和error.log
的文件,可以对其进行扫描以获取相关信息 - 请记住,HTTP 状态代码定义是由为请求提供服务的应用程序实现的标准的一部分。 这意味着返回的实际状态代码取决于服务器软件如何处理特定错误——本指南通常应该为您指明正确的方向
现在您已经对 HTTP 状态码有了一个高层次的了解,我们将看看常见的错误。
400 错误请求
400 状态码,或 Bad Request 错误,表示发送到服务器的 HTTP 请求语法无效。
以下是可能发生 400 Bad Request 错误的几个示例:
- 与站点关联的用户 cookie 已损坏。 清除浏览器的缓存和 cookie 可以解决此问题
- 由于浏览器故障导致的格式错误的请求
- 手动形成 HTTP 请求时由于人为错误导致的格式错误的请求(例如 错误地使用
curl
)
401未经授权
401 状态码,或 Unauthorized 错误,表示尝试访问资源的用户未经过身份验证或未正确验证。 这意味着用户必须提供凭据才能查看受保护的资源。
如果用户尝试访问受 HTTP 身份验证保护的资源,则会返回 401 Unauthorized 错误的示例场景,如 this Nginx tutorial 中所示。 在这种情况下,用户将收到一个 401 响应代码,直到他们向 Web 服务器提供有效的用户名和密码(存在于 .htpasswd
文件中的用户名和密码)。
403 禁止
403 状态码,或 Forbidden 错误,表示用户发出了有效的请求,但由于缺乏访问所请求资源的权限,服务器拒绝处理该请求。 如果您意外遇到 403 错误,这里解释了一些典型的原因。
文件权限
当运行 Web 服务器进程的用户没有足够的权限来读取正在访问的文件时,通常会发生 403 错误。
举一个排除 403 错误的示例,假设以下情况:
- 用户正在尝试从
http://example.com/index.html
访问 Web 服务器的索引文件 - Web 服务器工作进程由
www-data
用户拥有 - 在服务器上,索引文件位于
/usr/share/nginx/html/index.html
如果用户收到 403 Forbidden 错误,请确保 www-data
用户具有足够的权限来读取文件。 通常,这意味着文件的 其他权限 应设置为 读取 。 有几种方法可以确保这一点,但以下命令将在这种情况下起作用:
sudo chmod o=r /usr/share/nginx/html/index.html
.htaccess
403 错误的另一个潜在原因(通常是有意的)是使用 .htaccess
文件。 例如,.htaccess
文件可用于拒绝某些资源对特定 IP 地址或范围的访问。
如果用户意外收到 403 Forbidden 错误,请确保它不是由您的 .htaccess
设置引起的。
索引文件不存在
如果用户试图访问一个没有默认索引文件的目录,并且没有启用目录列表,Web 服务器将返回 403 Forbidden 错误。 例如,如果用户试图访问http://example.com/emptydir/
,而服务器上的emptydir
目录下没有索引文件,则会返回403状态。
如果您希望启用目录列表,您可以在您的 Web 服务器配置中这样做。
404 未找到
404 状态码或 Not Found 错误表示用户能够与服务器通信,但无法找到请求的文件或资源。
404 错误可能在多种情况下发生。 如果用户意外收到 404 Not Found 错误,请在进行故障排除时询问以下问题:
- 将用户定向到您的服务器资源的链接中是否有印刷错误?
- 用户是否输入了错误的 URL?
- 该文件是否存在于服务器上的正确位置? 资源是否在服务器上被移动或删除?
- 服务器配置是否具有正确的文档根位置?
- 拥有 Web 服务器工作进程的用户是否有权遍历请求文件所在的目录? (提示:目录需要读取和执行权限才能访问)
- 被访问的资源是符号链接吗? 如果是这样,请确保将 Web 服务器配置为遵循符号链接
500内部服务器错误
500 状态码或 Internal Server Error 表示服务器由于未知原因无法处理请求。 有时,当更具体的 5xx 错误更合适时,会出现此代码。
此错误的最常见原因是服务器配置错误(例如 格式错误的 .htaccess
文件)或缺少软件包(例如 试图在没有正确安装 PHP 的情况下执行 PHP 文件)。
502错误的网关
502 状态码,或 Bad Gateway 错误,表示服务器是网关或代理服务器,它没有从应该实际满足请求的后端服务器接收到有效响应。
如果有问题的服务器是反向代理服务器,例如负载均衡器,则需要检查以下几点:
- 后端服务器(HTTP 请求被转发到的地方)是健康的
- 反向代理配置正确,指定了正确的后端
- 后端服务器和反向代理服务器之间的网络连接是健康的。 如果服务器可以在其他端口上通信,请确保防火墙允许它们之间的流量
- 如果您的 Web 应用程序配置为侦听套接字,请确保套接字存在于正确的位置并且具有适当的权限
503服务不可用
503 状态码,或 Service Unavailable 错误,表示服务器超载或正在维护中。 此错误意味着该服务应该在某个时候变得可用。
如果服务器未在维护中,这可能表明服务器没有足够的 CPU 或内存资源来处理所有传入请求,或者需要将 Web 服务器配置为允许更多用户、线程或进程。
504网关超时
504状态码,或Gateway Timeout错误,表示服务器是网关或代理服务器,在允许的时间内没有收到后端服务器的响应。
这通常发生在以下情况:
- 服务器之间的网络连接很差
- 由于性能不佳,正在满足请求的后端服务器太慢
- 网关或代理服务器的超时时间太短
结论
既然您已经熟悉了最常见的 HTTP 错误代码以及这些代码的常见解决方案,那么您应该为解决 Web 服务器或应用程序的问题打下良好的基础。
如果您遇到本指南中未提及的任何错误代码,或者您知道所描述问题的其他可能解决方案,请随时在评论中讨论它们。