Table of Contents
一、Nginx的反向代理
1、须知
Nginx中代理分为正向代理与反向代理
生产环境中反向代理用的较多,正向代理一般在"climb over the wall"中才会用到。
2、反向代理情景模拟
图片释义:客户端访问Nginx服务器时,如果Nginx配置了反向代理,做了某宝服务器的代理服务器,那么Nginx代理服务器就会把客户端的请求转发给后端的某宝服务器。
提前了解负载均衡:当处理请求的服务器规模很大的时候,生产环境中一个Nginx代理服务器会代理一组处理服务器,负载均衡就是在Nginx代理服务器上配置upstream模块,通过调度算法实现各个服务器的合理的分压。基于每个服务器的性能和业务的规模等实际情况采取不同的均衡算法。
注意:反向代理隐藏了真实的服务器信息,增加了服务器集群的安全性。
3、反向代理的配置
(1)Nginx代理服务器配置:
location /{
proxy_pass http://172.16.193.161/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
注:因为这个Nginx服务器是做代理的,所以一般在匹配"/ "这个location区块里配置反向代理的参数,且不用配置root、index等其他的参数。
(2)后端用户请求处理服务器配置:
location / {
echo $host;
echo $remote_addr;
echo $proxy_add_x_forwarded_for;
}
注:这里的location"/"区块里面才配置你想要展示给用户的内容。为了明白Nginx代理服务器中的$host、$remote_addr、
$proxy_add_x_forwarded_for这三个变量的含义,所以这里用echo回显一下结果。
访问结果:
4、反向代理中的配置和参数详解
proxy_set_header :proxy_set_header用来设定被代理服务器接收到的header信息;
注:proxy_set_header 配置的时候为了被代理端 收到更多的客户端的信息。
proxy_set_header Host $host;在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,它就
可以识别代理的是那个虚拟主机;如果你没有配置这句话,那么后端服务器便不知道到底是代理的那个虚拟主机,它便会直接匹配第一个虚拟主机。
proxy_set_header X-Real-IP $remote_addr; 这是后端服务器获取用户真实IP的必要功能配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这个地方是多重代理时,
查询nginx 客户端所需要的一个nginx 变量值。$proxy_add_x_forwarded_for变量存的是用户访问这个后端服务器的完整路径。
多重代理:10.0.0.6 nginx 代理----> 10.0.0.7 代理端 -----> 10.0.0.8 被代理端
具体格式:X-Forwarded-For: client1, proxy1, proxy2...
由于代理的参数还有很多,可以用include方式包含到虚拟主机的配置里面
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://172.16.193.161/;
include vhost/www.haha.com.proxy.conf
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
[root@proxy-server conf]# cd vhost/
[root@proxy-server vhost]# cat www.haha.com.proxy.conf
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_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
上面这些反向代理如果是初学者了解即可,详见:http ://nginx.org/en/docs/http/ngx_http_proxy_module.html
二、Nginx反向代理、负载均衡集群搭建
1、须知
(1)一个upstream区块我们叫做一个服务器池
(2)反向代理直接转发到这个服务器池,再由upstream区块中指定的负载均衡算法及相应参数,使每个用户请求转发到一个指定的服务器进行处理
2、负载均衡upstream模块配置及常用参数
upstream常用参数详解:
1)weight :代表服务器的权重值,默认是1,数字越大,请求就按比例来的越多。一般性能越好的服务器weight值越高
2)max_fails :Nginx尝试连接后端处理服务器的失败次数,默认为1;当超过最大次数时,返回proxy_next_upstream 模块定义的错误
3)fail_timeout:再经过max_fails定义的次数完了之后,距离下次检查的间隔时间,默认是10s。比如:max_fails的次数为3次,在三次
都返回502,那么它就会根据fail_timeout的值,等待10s再去检查,一直这样重复,直到后端处理服务器起来为止。常规业务2~3秒比较合理
4)backup :其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。相当于就是一个热备处理服务器。
5)down :这标志着服务器永远不可用,可搭配ip_hash负载均衡算法使用。
6)max_conns : 限制代理服务器同时活动的最大连接数,默认为0,没限制
简单配置:
upstream www{ //服务器池的名字为www
server 172.16.193.161:80 weight=2 max_fails=2 fail_timeout=20s;
server 172.16.193.163:80 backup; //热备服务器
}
3、反向代理及负载均衡集群搭建
(1)Nginx代理服务器主配置文件配置
upstream www{ //指定服务器池的名字为www
server 172.16.193.161:80 weight=2;
server 172.16.193.163:80;
}
server {
listen 80;
server_name localhost; //如果有Nginx代理服务器有域名的话也可以在这里填域名
location / {
proxy_pass http://www/; //将用户的请求转发到名为www的服务器池
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
访问结果:
访问结果一直遵循2 2 1这样的规律,将请求数2:1拆分给后端的两个服务器处理。
其他参数的配置,请自行尝试。
三、upstream调度算法透析
1、轮询算法(简称rr,默认的调度算法,静态调度算法)
算法原理:按客户端的请求顺序把客户端的请求逐一分配到不同的后端节点服务器
2、权重轮询算法(简称wrr,静态调度算法)
算法原理:rr算法的基础上加上权重即可,使用该算法权重和用户访问成正比,权重值越大,被转发的请求也就越多
3、ip_hash算法(静态调度算法)
算法原理:每个请求按客户端的IP的hash值来分配。第一个进来的IP取其前 24位进行hash,得到一个hash值,随后的客户端的请求中,客户端的hash值只要一样,就会被分配到同一台服务器。该调度算法可以解决动态网页的session共享问题,但有时会导致请求分配不均,因为国内大多数公司都是NAT上网,多个客户端对应一个外网IP。
配置示例:
upstream www{
ip_hash; //选择ip_hash调度算法
server 172.16.193.161:80 weight=2;
server 172.16.193.163:80;
}
4、url_hash算法(静态调度算法)
算法原理:根据访问URL的hash结果来分配请求的,让一个url固定到一个服务器上,后端服务器为缓存服务器时效果显著
配置示例:
upstream www{
server 172.16.193.161:80;
server 172.16.193.163:80;
hash $request_uri; //采用的调度算法为url_hash
hash_method crc32; //采用的hash算法为crc32
}
注意:若采用了url_hash调度算法,则upstream模块中的server语句不能使用weight等其他参数了
5、fair算法(动态调度算法)
算法原理:此算法根据后端服务器的响应时间来分配请求,响应时间短的优先分配;这个算法更加的智能,根据页面大小和加载时间的长短进行负载均衡。
注:Nginx本身并不支持fair调度算法,必须下载upstream_fair模块
配置示例:
upstream www{
server 172.16.193.161:80 weight=2;
server 172.16.193.163:80;
fair; //选择fair调度算法,前提是你已经安装了fair模块
}
6、一致性hash算法
算法原理:此算法一般适用于代理后端业务为缓存服务(如:Memcached,Squid)的场景,通过将用户请求的URI或者指定的字符串进行计算,然后调度到后端服务器,此后任何用户查找同一个URI或者指定字符串都会被调度到这台服务器上。
注:Nginx本身不支持一致性hash算法,但是Nginx分支Tengine支持,此算法较为复杂,此处只是简单介绍。