原理
反向代理:反向代理(reverse proxy)方式是指以代理来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时对外就表现为一个反向代理服务器
以图中的例子来说nginx反向代理www.example.com (1)用户访问www.example.com时解析的ip是nginx的地址 (2,3)nginx根据代理协议去后端webserver取请求的内容 (4)再把得到内容返回给客户 对internet暴露的只有nginx 后端webserver完全是透明的
这里发生了两次路由 user->Nginx Nginx->Webserver
upstream是nginx中实现负载均衡的一个模块
配置
nginx配置(upstream)
一、定义upstream地址池
1、
upstream webserver {
server 192.168.1.2: weight= max_fails= fail_timeout=30s;
server 192.168.1.3: weight= max_fails= fail_timeout=30s;
}
2、upstream分配方式
rr 轮询 默认 weight(指定轮询几率,weight值和访问率成正比)
max_fails:server通信的失败次数
fail_timeout:fail_timeout时间段内,如果失败的通信次数大于指定的max_fails,则认为proxied server down,并持续fail_timeout定义的时间段
ip_hash(每个请求按访问的ip的hash结果分配 这样每个访问ip固定一台后端服务器 解决session问题)
fair(第三方)
url_hash(第三方)
二、proxy
1、
server
{
...(省略)
location ...(省略) {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://webserver;
}
}
2、配置说明
proxy_next_upstream nginx默认判断失败节点状态以connect refuse和time out状态为准 proxy_next_upstream加上其它状态值
proxy_set_header 自定义向后端webserver发送请求header的值 不指定请求头中的host值会被后端webserver第一条server_name配置(第一条server_name匹配规则) #虚拟主机
X-Real-IP 设置为最后一个代理服务器的ip
X-Forwarded-For 记录请求经过的所有代理服务器ip(包括客户端ip)
ps: 如果用户自定义http header中用含下划线的值(app_version_code) nginx默认不做转发
需要在http段设置 underscores_in_headers on;
参考:
http://saiyaren.iteye.com/blog/1914865
https://bbs.konotes.org/thread-7797-1-1.html