说明:
网络模型中,nginx属于第7层,根据域名或目录配置负载均衡(代理),十分灵活;而lvs只能针对IP
环境:
DIR : 172.16.115.100(Nginx代理)
RS1: 172.16.115.157(Web服务器)
RS2: 172.16.115.202(Web服务器)
1. dir、rs1、rs2安装nginx(1台代理+2台Web服务器)
命令 yum install -y nginx
2. 编辑dir上nginx的配置文件/etc/nginx/nginx.conf,开启子配置文件include /etc/nginx/conf.d/*.conf,并新建配置文件/etc/nginx/conf.d/lb.conf(需禁用掉/etc/nginx/conf.d/default.conf文件,如改名为default.conf.bak)
说明:用到负载均衡模块->uptream;反向代理模块->proxy
有向图:request -> proxy_pass -> upstream -> 执行机sever1/sever2/server3...
内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
upstream hzp {
# ip_hash; #将来自同一IP的请求分配给同一主机,避免刷新之后访问其他主机,实现“长连接”
server 172.16.115.157:80;
server 172.16.115.202:80;
}
server {
listen 80;
server_name www.huangzhenping.cn;
location / {
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_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_pass http:
//hzp/
;
}
}
|
proxy_set_header:
把客户端发送给nginx代理的首部进行重新定义或附加一个首部,然后传递给上上游服务器,VALUE可以是文本、变量或是文本和变量的组合,例如:proxy_set_head X-Real-IP $remote_addr,首部为”X-Real-IP”,值为“$remote_addr”,即客户端的IP地址,这样上游服务器就可以收到这个自定义的首部,可以利用此手段让上游服务器在访问日志中能够记录真实请求服务的IP地址,而不是记录全来自nginx代理的IP地址,有利于做日志分析;X-Forwarded-For 记录代理信息
proxy_next_upstream:
设置当上游服务器出现哪此错误时,将下一个请求转发到下一个上游服务器
proxy_pass:
设置代理服务器所使用的协议(http或https)、上游服务器地址(主机名或IP)和一个可选的URI被映射到一个位置
3. 修改rs1和rs2服务器web首页,并启动三台服务器上的Nginx服务
命令 /etc/init.d/nginx start
rs1:echo "hello,rs1" > /usr/share/nginx/html/index.html
rs2:echo "hello,rs2" > /usr/share/nginx/html/index.html
4. 客户机上用curl测试:curl -xlocalhost:80 www.huangzhenping.cn
结果: 权重1:1交替访问
5. dir上,修改配置文件/usr/local/nginx/conf/vhosts/lb.conf,增加权重,重启测试
内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
upstream hzp {
server 172.16.115.157:80 weight=3 max_fails=2 fail_timeout=30s;
server 172.16.115.202:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name www.huangzhenping.cn;
location / {
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_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_pass http:
//hzp/
;
}
}
|
结果:3:1关系,交替访问
6. 停止rs1上的nginx服务,再次测试
结果:跳过rs1服务器,只访问rs2的Web;恢复rs1时,交替访问
备注:
1. upstream常用状态
down server暂时不参与负载均衡
backup 其它所有的非backup机器down或者忙的时候,才请求backup机器
max_fails 请求失败次数,超过则返回proxy_next_upstream模块定义的错误
fail_timeout max_fails次失败后,暂停的时间
2. nginx负载均衡算法
轮询 默认
weight 权重轮询
ip_hash 解决了session问题,每个请求按访问IP的hash结果分配,这样每个访客可以固定一个后端服务器
fair 根据服务器的相应时间来分配,时间的优先,需安装upstream_fair模块
url_hash 根据url的hash分配结果分配,同一个url定向到同一后台服务器,提高缓存服务器的的效率,需安
装nginx的hash包
3. nginx全局变量
remote_addr 客户端ip,如:192.168.4.2
binary_remote_addr 客户端ip(二进制)
remote_port 客户端port,如:50472
remote_user 已经经过Auth Basic Module验证的用户名
host 请求主机头字段,否则为服务器名称,如:dwz.stamhe.com
request 用户请求信息,如:GET /?_a=index&_m=show&count=10 HTTP/1.1
request_filename 当前请求的文件的路径名,由root或alias和URI request组合而成,如:/webserver/htdocs/dwz/index.php
status 请求的响应状态码,如:200
body_bytes_sent 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40
content_length 请求头中的Content-length字段
content_type 请求头中的Content-Type字段
http_referer 引用地址
http_user_agent 客户端agent信息,如:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
args 如:_a=index&_m=show&count=10
document_uri 与$uri相同,如:/index.php
document_root 针对当前请求的根路径设置值,如:/webserver/htdocs/dwz
hostname 如:centos53.localdomain
http_cookie 客户端cookie信息
cookie_COOKIE cookie COOKIE变量的值
is_args 如果有$args参数,这个变量等于”?”,否则等于”",空值,如?
limit_rate 这个变量可以限制连接速率,0表示不限速
query_string 与$args相同,如:_a=index&_m=show&count=10
realpath_root 如:/webserver/htdocs/dwz
request_body 记录POST过来的数据信息
request_body_file 客户端请求主体信息的临时文件名
request_method 客户端请求的动作,通常为GET或POST,如:GET
request_uri 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。如:/index.php?_a=index&_m=show&count=10
scheme HTTP方法(如http,https),如:http
uri 如:/index.php
request_completion 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK
server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1
server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如:192.168.4.129
server_name 服务器名称,如:dwz.stamhe.com
server_port 请求到达服务器的端口号,如:80