关于nginx的安装和基本配置请参考nginx(http://seanlook.com/2015/05/17/nginx-install-and-config),本文在原基础上完成以下几个功能:
1. 安装及模块说明上面提到的3个模块都属于第三方扩展模块,需要提前下好源码,然后编译时通过--add-moudle=src_path一起安装。 注意:
编译示例:(CentOS 6.5 x86_64, nginx 1.6.3) 如果你想在已安装好的nginx上添加第三方模块,依然需要重新编译,但为了不覆盖你原有的配置,请不要make install,而是直接拷贝可执行文件: 2. nginx-sticky-module项目地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng 这个模块的作用是通过cookie黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个backend servers的session同步的问题 因为不再需要同步,而RR轮询模式必须要运维人员自己考虑session同步的实现。 另外内置的 ip_hash 也可以实现根据客户端IP来分发请求,但它很容易造成负载不均衡的情况,而如果nginx前面有CDN网络或者来自同一局域网的访问,它接收的客户端IP是一样的,容易造成负载不均衡现象。淘宝Tengine的 ngx_http_upstream_session_sticky_module 也是类似的功能。nginx-sticky-module的cookie过期时间,默认浏览器关闭就过期,也就是会话方式。 这个模块并不合适不支持 Cookie 或手动禁用了cookie的浏览器,此时默认sticky就会切换成RR。它不能与ip_hash同时使用。 2.1 sticky配置 配置起来超级简单,一般来说一个sticky指令就够了。 sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];:
你在查看官方文档可能会注意到里面也有个 sticky 指令,要说它们的作用几乎是一样的,但是你可能注意到This directive is available as part of our commercial subscription的说明 这是nginx商业版本里才有的特性。包括后面的check指令,在nginx的商业版本里也有对应的health_check(配在 location )实现几乎一样的监控检查功能。 2.2 load-balance其它调度方案 这里顺带介绍一下nginx的负载均衡模块支持的其它调度算法:
3. 负载均衡与健康检查严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问。 3.1 load-balance示例
3.2 nginx_upstream_check_module nginx_upstream_check_module 是专门提供负载均衡器内节点的健康检查的外部模块,由淘宝的姚伟斌大神开发,通过它可以用来检测后端 realserver 的健康状态。如果后端 realserver 不可用,则后面的请求就不会转发到该节点上,并持续检查几点的状态。在淘宝自己的 tengine 上是自带了该模块。项目地址:https://github.com/yaoweibin/nginx_upstream_check_module 下面的是一个带后端监控检查的 nginx.conf 配置: 上面配置的意思是,对name这个负载均衡条目中的所有节点,每个5秒检测一次,请求2次正常则标记 realserver状态为up,如果检测 3 次都失败,则标记 realserver的状态为down,超时时间为1秒。 check指令只能出现在upstream中:
如果 type 为 http ,你还可以使用check_http_send来配置http监控检查包发送的请求内容,为了减少传输数据量,推荐采用 HEAD 方法。当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如: HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n 。当采用 GET 方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。 check_http_expect_alive指定HTTP回复的成功状态,默认认为 2XX 和 3XX 的状态是健康的。 4. nginx的proxy缓存使用nginx的页面缓存功能与上面的负载均衡和健康检查是没有关系的,放在这里一是因为懒得再起一篇文章,二是再有load-balance的地方一般都会启用缓存的。 缓存也就是将js、css、image等静态文件从tomcat缓存到nginx指定的缓存目录下,既可以减轻tomcat负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。(这里有篇 文章,对比使用缓存、不使用缓存、使用动静分离三种情况下,高并发性能比较。使用代理缓存功能性能会高出很多倍) 说明
关于缓存的失效期限上面有三个选项:X-Accel-Expires、inactive、proxy_cache_valid、expires,它们之间是有优先级的,按上面的顺序如果在header里设置 X-Accel-Expires 则它的优先级最高,否则inactive优先级最高。更多资料请参考nginx缓存优先级。 http://www.ttlsa.com/nginx/nginx-cache-priority/ http://fann.im/blog/2014/12/09/nginx-proxy_cache_valid/ 清除缓存 上述配置的proxy_cache_purge指令用于方便的清除缓存,但必须按照第三方的 ngx_cache_purge 模块才能使用,项目地址:https://github.com/FRiCKLE/ngx_cache_purge/ 。 使用 ngx_cache_purge 模块清除缓存有2种办法(直接删除缓存目录下的文件也算一种办法): 1:echo发送PURGE指令 proxy_cache_purge PURGE from 127.0.0.1表示只允许在来自本地的清除指令 2:GET方式请求URL 即使用配置文件中的location ~ /purge(/.*),浏览器访问http://ittest.example.com/purge/your/may/path来清除缓存,或者echo -e 'GET /purge/ HTTP/1.0\r\n' | nc ittest.example.com 80 参考official documentation(http://nginx.org/en/docs/http/ngx_http_upstream_module.html) Nginx实战系列之功能篇后端节点健康检查(http://nolinux.blog.51cto.com/4824967/1594029) Tengine nginx_upstream_check_module(http://tengine.taobao.org/document_cn/http_upstream_check_cn.html) nginx反向代理tomcat集群做负载均衡缓存(http://quenlang.blog.51cto.com/4813803/1570352) web内容缓存 nginx高性能缓存详解(http://www.ttlsa.com/nginx/nginx-high-performance-caching/) 使用nginx sticky实现基于cookie的负载均衡(http://www.ttlsa.com/nginx/nginx-modules-nginx-sticky-module/) 原文链接地址:http://seanlook.com/2015/05/22/nginx-cache-check/ 加入运维帮运维帮已开通多个微信群供大家交流学习,需要先加南非蜘蛛微信 (yunweibang008)后拉你入群。 会员讨论群:总群1、总群2、总群3 地方讨论群:北京、上海、广州、深圳、杭州、成都 软件讨论群:Nginx、Zabbix QQ讨论群:186356564 点击最下方{阅读原文}注册运维帮会员,享受会员专属礼遇 快乐分享,欢迎投稿 加我为好友,扫码下方二维码 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|