400错误返回了服务器信息,Http头部HOST为空Nginx返回400错误

本文记录了一次在F5负载均衡环境中遇到的网络不通问题,问题源于F5健康检查策略配置不当,导致F5认为后端服务器不在线。通过了解F5健康检查规则,发现是由于发送请求时缺少正确的HOST头部,服务器返回400错误。通过模拟HTTP请求并修改发送规则,最终解决了网络联通问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前段时间出差,在北京现场遇到一个F5网络不通问题,现记录下来以备后面查阅。

问题解决方案很简单,主要记录下排查过程中的思路。

正文

F5健康检查失效

现场环境是使用F5做负载均衡,即F5对外提供服务地址和端口,F5负载转发请求到后端业务服务器。环境是客户的测试环境,F5也是客户的。我们向客户提交F5转发策略和F5健康检查策略,等待网络开通。本来以为不用担心这一块问题,但客户的网络部门配置完成后,网络一直不通。由于未接触过F5所以前面不知怎么和客户沟通,后拿到F5账号和密码,登录进去后开始定位问题。

进去F5登录界面后,看到配置的转发策略中,后端服务器健康检查是失效的,即F5认为后端服务器不在线。这是怎么回事?

F5健康检查规则

这里首先弄清F5健康检查规则是怎么回事?

F5健康检查规则是指F5在一定周期内向后端服务器发送请求来确认后端服务器是否在线。

如下图:

1490406dae21

F5-HTTP健康检查.PNG

图中 Send String 就是 F5发送的请求字段, Receive String 是F5接收到响应后对比字段,只要响应中有对比字段则认为成功。Receive String为空时,F5接收到响应就认为成功。

NGINX返回400

继续排查F5健康检查失效问题。

问题主要在两点:1 发送请求字段写的有问题。2接收的响应中没有包含200 OK,匹配不上。

上述这两点通过抓包可以分析。因为现场没法登陆F5服务器上去抓包,下面就利用nc工具模拟F5发请求。

nc 全名 Netcat (网络刀),是一个强大的网络工具,可以模拟发送http请求。

下面在和业务服务器同网段的任意一台服务器上装上nc 工具。

然后使用nc 命令发送请求,请求如下:

echo -e "GET {url} HTTP/1.1\r\nConnection:Close\r\nHost:\r\n\r\n" | nc 10.160.15.20 80 |less

引号中的请求字段和F5中sendString一致。

利用nc 发送http请求后,得到的响应如下:

1490406dae21

nginx-400错误.jpg

把得到的结果复制到一个html文件中,然后打开如下:

1490406dae21

nginx-400错误2.jpg

现在F5健康检查问题找到了:是因为业务服务器返回400错误,但F5匹配200 OK, 没有匹配上造成F5认为服务器有问题。

HTTP头部HOST不能为空

继续看问题,nginx为啥会返回错误码400?

这也是本片文章重头戏。

网上查询原因如下:Nginx官方文档介绍,400状态码含义如下:

A client MUST include a Host header field in all HTTP/1.1 request messages . If the requested URI does not include an Internet host name for the service being requested, then the Host header field MUST be given with an empty value. An HTTP/1.1 proxy MUST ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy. All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.

上面是http1.1的rfc关于host部分的解释,从上面我们了解到如果一个http1.1的请求没有host域,那么server应该给client段发送400的状态码,表明这个请求server不能处理。而对于Nginx server来说,也遵循这样的方式,说明client发送了一个无效的请求,Nginx server无法处理,于是返回了400的状态码。

本次故障中,客户端的调用方式没有使用host 参数,传递了空的Host头给服务端,一旦Nginx设置了proxy_set_header Host $http_host,空Host头就传给了后端。然而,在http 1.1的规范中,Host只要出现空,就会返回400,所以出现了这个故障。

最后,重新修改发送规则如下:这里HOST随便写一个地址就可以。

echo -e "GET {url} HTTP/1.1\r\nConnection:Close\r\nHost:10.1.5.20\r\n\r\n" | nc 10.160.15.20 80 |less

利用nc 命令测试,结果如下:

1490406dae21

nginx-200.jpg

F5修改发送规则后,终于网路联通了,如下图:

1490406dae21

F5-tong.jpg

至此,问题解决。

### 解决 Nginx 代理 HTTP 服务时出现的错误Nginx 配置为代理 HTTP 服务时,可能会遇到多种类型的错误。以下是针对常见问题的具体分析和解决方案。 #### 1. **403 Forbidden 错误** 此错误通常表示客户端无权访问所请求的内容。可能的原因包括权限设置不正确、`location` 路径匹配失败或上游服务器返回了拒绝响应。 - 确认 `server_name` 和 `proxy_pass` 的目标地址是否正确[^1]。 - 检查文件系统的权限,确保 Nginx 进程能够读取所需的静态资源或日志文件。 - 如果使用的是动态内容(如 PHP),确认后端服务已启动并正常运行。 ```bash chmod -R 755 /path/to/web/root/ chown -R www-data:www-data /path/to/web/root/ ``` #### 2. **路径配置错误** 如果 `location` 块中的正则表达式或 URI 不匹配,则可能导致请求无法被正确转发给后端服务。建议仔细校验 `location` 定义以及对应的 `proxy_pass` 地址[^2]。 示例修正: ```nginx server { listen 80; server_name example.com; location /api/ { proxy_pass http://backend_api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /var/www/static/; } } ``` #### 3. **请求头未正确传递** 某些情况下,后端应用依赖于特定的 HTTP 请求头字段(如 `Host`, `X-Forwarded-For`)。如果没有显式设置这些头部信息,后端服务可能无法识别真实的客户端 IP 或主机名。 修复方法是在 `location` 中加入必要的 `proxy_set_header` 指令: ```nginx proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` #### 4. **SSL/TLS 配置问题** 对于 HTTPS 流量,需确保证书链完整且监听端口正确绑定至 SSL 协议。如果忽略这一点,浏览器会提示安全警告或者完全阻断连接尝试[^4]。 典型配置如下所示: ```nginx server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/certs/example.crt; ssl_certificate_key /etc/nginx/private/example.key; location / { proxy_pass http://localhost:8080; proxy_ssl_session_reuse on; } } ``` #### 5. **模块缺失引发的功能受限** 假如需要扩展功能却忘记启用相应模块(比如 WebSocket 支持),可以通过重新编译安装的方式添加新特性而保留原有数据[^3]。具体操作流程已在引用材料中描述清楚,请按照指引执行命令完成更新过程。 --- ### 总结 以上列举了几种常见的 Nginx 代理 HTTP 服务过程中可能出现的问题及其对应措施。实际部署环境复杂多样,务必结合具体情况逐一排查潜在隐患点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值