返回
排查 Openresty 获取不到 Host 请求头
后端
2023-11-23 21:29:18
前言
最近在为客户部署服务时,遇到了一个奇怪的问题: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 代码再到请求本身。
- 仔细检查防火墙规则和其他网络设备,因为它们可能会阻止某些请求头通过。
- 保持耐心和细心,不要放过任何细节。