说明:

网络模型中,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...

    内容:

 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交替访问

 wKioL1i1Nw2AcqJCAABAGg7vT70993.png

 

5. dir上,修改配置文件/usr/local/nginx/conf/vhosts/lb.conf,增加权重,重启测试

    内容:

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关系,交替访问

     wKioL1i1N2Oxb9yQAABIjGZnaG8038.png

 

 

6. 停止rs1上的nginx服务,再次测试

    结果:跳过rs1服务器,只访问rs2的Web;恢复rs1时,交替访问

spacer.gif wKioL1i1N3aw3XKmAABKN3MDRPs914.png

 

 wKiom1i1N3fzLFZ-AAAueT59hS4242.png

spacer.gif

 

 

备注:

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