array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Nginx实现反向代理负载均衡 - 爱码网

说明:

网络模型中,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交替访问

 Nginx实现反向代理负载均衡

 

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

     Nginx实现反向代理负载均衡

 

 

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

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

Nginx实现反向代理负载均衡 Nginx实现反向代理负载均衡

 

 Nginx实现反向代理负载均衡

Nginx实现反向代理负载均衡

 

 

备注:

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

 










本文转自 huangzp168 51CTO博客,原文链接:http://blog.51cto.com/huangzp/1902076,如需转载请自行联系原作者

相关文章: