nginx下sysgurad模块防止高负载的解决方案

如果nginx被攻击或者访问量突然变大,nginx会因为负载变高或者内存不够用导致服务器宕机,最终导致站点无法访问。今天要谈到的解决方法来自淘宝开发的模块nginx-http-sysguard,主要用于当负载和内存达到一定的阀值之时,会执行相应的动作,比如直接返回503,504或者其他的.一直等到内存或者负载回到阀值的范围内,站点恢复可用。简单的说,这几个模块是让nginx有个缓冲时间,缓缓.

1. 安装nginx sysguard模块

1.1 下载文件

 代码如下 复制代码

 
# wget http://nginx.org/download/nginx-1.4.2.tar.gz
# wget https://github.com/alibaba/nginx-http-sysguard/archive/master.zip
-O nginx-http-sysguard-master.zip
# unzip nginx-http-sysguard-master.zip
# tar -xzvf nginx-1.4.2.tar.gz

1.2 打sysgrard补丁
这边没找到nginx-1.4.2对应的补丁,只有1.2.9和1.3.9的,索性试试1.3.9的吧,应该差不多.
 

 代码如下 复制代码
# cd nginx-1.4.2
# patch -p1 < ../nginx-http-sysguard-master/nginx_sysguard_1.3.9.patch

1.3 安装nginx

 代码如下 复制代码
# ./configure --prefix=/usr/local/nginx-1.4.2
--with-http_stub_status_module --add-module=../nginx-http-sysguard
# make
# make install

2. sysguard指令
语法: sysguard [on | off]
默认值: sysguard off
配置段: http, server, location
开关模块

语法: sysguard_load load=number [action=/url]
默认值: none
配置段: http, server, location
指定负载阀值,当系统的负载超过这个值,所有的请求都会被重定向到action定义的uri请求中.如果没有定义URL action没有定义,那么服务器直接返回503

语法: sysguard_mem swapratio=ratio% [action=/url]
默认值: none
配置段: http, server, location
定义交换分区使用的阀值,如果交换分区使用超过这个阀值,那么后续的请求全部被重定向到action定义的uri请求中.如果没有定义URL action没有定义,那么服务器直接返回503

语法: sysguard_interval time
默认值: sysguard_interval 1s
配置段: http, server, location
定义系统信息更新的频率,默认1秒.

语法: sysguard_log_level info | notice | warn | error
默认值: sysguard_log_level error
配置段: http, server, location
定义sysguard的日志级别

3. sysguard使用实例
3.1 nginx配置
 

 代码如下 复制代码
server {
    listen       80;
    server_name  www.111cn.net www.heytool.com;
    access_log  /data/logs/nginx/www.111cn.net.access.log  main;
 
    index index.html index.php index.html;
    root /data/site/www.111cn.net;
 
    sysguard on;
    # 为了方便测试,load阀值为0.01,平时大家一般都在5或10+
    sysguard_load load=0.01 action=/loadlimit;
    sysguard_mem swapratio=20% action=/swaplimit;
 
    location / {
 
    }
 
    location /loadlimit {
        return 503;
    }
 
    location /swaplimit {
        return 503;
    }
}

3.2 测试
负载OK的情况下,访问nginx

 

 代码如下 复制代码

# uptime
 16:23:37 up 6 days,  8:04,  2 users,  load average: 0.00, 0.01, 0.05
# curl -I www.111cn.net
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 03 Oct 2013 16:27:13 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive

因为站点下没有文件,所以返回了403,实际上没关系.

负载超过阀值的情况下,访问nginx

 代码如下 复制代码
 
# uptime
 16:25:59 up 6 days,  8:06,  2 users,  load average: 0.05, 0.04, 0.05
# curl -I www.111cn.net
HTTP/1.1 503 Service Temporarily Unavailable
Server: nginx
Date: Thu, 03 Oct 2013 16:26:19 GMT
Content-Type: text/html
Content-Length: 206
Connection: keep-alive

swap超过阀值的功能我就不再测试了。大家回家可以自己动手测试一下.

结束语
在nginx是realserver的情况下,个人也比较推荐使用这种方法,如果服务器负载一旦爬高,一般要比较长的时间才能恢复到正常水平,在采用这个插件的情况下,负载达到阀值,nginx返回503,前段使用故障转移将请求发往其他服务器,这台服务器在无访问的情况下,便能很快的恢复到正常水平,并且能够立即投入工作。超过阀值的服务器处理请求速度也会大打折扣,使用这个模块,巧妙的将请求发送到了更快速的服务器上,在一定程度上避免了访问速度慢的问题. 前面说的是在集群环境下,在单点环境下,用不用大家斟酌一下。

时间: 2024-07-30 19:01:36

nginx下sysgurad模块防止高负载的解决方案的相关文章

