您好!欢迎访问否玩代码!
广告位

HTTP 505错误怎么解决?HTTP版本不兼容的排查与修复指南

栏目: 日期: 浏览:175

为什么会出现505错误?

当你对一个网站展开访问之时, 在浏览器跟服务器之间, 是需要“讲同一种语言”的, 这“语言”指的就是HTTP协议版本情况了。要是服务器光是支持HTTP/1.1, 然而你的请求也好, 或者中间代理也罢, 运用了HTTP/2或者更高的版本, 会呈现这样的状况, 那就是服务器会抛出相关错误, 具体为505 HTTP Version Not Supported错误。

作简单的理解, 那就是, 服务器没办法看懂你所发来的协议版本, 进而直接拒绝作出响应。

对于站长而言,或是技术运维人员来讲, 这个错误一般意味着, 服务器配置方面, 存在版本匹配的问题, 反向代理方面, 也存在版本匹配的问题, CDN设置方面, 同样存在版本匹配的问题。

常见排查步骤

1. 检查服务器HTTP协议支持范围

以最常见的Nginx和Apache为例:

Nginx, 它默认情况下是支持HTTP/1.1的, 要是你有需要HTTP/2的情况, 那么就得在配置文件当中去进行启用:

listen 443 ssl http2;

若是客户端发送HTTP/2请求, 然而服务器并未开启, 那么就有可能触发505错误。

Apache: 要对mod_http2模块进行加载, 而且要去添加相关配置:

Protocols h2 http/1.1

2. 检查反向代理与CDN配置

众多站点采用Cloudflare、阿里云CDN或者自行搭建反向代理(像Traefik、HAProxy这样), 要是代理服务器朝着下游服务器转发了有误的HTTP版本, 同样会致使505错误。

建议做法

在代理层强制统一协议版本,例如Nginx作为反向代理时:

proxy_http_version 1.1;

确保CDN回源配置中指定了服务器支持的HTTP版本。

3. 检查客户端请求

要是发起的是非标请求, 此请求是由爬虫或者老旧客户端发起的, 像那种错误的HTTP/0.9格式, 那么可以考虑在服务器端把请求头丢弃掉, 或者对请求头进行重写。在Nginx里能够进行配置:

if ($http_upgrade !~* "websocket") {
    return 444;
}

实战排查清单(附代码)

| 步骤 | 操作 | 命令/工具 |

|------|------|-----------|

| 1    | 针对服务器当前所支持的HTTP版本予以查看 | 通过执行curl -I --http2 https://example.com操作而成 |。

看, 这里是数字2, 要去检查Nginx编译模块, 执行的操作是nginx -V 2>&1, 同时通过管道符将结果导向grep, 去查找http_v2 , 有这样一个操作流程。

对于数字3, 要去检查Apache加载模块, 通过执行httpd -M并使用管道符连接, 再用grep工具查找http2 , 有对应的结果。

将4拿来, 对测试直接访问后端服务这一行为而言, 是通过telnet 127.0.0.1 80, 之后手动去发出HTTP/1.1请求。

总结建议

将优先统一协议设定为, 全路, 也就是从客户端到CDN, 再到反向代理, 最终到后端Web服务器, 都要保持一致的HTTP版本。

提升服务器组件, 陈旧的服务器软件或许对HTTP/2连HTTP/1.1的某些特性都不予以支持, 提议更新到稳定的版本。

日志进行监控, 开启详细的错误日志, 比如将Nginx的error.log级别设定为debug, 从而能够快速地定位505来源。

否玩代码编辑 https://www.fouwan.com