一,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/