Nginx 之 转发数据时请保持 Host

欢迎访问陈同学博客原文

Tip: keep the Host header via nginx proxy_pass
List of HTTP header fields

背景

今天在调试一项 nginx 配置时手贱不小心注释掉了 proxy_set_header Host $host; 配置,导致所有请求都503。

请求路径如下:

请求 -> nginx1 -> nginx2 -> haproxy -> 后端服务

nginx1是所有流量入口;nginx2负责处理一个产品的流量;haproxy为容器编排工具 Rancher 自带的LB。

注释掉 nginx2 中的 proxy_set_header Host $host; 后,所有API调用都 503,请求无法穿过 haproxy。

起初还以为是 Rancher 网络又出问题(Rancher网络出过很多幺蛾子),检查后发现问题没问题,没想到是 Host 导致。

关于Host

Request header 中的 Host 指定了所请求资源的主机和端口。由于一个IP地址可以对应多个域名,为主机分配IP地址后,主机上可以部署N个站点,可以根据基于域名的 虚拟主机 来处理请求。

RFC 2616 HTTP/1.1 中规定,在所有HTTP/1.1 请求中,client 必须包含 Host header;如果headers中没有Host,所有 HTTP/1.1 proxy 必须返回 400(Bad Request)。

proxy_pass 与 Host

在 nginx proxy_pass 指令中,若不做任何配置,会使用后面的 URL 重写的Host。

下面为两个示例配置,将请求从8080转到9097。

server {
    listen      8080;
    server_name demo.chenyongjun.vip;

    location / {
		proxy_pass http://127.0.0.1:9097;
    }
}

server {
    listen      9097;
    server_name demo.chenyongjun.vip;

    location / {
		proxy_pass http://127.0.0.1:9098;
    }
}

请求经过后,Host将由 demo.chenyongjun.vip 变为 127.0.0.1。像最上面的问题,由于nginx处理后 Host 变成了 127.0.0.1,导致 haproxy 无法处理该请求,因此所有请求都503。

在设置 proxy_set_header Host $host; 后,Host都将变为 demo.chenyongjun.vip。

欢迎关注陈同学的公众号,一起学习,一起成长

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx代理转发是通过配置nginx服务器的proxy_pass指令来实现的。在nginx配置文件中,可以使用proxy_pass指令将请求转发到指定的后端服务器。例如,可以将请求转发到8080端口的tomcat服务器。当接收到客户端的请求时,nginx会将请求转发给tomcat处理,并将tomcat返回的数据返回给客户端。实际上,nginx只是充当了转发的作用,并从真正的服务器那里获取返回的数据。\[1\]在配置中,还可以设置一些代理相关的头信息,如Host、X-Real-IP和X-Forwarded-For等,以便正确地传递客户端的请求信息给后端服务器。\[2\]此外,如果需要将请求转发到指定的域名或子域名,还需要在域名解析中预先配置相应的域名和IP。\[3\]总之,nginx代理转发通过配置proxy_pass指令实现,将请求转发给后端服务器处理,并将返回的数据返回给客户端。 #### 引用[.reference_title] - *1* [Nginx实现原理](https://blog.csdn.net/mengyong1108/article/details/77281260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Nginx常见场景代理转发配置](https://blog.csdn.net/faye0412/article/details/75200607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值