Nginx反向代理Header

#

背景

这件事还得PM给我指派了一个关于caohan.com Nova无法打开的问题说起。一开始只是因为server_name的不规则导致重定向次数太多导致。后来我发现并不是这样。所以记录一下学习和解决办法 。先看看学习部分

正向代理和反向代理

Nginx的代理是被经常使用到的,比如经常会有需要访问海外服务器,但是速度又太慢就会使用hk服务器代理到日本 或者 新加坡 这样使用代理访问比直接访问会快很多很快(正向代理) 这里代理的是客户端,但是如果增加了负载均衡那么就变成了反向代理 引用我在知乎看到的图。

Proxy_set_Header

一般来说我们看到的反向代理很多配置都是这样的

1610275068000image.png

接下来详细说一下这些Header的作用以及背景所说到的坑。

X-Forwarded-For

Http Header中的**X-Forarded-For **表示该条http请求是有谁发起的。如果反向代理服务器不重写该请求头的话,那么后端真实web服务器在处理时会认为所有的请求都来自反向代理服务器,按照公司架构来描述,比如真实的项目部署在jp002,那么代理服务器hk008如果重写了这个的话,代理到jp002就可以获取到真实访问的ip,反之如何重写了这个 参数添加为 $proxy_add_x_forwarded_for那么真实服务器可以获得到真实的ip。如果后端 web 服务器有防攻击策略的话,那么反向代理服务器对应的 ip 地址就不会被封掉,会封掉真实的ip。

上述的配置的意思就是增加一个 $proxy_add_x_forwarded_forX-Forarded-For 里面去,注意是增加而不是覆盖。当然由于默认的值是空。所以总感觉是覆盖。其实 X-Forarded-For 的格式为 X-Forarded-For real client ip , proxy id 1,proxy ip n 每经过一个反向代理就在请求头 X-Forwarded-For 后追加一个反向代理的Ip

1610276713000image.png

proxy_connect_timeout

顾名思义

nginx服务器与被代理的服务器建立连接的超时时间,默认60秒

Host

重点就是它.... Http Header中的Host 含义为所请求的目的主机名。主要是用来实现虚拟主机技术。其实很生动形象,我们每次配置一个本地项目的时候都会配置一个 nginx conf 比如 先配置一个nginx的server 。然后它的server_name 为 xxx.com 然后还回去 /etc/hosts 中去配置一个 127.0.0.1 xxx.com 这个其实就是虚拟主机技术。原因就是Host请求头决定着访问哪个虚拟主机

在反向代理中,proxy_set_header 的作用就是把原http请求的Header中的Host字段也放到转发的请求里,如果不加这一行的话。nginx转发的请求header就不会有Host字段,但是实际会从url中去获取。服务器就是靠这个Host值区分请求的是哪个域名的资源。

之前的问题就是当 fangwen xxx.com的时候会代理到cdn.xxx.com 去获取数据。但是最终返回给我们的url还是 cdn.xxx.com 百度所说的解决办法是添加 proxy_set_header Host xxx.com 但是添加之后会直接403

解决办法: 在cdn.xxx.com 的nginx 配置中 的server_name 添加一个 xxx.com就可以解决了

原因就是 如上说过 在Http协议中 访问这个域名去获取的数据是通过 Host这个头去访问了。会根据这个头信息去找到对应的服务器。但是在 cdn.xxx.com这个服务里没有办法解析到xxx.com 这个域名 所以在nginx 是 server_name中添加 xxx.com 就可以解析到了

总结

如上都是自己的看法和总结 也许会有问题 如果您看到错误请指正

成长记录

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

被以下专题收入,发现更多相似内容