一、配置
http {
server {
...
location /http {
proxy_pass http://http_backend;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
...
}
}
}
二、说明
1、proxy_pass
真实服务器
2、proxy_redirect
指定是否修改被代理服务器返回的响应头中的location头域跟refresh头域数值
例如:
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。
假设后端服务器返回的响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为 “Location: http://frontend/one/some/uri/”。
3、proxy_set_header
重新定义或者添加发往后端服务器的请求头
4、proxy_set_header X-Real-IP
启用客户端真实地址(否则日志中显示的是代理在访问网站)
5、proxy_set_header X-Forwarded-For
记录代理地址
6、proxy_connect_timeout
定义与代理服务器建立连接的超时时间。需要注意的是这个超时时间通常不能超过75秒,默认值60
7、proxy_send_timeout
后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
8、proxy_read_timeout
nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接
9、Set-Cookie
在默认情况,nginx不缓存从后端响应的http头中带有Set-Cookie的对象。如果客户端发送的请求带有Cookie header,varnish将忽略
缓存,直接将请求传递到后端。nginx中通过proxy_ignore_headers设置忽略它们,设置方法如下:
解决办法:
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
10
# 有时候后端需要知道客户端是用的http请求还是https请求,加上一个X-Forwarded-Proto头
proxy_set_header X-Forwarded-Proto $scheme; # 禅道开启https,需要这个选项才能正确转发
额外说明
proxy_set_header
用来设定被代理服务器接收到的header信息。
语法:proxy_set_header field value;
field :为要更改的项目,也可以理解为变量的名字,比如host
value :为变量的值
如果不设置proxy_set_header,则默认host的值为proxy_pass后面跟的那个域名或者IP(一般写IP)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
$proxy_host 自然是 proxy_pass后面跟着的host 比如一个请求 https://zhidao.baidu.com/question/22908463.html
Request.ServerVariables("HTTP_HOST") 可以获得HTTP_HOST请求标题:zhidao.baidu.com
$http_host始终等于HTTP_HOST请求标题
$host等于$http_host,小写并且没有端口号(如果存在),除非HTTP_HOST不存在或是空值。在这种情况下,$host等于server_name
$proxy_add_x_forwarded_for从客户访问到到最后的后台服务所经理的所有节点的ip汇总221.221.1.100,10.30.30.109,...
nginx的自带变量$remote_addr代表客户端的IP
$remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设
中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏
览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。
$remote_addr 只能获取到与服务器本身直连的上层请求ip,所以设置$remote_addr一般都是设置第一个代理上面;但是问题是,有时候是通
过cdn访问过来的,那么后面web服务器获取到的,永远都是cdn 的ip 而非真是用户ip,那么这个时候就要用到X-Forwarded-For 了,这个
变量的意思,其实就像是链路反追踪,从客户的真实ip为起点,穿过多层级的proxy ,最终到达web 服务器,都会记录下来,所以在获取用
户真实ip的时候,一般就可以设置成,proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这样就能获取所有的代理ip
客户ip。 $proxy_add_x_forwarded_for变量包含客户端请求头中的X-Forwarded-For与$remote_addr两部分,他们之间用逗号分开。