介绍
访问 Web 服务器或应用程序时,服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。HTTP 状态代码是三位数代码,分为五个不同的类别。状态代码的类别可以通过它的第一个数字快速识别:
- 1xx:信息
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
本指南侧重于从系统管理员的角度识别和排除最常见的 HTTP错误 代码,即 4xx 和 5xx 状态代码。有许多情况可能导致 Web 服务器响应具有特定错误代码的请求——我们将介绍常见的潜在原因和解决方案。
客户端和服务器错误概述
客户端错误或从 400 到 499 的 HTTP 状态代码是用户客户端(即 Web 浏览器或其他 HTTP 客户端)发送 HTTP 请求的结果。尽管这些类型的错误与客户端相关,但了解用户遇到的错误代码对于确定潜在问题是否可以通过服务器配置修复通常很有用。
服务器错误,或从 500 到 599 的 HTTP 状态代码,当 Web 服务器知道发生了错误或无法处理请求时,它会返回。
一般故障排除提示
- 使用 Web 浏览器测试 Web 服务器时,更改服务器后刷新浏览器
- 检查服务器日志以获取有关服务器如何处理请求的更多详细信息。例如,网络服务器,如Apache或Nginx的生成两个文件名为
access.log
和error.log
可扫描的相关信息 - 请记住,HTTP 状态代码定义是服务请求的应用程序实现的标准的一部分。这意味着返回的实际状态代码取决于服务器软件如何处理特定错误——本指南通常应该为您指明正确的方向
现在您已经对 HTTP 状态代码有了一个高层次的了解,我们将看看常见的错误。
400 错误请求
400 状态代码或错误请求 错误表示发送到服务器的 HTTP 请求的语法无效。
以下是可能发生 400 Bad Request 错误的几个示例:
- 与站点关联的用户 cookie 已损坏。清除浏览器的缓存和 cookie 可以解决这个问题
- 由于浏览器故障导致请求格式错误
- 手动形成 HTTP 请求时由于人为错误导致的畸形请求(例如使用
curl
不正确)
401 未授权
401 状态代码或Unauthorized 错误意味着尝试访问资源的用户尚未经过身份验证或未正确进行身份验证。这意味着用户必须提供凭据才能查看受保护的资源。
返回 401 Unauthorized 错误的示例场景是,如果用户尝试访问受 HTTP 身份验证保护的资源,如本 Nginx 教程中所示。在这种情况下,用户将收到 401 响应代码,直到他们向 .htpasswd
Web 服务器提供有效的用户名和密码(文件中存在的用户名和密码)。
403 禁地
403 状态码或Forbidden 错误意味着用户发出了有效的请求,但由于缺乏访问所请求资源的权限,服务器拒绝为该请求提供服务。如果您意外遇到 403 错误,此处解释了一些典型原因。
文件权限
当运行 Web 服务器进程的用户没有足够的权限读取正在访问的文件时,通常会发生 403 错误。
举个排除403错误的例子,假设以下情况:
- 用户正在尝试访问 Web 服务器的索引文件,从
http://example.com/index.html
- Web 服务器工作进程归
www-data
用户所有 - 在服务器上,索引文件位于
/usr/share/nginx/html/index.html
如果用户收到 403 Forbidden 错误,请确保 www-data
用户有足够的权限来读取文件。通常,这意味着文件的其他权限 应设置为read 。有几种方法可以确保这一点,但在这种情况下,以下命令将起作用:
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 状态代码或服务不可用 错误表示服务器过载或正在维护。此错误意味着该服务应该在某个时候可用。
如果服务器不在维护状态,这可能表明服务器没有足够的 CPU 或内存资源来处理所有传入请求,或者需要配置 Web 服务器以允许更多用户、线程或进程。
504网关超时
504 状态代码或网关超时 错误表示服务器是网关或代理服务器,并且在允许的时间段内未收到后端服务器的响应。
这通常发生在以下情况:
- 服务器之间的网络连接不良
- 由于性能不佳,执行请求的后端服务器速度太慢
- 网关或代理服务器的超时时间太短
结论
现在您已经熟悉了最常见的 HTTP 错误代码以及这些代码的常见解决方案,您应该有一个很好的基础来解决 Web 服务器或应用程序的问题。
如果您遇到本指南中未提及的任何错误代码,或者您知道所描述的其他可能的解决方案,请随时在评论中讨论它们!