返回

排查 Openresty 获取不到 Host 请求头

后端

前言

最近在为客户部署服务时,遇到了一个奇怪的问题:Openresty 无法获取请求中的 Host 头部。由于 Host 头部对于 HTTP 请求至关重要,无法获取会导致服务无法正常工作。本文将记录我的排查过程和解决方法,供读者参考。

问题

部署服务后,我尝试通过浏览器访问服务,但收到了 "404 Not Found" 错误。检查服务器日志后,发现 Openresty 无法获取 Host 请求头。

[error] 105#105: *137009 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.1.1, server: example.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/"

从日志中可以看到,Openresty 在尝试连接到上游服务器时超时。这通常表明 Openresty 无法解析请求中的 Host 头部,从而导致无法建立与上游服务器的连接。

排查步骤

1. 检查 Nginx 配置

首先,我检查了 Nginx 配置文件,确保它正确配置了 server_name 指令。server_name 指令用于指定服务器的域名或 IP 地址。

server {
    listen 80;
    server_name example.com;
    ...
}

检查结果表明,server_name 指令已正确配置。

2. 检查 Lua 代码

接下来,我检查了 Lua 代码,确保它正确地从请求中获取 Host 头部。在 Openresty 中,可以通过 ngx.req.get_headers() 函数获取请求头。

local headers = ngx.req.get_headers()
local host = headers["Host"]

检查结果表明,Lua 代码已正确地从请求中获取 Host 头部。

3. 检查请求

为了排除请求本身的问题,我使用 cURL 工具发送了一个 HTTP 请求到服务器。

curl -v http://example.com

检查 cURL 输出后发现,请求中确实包含了 Host 头部:

> Host: example.com

解决方法

排查了 Nginx 配置、Lua 代码和请求后,我意识到问题可能是由于防火墙或其他网络设备导致的。我检查了防火墙规则,发现确实存在一个阻止 Host 头部通过的规则。

禁用该防火墙规则后,Openresty 就可以正常获取 Host 请求头了,服务也能够正常访问了。

总结

通过这次排查经历,我总结了几点经验:

  • 在排查问题时,需要逐层检查,从 Nginx 配置到 Lua 代码再到请求本身。
  • 仔细检查防火墙规则和其他网络设备,因为它们可能会阻止某些请求头通过。
  • 保持耐心和细心,不要放过任何细节。