nginx改造“显示当前服务器的负载”

简介:       博文题目之所以用改造,而没有用模块开发之类等。只是个人觉得本篇博文并未上升到真正的开发高度,而是在看懂前人代码的基础上,增加代码或者修改代码。使其更加完善,跟业务结合的更完美,效率更高。
      博文题目之所以用改造,而没有用模块开发之类等。只是个人觉得本篇博文并未上升到真正的开发高度,而是在看懂前人代码的基础上,增加代码或者修改代码。使其更加完善,跟业务结合的更完美,效率更高。小小的改造放置于此,贵在一个思路,详情如下:
     

1、硬件环境:

   联想R430X 2U服务器

 

2、软件环境

   centos6.2 2.6.32-220.el6.x86_64

   nginx-1.0.10.tar.gz

3、所用配置文件关键部分

daemon off;  #注意关闭daemon模式
server


  {

    listen       8100;

    server_name  www.nginx.com 192.168.15.127;

    index index.html index.htm;

    root  /data0/htdocs/www;

    location /ok{

    load_status on;

    }

  }

4nginx模块目录

   cd /home/xuekun/nginx

   mkdir ngx_module_load

5、编辑nginx模块的编译相关文件(config)

 

[root@centos6 nginx]# cat ngx_module_load/config

ngx_addon_name=ngx_module_load

HTTP_MODULES="$HTTP_MODULES ngx_module_load"

NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_module_load.c"

CORE_LIBS="$CORE_LIBS "

6、模块源码文件

#include

#include

#include

#include

 

static char *ngx_http_set_status(ngx_conf_t *cf, ngx_command_t *cmd,

                void *conf);

 

static ngx_int_t ngx_load_average(ngx_int_t aload[], ngx_int_t nelem);

static ngx_command_t  ngx_load_commands[] = {

 

        { ngx_string("load_status"),

                NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,

                ngx_http_set_status,

                0,

                0,

                NULL },

 

        ngx_null_command

};

static ngx_http_module_t  ngx_load_module_ctx = {

        NULL,                                  /* preconfiguration */

        NULL,                                  /* postconfiguration */

 

        NULL,                                  /* create main configuration */

        NULL,                                  /* init main configuration */

 

        NULL,                                  /* create server configuration */

        NULL,                                  /* merge server configuration */

 

        NULL,                                  /* create location configuration */

        NULL                                   /* merge location configuration */

};

 

ngx_module_t  ngx_module_load = {

        NGX_MODULE_V1,

        &ngx_load_module_ctx,      /* module context */

        ngx_load_commands,              /* module directives */

        NGX_HTTP_MODULE,                       /* module type */

        NULL,                                  /* init master */

        NULL,                                  /* init module */

        NULL,                                  /* init process */

        NULL,                                  /* init thread */

        NULL,                                  /* exit thread */

        NULL,                                  /* exit process */

        NULL,                                  /* exit master */

        NGX_MODULE_V1_PADDING

};

 /*获取系统负载*/

static ngx_int_t ngx_load_average(ngx_int_t aload[], ngx_int_t nelem)

{

        ngx_int_t i;

        double      loadavg[3];

        getloadavg(loadavg, nelem);

        for (i = 0; i

                aload[i] = loadavg[i] * 1000;

        }

        return NGX_OK;

}

static ngx_int_t ngx_load_handler(ngx_http_request_t *r)

{

        size_t             size;

        ngx_int_t          rc;

        ngx_buf_t         *b;

        ngx_chain_t        out;

        /*load value*/

        ngx_int_t          load;

 

        if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) {

                return NGX_HTTP_NOT_ALLOWED;

        }

 

        rc = ngx_http_discard_request_body(r);

 

        if (rc != NGX_OK) {

                return rc;

        }

 

        ngx_str_set(&r->headers_out.content_type, "text/plain");

    /*get loadavg*/

        ngx_load_average(&load, 1);

 

        if (r->method == NGX_HTTP_HEAD) {

                r->headers_out.status = NGX_HTTP_OK;

 

                rc = ngx_http_send_header(r);

 

                if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {

                        return rc;

                }

        }

        size = sizeof("Current loadavg:  \n") + NGX_ATOMIC_T_LEN;

 

        b = ngx_create_temp_buf(r->pool, size);

        if (b == NULL) {

                return NGX_HTTP_INTERNAL_SERVER_ERROR;

        }

 

        out.buf = b;

        out.next = NULL;

 

        b->last = ngx_sprintf(b->last, "Current loadavg:%1.3f\n", load * 1.0 / 1000);

 

        r->headers_out.status = NGX_HTTP_OK;

        r->headers_out.content_length_n = b->last - b->pos;

 

        b->last_buf = 1;

 

        rc = ngx_http_send_header(r);

 

        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {

                return rc;

        }

 

        return ngx_http_output_filter(r, &out);

 

}

 

static char *ngx_http_set_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

        ngx_http_core_loc_conf_t  *clcf;

 

        clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

        clcf->handler = ngx_load_handler;

 

        return NGX_CONF_OK;

}

 

7configuremake

   cd nginx-1.0.10

   ./configure --add-module=/home/xuekun/ngx_module_load/
8 、运行 nginx
./objs/nginx -c /home/xuekun/cstudy/nginx/nginx-1.0.10/conf/nginx.conf
9、通过浏览器查看效果
 

目录
相关文章
|
2月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
138 61
|
19天前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
68 9
|
2月前
|
负载均衡 应用服务中间件 数据库
Nginx负载过高,加机器就能解决吗?
一个架构难题的剖析:A机器顶不住,加B机器就能解决吗?
40 7
|
1月前
|
存储 编解码 应用服务中间件
使用Nginx搭建流媒体服务器
本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细阐述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步骤,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
147 1
|
5月前
|
负载均衡 网络协议 Linux
在Linux中,常用WEB服务器负载架构有哪些?
在Linux中,常用WEB服务器负载架构有哪些?
|
5月前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
应用服务中间件 nginx
Nginx服务器的反向代理proxy_pass配置方法讲解
 Nginx服务器的反向代理proxy_pass配置方法讲解 这篇文章主要介绍了Nginx服务器的反向代理proxy_pass配置方法讲解,包括经常被提到的url的/问题的相关说明,需要的朋友可以参考下 就普...
5142 0
|
应用服务中间件 nginx
nginx服务器的反向代理proxy_pass配置方法
nginx服务器的反向代理proxy_pass配置方法
371 0
|
应用服务中间件 nginx
【转】Nginx服务器的反向代理proxy_pass配置方法讲解
【转】Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.
1286 0