nginx入门

本该简单介绍下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 name {...}
default:-
所属指令:http
 
定义一组用于实现nginx负载均衡的服务器,它们可以侦听在不同的端口。另外,可以混合使用侦听TCP与UNIX-domain套接字文件。
 
例子:
 upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
}


默认情况下,请求被分散在使用加权轮询的nginx负载均衡服务器上。在上面的例子中,每七个请求按下面分配:五个请求发送给backend1.example.com,127.0.0.1:8080和unix:/tmp/backend3各自分配一个。如果在于服务器通信时发生了一个错误,这个请求会被传递给下一个服务器,以此类推至道所有的功能服务器都尝试过。如果不能从所有的这些nginx负载均衡服务器上获得回应,客户端将会获得最后一个链接的服务器的处理结果。

语法:server 地址 [参数];
default:-
所属指令:upstream
 
设置一个nginx负载均衡服务器的地址和其他参数。一个地址可以被指定为域名或IP地址,和一个可选的端口,或者被定为UNIX-domain套接字文件的路径,使用"unix:"作为前缀。如果端口没指定,则使用80端口。一个被解析到多个IP地址的域名本质上指定了多个服务器。
 
可以定义下面的参数:
 
weight=number 设置服务器的权限,默认是1
max_fails=number
  设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求
  都失败了,那么认为该服务器会被认为是停机了,停机时间是fail_timeout设置的时间。默认情况下,
  不成功连接数被设置为1。被设置为零则表示不进行链接数统计。那些连接被认为是不成功的可以通过
  proxy_next_upstream, fastcgi_next_upstream,和memcached_next_upstream指令配置。http_404
  状态不会被认为是不成功的尝试。
fail_timeout=time, max_fails次失败后,暂停的时间
  默认情况下,超时时间被设置为10S,设置多长时间内失败次数达到最大失败次数会被认为服务器停机了,服务器会被认为停机的时间长度
 
backup
  标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
 
down
  标记服务器永久停机了;与指令ip_hash一起使用。
 
例子:
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;
}


语法:ip_hash;
default:-
所属指令:upstream

指定nginx负载均衡器组使用基于客户端ip的负载均衡算法。IPV4的前3个八进制位和所有的IPV6地址被用作一个hash key。这个方法确保了相同客户端的请求一直发送到相同的服务器上除非这个服务器被认为是停机。这种情况下,请求会被发送到其他主机上,然后可能会一直发送到这个主机上。

  注意:在版本1.3.2中开始支持IPV6地址。

如果nginx负载均衡器组里面的一个服务器要临时移除,它应该用参数down标记,来防止之前的客户端IP还往这个服务器上发请求。

例子:
upstream backend {
    ip_hash;
 
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}
  注意:在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)

语法:keepalive 连接数;
default:-
所属模块:upstream
这个指令在版本1.1.4中出现

nginx负载均衡器的活动链接数缓存。

连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。

应该注意:keepalive指令不限制nginx工作进程可以连接到nginx负载均衡器可以开启的最大公工作进程,如果
有需要的话,新进程还是会被发起。连接数应该被设置足够低来满足nginx负载均衡器处理新进的连接。

带有持续连接(keepalive connections)的memcached upstream的配置例子
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/9318871

nginx负载均衡原理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值