nginx之HttpProxy模块

Posted by csy on 2019-04-02

前言

虽然以前配置过几次nginx,因为不常用,一直没有系统的去整理学习过。今天遇到了点问题,感觉之前一直都是似懂非懂,非常有必要做个小结。

当nginx使用了HttpProxy模块,用户的整个请求会在nginx中缓冲直至传送给后端被代理的服务器。默认缓冲区大小等于指令,一般等于页面大小,可能是4K也可能是8K,取决于平台。但我们可以把它设置得更小。如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_sizeproxy_buffers指定的缓冲区里边.如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上.如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。

proxy_pass

在nginx中配置proxy_pass代理转发时,有两种情况:如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,会把匹配的路径部分也给代理走。 假设下面五种情况分别用 http://192.168.1.1/proxy/test.html 进行访问

1
2
3
4
location /proxy/ {
  proxy_pass        http://127.0.0.1:81;
}
# 代理到URL:http://127.0.0.1:81/proxy/test.html
1
2
3
4
location /proxy/ {
  proxy_pass        http://127.0.0.1:81/;
}
# 代理到URL:http://127.0.0.1:81/test.html
1
2
3
4
location /proxy/ {
  proxy_pass        http://127.0.0.1:81/aaa/;
}
# 代理到URL:http://127.0.0.1:81/aaa/test.html
1
2
3
4
location /proxy/ {
  proxy_pass        http://127.0.0.1:81/aaa;
}
# 代理到URL:http://127.0.0.1:81/aaatest.html
1
2
3
4
5
6
7
server {
  listen 81;
  location /proxy/ {
    proxy_pass      http://127.0.0.1/;
  }
}
# 代理到URL:http://127.0.0.1/test.html

隐藏主机信息

  • 当nginx作为反向代理时,也就是nginx转发请求后端其他webserver时,当我们想要隐藏后端webserver主机信息的时候,我们使用proxy_hide_header来屏蔽后端主机信息。

这里歪个楼:之前只知道反向代理是什么,但是不理解为什么叫”反向”代理?与正向代理比起来,反向代理是什么东西反向了?
正向代理是隐藏了真实的请求客户端,真实客户端请求的服务都被代理服务器代替来请求。比如科学上网的梯子就是我用浏览器访问被墙的地址A,代理(国外服务器)帮我去请求地址A,代理再把请求返回的数据返回给我。
反向代理是隐藏了真实的服务端,反向代理服务器会帮我们把请求转发到真实的服务器那里去。比如拨打10086总机号码,但一个地区的10086客服非常多,客户不知道真正提供服务人的是谁。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

自定义请求头

proxy_set_header 主要是用于用户认证接口,根据客户端IP和port,进行IP反查和端口范围确认,如果符合则用户认证通过。 当nginx作为反向代理时,在真实的服务端只能请求到代理服务器的IP和端口,而不是客户端IP。为了获取到真实的IP和端口,可以设置请求头,并将头信息传递到服务器端。$remote_addr变量的值是客户端的IP。

1
2
3
4
5
6
7
location / {
  proxy_pass       http://localhost:8000;
  proxy_set_header Host $host:$server_port;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Real-PORT $remote_port;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
X-Forwarded-For

如果没有”X-Forwarded-For”请求头,则$proxy_add_x_forwarded_for等于$remote_addr。