详解Nginx服务器中配置Sysguard模块预防高负载的方案_nginx

nginx做为HTTP服务器,有以下几项基本特性: 处理静态文件,索引文件以及自动索引:打开文件描述符缓冲. 无缓存的反向代理加速,简单的负载均衡和容错. FastCGI,简单的负载均衡和容错. 模块化的结构.包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter.如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待. Nginx专为性能优化而开发,性能是其最重要的考量,实

Nginx下HttpImageFilterModule模块安装实现缩略图服务器

HttpImageFilterModule用来处理转换图片(JPEG.GIF和PNG),是nginx自带的模块,默认不会开启,需要在编译安装的时候加上参数–with-http_image_filter_module 安装还是很简单的,默认HttpImageFilterModule模块是不会编译进nginx的,所以要在configure时候指定 ./configure arguments: --prefix=/usr/local/nginx --with-http_image_filter_mod

Nginx下proxy_set_header 模块代码

前言:由于新注册的腾讯企业邮箱已经无法绑定域名(之前绑定的依然可以使用),因此采用nginx模块来强制转向! 代码:     server { listen       80; server_name  mail.t4x.org; rewrite ^/(.*)$ https://mail.t4x.org/$1 permanent; location / {     root   /site/t4x.org/mail;     index  index.html index.htm; } erro

nginx下nginx_upload_module模块传递GET参数

下面我解决nginx_upload_module使用GET传参的方法公布出来,希望能够帮助到和我一样需求的朋友! 修改nginx配置文件(程序站点配置文件test.conf)  代码如下 复制代码 location /upload_waynerqiu { upload_pass_args on; upload_resumable on; upload_pass /up_test.php?$args; #此处省略掉详细配置- } html表单代码(up_test.php,此页面即作为表单页同时也负

网站架构需要高负载的解决方案

问题描述 1    硬件环境部署机构项目是一个电子商务,下面的架构能否满足可扩展性?F5是负载交换机,已有,不用考虑成本:WEB1和WEB2是web服务器:Ap1和Ap2是应用服务器:使用Jboss,考虑到性能问题(据说java的应用不建议超过1G内存),需要在ap1和ap2上各运行8个Jboss服务:F5会把一个虚拟ip自动分发到WEB1和WEB2两台web服务器上:WEB1的应用请求会发到Ap1上:WEB2的应用请求会发到Ap2上: 2    问题Web服务器上传的内容怎么同步:Ap1和ap

win7 ghost纯净版系统下cpu占用过高的完美解决方案

  1.病毒木马造成的 大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下. 可以使用最新的杀毒软件在DOS模式下进行杀毒.经常性更新升级杀毒软件和防火墙,加强防毒意识. 2.点击win7系统中的开始->运行->msconfig->启动,关闭不必要的启动项,重启计算机. 3.可能是驱动没有经过认证,造成CPU资源占用过高 大量的测试版的驱动在网上泛滥,就会造成了难以发现的故障原因,建议下载有经过认证的驱动. 4.某些防.杀毒软件造成故障 因为一些防.杀毒软加入了对网页.插件.

Nginx下proxy

 下文给各位重点介绍Nginx下proxy_set_header 模块代码,脚面要了解的朋友不防进入看看吧.     前言:由于新注册的腾讯企业邮箱已经无法绑定域名(之前绑定的依然可以使用),因此采用nginx模块来强制转向! 代码:     server { listen       80; server_name  mail.t4x.org; rewrite ^/(.*)$ https://mail.t4x.org/$1 permanent; location / {     root  

使用Node.js配合Nginx实现高负载网络

  这篇文章主要介绍了使用Node.js配合Nginx实现高负载网络,Node的异步加上Nginx的反向代理在性能上实在是给力!需要的朋友可以参考下 在搭建高吞吐量web应用这个议题上,NginX和Node.js可谓是天生一对.他们都是基于事件驱动模型而设计,可以轻易突破Apache等传统web服务器的C10K瓶颈.预设的配置已经可以获得很高的并发,不过,要是大家想在廉价硬件上做到每秒数千以上的请求,还是有一些工作要做的. 这篇文章假定读者们使用NginX的HttpProxyModule来为上游

PHP高并发高负载系统架构例子

1.为什么要进行高并发与高负载的研究 2.高并发和高负载的约束条件 3.解决之道--硬件篇 4.解决之道--部署篇 5.解决之道--环境篇 6.解决之道--SiteEngine篇 7.解决之道--测试篇 1.为什么要进行高并发和高负载的研究 1.1.产品发展的需要 1.2.公司发展的需要 1.3.当前形式决定的 2.高并发和高负载的约束条件 2.1.硬件 2.2.部署 2.3.操作系统 2.4.Web 服务器 2.5.PHP 2.6.MySQL 2.7.测试 3.解决之道--硬件篇 处理能力的提