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、通过浏览器查看效果
 

目录
相关文章
|
3月前
|
负载均衡 网络协议 Linux
在Linux中,常用WEB服务器负载架构有哪些?
在Linux中,常用WEB服务器负载架构有哪些?
|
3月前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
3月前
|
负载均衡 应用服务中间件 Linux
"揭晓nginx的神秘力量:如何实现反向代理与负载均衡,拯救服务器于水火?"
【8月更文挑战第20天】在Linux环境下,nginx作为高性能HTTP服务器与反向代理工具,在网站优化及服务器负载均衡中扮演重要角色。本文通过电商平台案例,解析nginx如何解决服务器压力大、访问慢的问题。首先介绍反向代理原理,即客户端请求经由代理服务器转发至内部服务器,隐藏真实服务器地址;并给出配置示例。接着讲解负载均衡原理,通过将请求分发到多个服务器来分散负载,同样附有配置实例。实践表明,采用nginx后,不仅服务器压力得到缓解,还提升了访问速度与系统稳定性。
77 3
|
3月前
|
应用服务中间件 Linux 网络安全
在Linux中,如何配置Apache或Nginx Web服务器?
在Linux中,如何配置Apache或Nginx Web服务器?
|
3月前
|
存储 负载均衡 应用服务中间件
FastDFS+Nginx:轻松搭建本地文件服务器
【8月更文挑战第19天】在现今互联网快速发展的时代,文件服务器作为支撑各种在线服务的重要基础设施,其稳定性和性能显得尤为关键。FastDFS作为一款开源的轻量级分布式文件系统,凭借其高效的文件管理功能,特别适合用于构建相册网站、视频网站等以文件为载体的在线服务。本文将详细介绍如何利用FastDFS和Nginx快速搭建一个本地文件服务器,为您的工作和学习提供技术支持。
262 0
|
弹性计算 安全 应用服务中间件
ECS动手搭建Nginx
在ECS的centos7上搭建一个Nginx
2026 7
ECS动手搭建Nginx
|
5天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
37 9
|
2天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
5天前
|
弹性计算 异构计算
2024年阿里云GPU服务器多少钱1小时?亲测价格查询方法
2024年阿里云GPU服务器每小时收费因实例规格不同而异。可通过阿里云GPU服务器页面选择“按量付费”查看具体价格。例如,NVIDIA A100的gn7e实例为34.742元/小时,NVIDIA A10的gn7i实例为12.710156元/小时。更多详情请访问阿里云官网。
36 2
|
11天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
44 3