本该简单介绍下nginx在负载均衡方面的使用。
一、说明
以下转载来自nginx Windows版使用说明
nginx的Windows版本使用原生Win32 API(非Cygwin模拟层)。当前nginx/Windows只使用select作为通知方法,所以不要期待它有很高的性能和扩展性。鉴于这点和一些已知问题,nginx/Windows目前还处于beta阶段。nginx/Windows和Unix版本相比,功能几乎已经齐全,除了XSLT过滤器、图像过滤器、GeoIP模块和嵌入Perl语言支持以外。
安装nginx/Windows,需要下载最新的1.7.0开发版本,因为开发分支上包含了所有已知的问题修复,尤其是针对Windows版本的问题修复。解压缩下载得到的zip文件,进入nginx-1.7.0目录,运行nginx。下面给出一个在C盘根目录下安装的例子:
cd c:\
unzip nginx-1.7.0.zip
cd nginx-1.7.0
start nginx
可以在命令行运行tasklist
命令来查看nginx进程:
C:\nginx-1.7.0>tasklist /fi "imagename eq nginx.exe"
Image Name PID Session Name Session# Mem Usage
=============== ======== ============== ========== ============
nginx.exe 652 Console 0 2 780 K
nginx.exe 1332 Console 0 3 112 K
其中一个是主进程,另一个是工作进程。如果nginx没有启动,请查看logs\error.log
文件以寻找失败原因。如果日志文件不存在,那失败原因会记录在Windows事件日志中。如果某次请求没有展示预想的页面,而是展示了错误页面,也请查看logs\error.log
文件。
nginx/Windows使用工作目录作为前缀将配置文件中设置的相对目录补齐。就上面安装的例子而言,工作目录应该是C:\nginx-1.7.0\
(工作目录基本上与运行文件所在的目录相同)。配置文件中的目录请使用“/”,而不是“\”做目录分隔:
access_log logs/site.log;
root C:/web/html;
nginx/Windows作为标准控制台应用运行,而不是系统服务。可以用下面的命令控制:
nginx -s stop | 快速退出 |
nginx -s quit | 优雅退出 |
nginx -s reload | 更换配置,启动新的工作进程,优雅的关闭以往的工作进程 |
nginx -s reopen | 重新打开日志文件 |
二、负载均衡(load balance)
nginx的负载均衡策略有两种:内置策略和扩展策略。
内置策略包含加权轮询和ip hash,默认情况下加权轮询和ip hash这种策略会被编译进nginx的内核里,要使用这种策略,我们只需在配置文件里配置相关的参数即可。
扩展策略有fair、通用hash和consistent hash(一致性hash)等等。扩展策略默认是不编译进nginx内核的。
三、加权轮询(weighted round robin)
nginx默认是使用轮询的策略的。
轮询的原理很简单,首先我们介绍一下轮询的基本流程。如下是处理一次请求的流程图:
图中有两点需要注意,第一,如果可以把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。
upstream test {
server 192.168.0.1 weight=1;
server 192.168.0.2 weight=2;
}
如上配置,3 个请求会有1 个分摊给192.168.0.1,2个请求会分摊给192.168.0.2。
四、ip hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
ip hash是nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是其中的算法和具体的策略有些变化,如下图所示:
ip hash算法的核心实现如下图:
从代码中可以看出,hash值既与ip有关又与后端机器的数量有关。经过测试,上述算法可以连续产生1045个互异的value,这是该算法的硬限制。对此nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时,算法退化成轮询。因此,从本质上说,ip hash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了很深的隐患。
<span style="font-size:12px;"> upstream test{
ip_hash;
server localhost:8080;
server localhost:8088;
} </span>
指定nginx负载均衡器组使用ip hash算法,IPV4的前3个八进制位和所有的IPV6地址被用作一个hash key。这个方法确保了相同ip的请求一直发送到相同的服务器上除非这个服务器被认为是停机。这种情况下,请求会被发送到其他主机上,然后可能会一直发送到这个主机上。
五、配置使用
使用可参考nginx官方使用说明
nginx默认使用轮循方式,检查源服务器是否可用、连接时间的快慢来分发请求。
执行安装目录下的nginx.exe,nginx默认使用config目录下的nginx.conf文件作为配置文件。
若想使用自己的配置文件,可使用nginx -c filename ; 命令启动nginx
其中nginx.conf文件,配置负载均衡,
http {
upstream detecotr_server {
#这里指定多个源服务器,如果不配置负载均衡的策略,nginx会默认使用轮循方式
server 192.168.154.1:8080 weight=1;
server 192.168.154.2:8088 weight=2;
}
server {
listen 80;
server_name 192.168.20.101;
location / {
proxy_pass http://detecotr_server;
}
location /project_name {
proxy_pass http://detecotr_server/project_name;
}
}
}
<span style="font-size:12px;">upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}</span>
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
}
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
server {
...
location /memcached/ {
set $memcached_key $uri;
memcached_pass memcached_backend;
}
}
参考:
Nginx学习之十二-负载均衡-加权轮询策略剖析
http://blog.youkuaiyun.com/xiajun07061225/article/details/9318871nginx负载均衡原理
http://blog.youkuaiyun.com/chabale/article/details/8955280
nginx实现反向代理(可参考相关的配置参数)
http://zhaochen.blog.51cto.com/2029597/379233/
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
http://freeloda.blog.51cto.com/2033581/1288553