nginx 负载均衡的实现

一,nginx 负载均衡功能的实践

1, 首先安装nginx

2,找到nginx安装目录下的nginx.conf,:

vim /usr/local/etc/nginx/nginx.conf

其中的配置信息如下,一般会默认生成,只需要修改“include servers/*.conf;”一行配置文件位置,该位置可以自定义,另外也可以将server配置内容直接写在这个nginx.conf配置文件里。本人希望将文件添加到/usr/local/etc/nginx/servers,而默认的servers文件夹是不存在的,此时需要创建一个。

#--------------------------------全局块 
#user  nobody; #配置用户或者组,user、administrator、administrators。
# 在配置文件的顶级main部分,代表worker角色的工作进程的个数
worker_processes  1;
# 错误日志, 存放地地址和级别这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
error_log  /usr/local/var/log/nginx/error.log warn;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
# 进程文件存放地址
pid         /usr/local/var/run/nginx.pid;


events {   #---------------------events块
    # accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    # multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    # 写在events部分。每一个worker进程能并发处理(发起)的最大连接数;
    #use epoll;    #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;
}


http {   #-------------------------http块
    # -----------------------------http全局块
    # 文件扩展名与文件类型映射表
    include       mime.types;
    # 设定默认文件类型;
    default_type  application/octet-stream;


    #access_log off; #取消服务日志  
    # 为Nginx服务器设置详细的日志格式;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    #access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息;
    # access log 路径;
    access_log  /usr/local/var/log/nginx/access.log main;


    # 如果port_in_redirect为off时,那么始终按照默认的80端口;如果该指令打开,那么将会返回当前正在监听的端口。
    # port_in_redirect off;

    # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    sendfile        on;
    #tcp_nopush     on;
    #sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    # 连接超时时间,默认为65s,可以在http,server,location块。
    keepalive_timeout  65;

    #gzip  on;
    # 配置信息文件夹,如 Nginx 安装目录不同请自行修改
    include servers/*.conf;
    # include /usr/local/etc/nginx/conf.d/*.conf;
}

3,在/usr/local/etc/nginx/servers文件夹里创建 time_machine.conf(因为本人的项目名为time-machine,为了便于找到对应的配置,所以起名为:time_machine.conf,该名字可以任意起,但是要和nginx.conf里配置的结尾“*.conf”匹配上。

首先项目开启两个服务端口:8081和8082,每个服务端口运行时输出不出的日志,以便于区分调用的是哪个服务。

time_machine.conf配置内容如下:

#这里的域名要和下面proxy_pass的一样,且不能使用下划线,timeMachine不能写成time_machine
upstream  timeMachine.com { #------------------------upstream块
    server    10.240.35.113:8081 weight=1;
    server    10.240.35.113:8082  weight=2 backup; # 热备
    server    10.240.35.113:8084 down; # down表示主机暂停服务
}

server { #---------------------------------------server块
    #-------------------------------------------server全局块
    # keepalive_requests 120; # 单连接请求上限次数
    listen       8083; # 监听端口
    # server_name # 监听地址,写ip地址或主机名都可 
    server_name  10.240.35.113;
    # server_name localhost;

    location / {   # location块,请求的url过滤,正则匹配,如location ~*^.+${}中~为区分大小写,~*为不区分大小写
        proxy_pass http://timeMachine.com;
        proxy_redirect default;
    }

    error_page   500 502 503 504  /50x.html; # 错误页
    location = /50x.html {
        root   html;
    }
}

解释各个块的作用:

     1)全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件 引入,允许生成worker process数等。

     2)events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

     3)http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

     4)server块:配置虚拟主机的相关参数,一个http中可以有多个server。

     5)location块:配置请求的路由,以及各种页面的处理情况。

     6)upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。

对于nginx的基本配置,需要注意的有以下几点:

   1)1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

         2.$remote_user :用来记录客户端用户名称; 

         3.$time_local : 用来记录访问时间与时区;

         4.$request : 用来记录请求的url与http协议;

         5.$status : 用来记录请求状态;成功是200, 

         6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;

         7.$http_referer :用来记录从那个页面链接访问过来的; 

         8.$http_user_agent :记录客户端浏览器的相关信息;

    2)惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。

    3)每个指令必须有分号结束。

4,然后回到/usr/local/etc/nginx/目录,执行 sudo nginx开启nginx服务,或执行sudo nginx -s reload重新启动nginx服务。

5,打开浏览器访问本人的项目接口http://10.240.35.113:8083/milestone/6 

实际上会轮询请求http://10.240.35.113:8081/milestone/6 和 http://10.240.35.113:8082/milestone/6 上的服务

6,  停止Nginx服务:

    命令行进入nginx根目录,执行如下命令,停止服务器:

 # 强制停止nginx服务器,如果有未处理的数据,丢弃
   sudo nginx -s stop
 # 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
   sudo nginx -s quit

二,其它关键问题

1,如果关了8081端口,再多次刷新页面,接下来出现的就会是请求8082上的服务,但是时而快时而慢。这其中原因是当如果nginx将请求转发到8082端口时,服务器会马上跳转成功,但是如果是转到8081端口,因为8081端口已经关闭了,所以会出现一段等待响应过程的过程,要等它失败后才会转到8082端口。
而这个等待响应的时间我们是可以配置的。

这个时间由以下3个参数控制:
proxy_connect_timeout:与服务器连接的超时时间,默认60s
fail_timeout:当该时间内服务器没响应,则认为服务器失效,默认10s
max_fails:允许连接失败次数,默认为1

等待时间 = proxy_connect_timeout + fail_timeout * max_fails

如上配置,即是需要等待3 + 3 x 3 = 12 秒

2、负载均衡策略

1)轮询

这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

2)权重

使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍。

upstream  fengzp.com {   
    server   192.168.99.100:42000 weight=1; 
    server   192.168.99.100:42001 weight=2;  
}

3)最少连接

把请求分配到连接数最少的server

upstream  fengzp.com {   
    least_conn;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

4)ip_hash

每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    ip_hash;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

ip_hash可以和weight结合使用。

5)fair:智能调整调度算法,

动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块

6)url_hash:

url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

三、Nginx相关地址

源码:https://trac.nginx.org/nginx/browser

官网:http://www.nginx.org/

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值