开发一个Nginx模块hello

2023-05-16

开发一个Nginx模块

 

用C语言写一个ngx_http_hello_module.c的文件

 

C代码 

 收藏代码

  1. /* 
     * ngx_http_hello_module.c 
     * 
     *  Created on: Apr 25, 2015 
     *      Author: lizhenbin 
     */  
    #include <ngx_config.h>  
    #include <ngx_core.h>  
    #include <ngx_http.h>  
      
    // 当nginx的配置选项中,出现hello,会调用该方法  
    static char *ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);  
      
    // 定义hello模块的处理函数  
    static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r);  
      
    // 定义一个ngx_command_t数组,并设置在出现hello配置后的  
    // 解析方法ngx_http_hello来作为入口  
    static ngx_command_t ngx_http_hello_commands[] = {  
            {  
                    ngx_string("hello"),  
                    NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,  
                    ngx_http_hello,  
                    NGX_HTTP_LOC_CONF_OFFSET,  
                    0,  
                    NULL  
            },  
            ngx_null_command  
    };  
      
    // 不设置在HTTP初始化完成的,则不需要设置回调函数  
    static ngx_http_module_t ngx_http_hello_module_ctx = {  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL  
    };  
      
    // 定义http的hello模块  
    ngx_module_t ngx_http_hello_module = {  
            NGX_MODULE_V1,  
            &ngx_http_hello_module_ctx,  
            ngx_http_hello_commands,  
            NGX_HTTP_MODULE,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NGX_MODULE_V1_PADDING  
    };  
      
    static char *ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {  
        ngx_http_core_loc_conf_t *clcf;  
      
        // 先找到hello配置项所属的配置项  
        clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);  
      
        // HTTP请求到NGX_HTTP_CONTENT_PHASE阶段时,如果遇到hell配置项所在的配置模块相匹配  
        // 则调用ngx_http_hello_handler函数  
        clcf->handler = ngx_http_hello_handler;  
      
        return NGX_CONF_OK;  
    };  
      
    static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r) {  
      
        // 必须是GET或者HEAD方法,否则返回504  
        if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {  
            return NGX_HTTP_NOT_ALLOWED;  
        }  
      
        // 丢弃请求中的包体  
        ngx_int_t rc = ngx_http_discard_request_body(r);  
        if (rc != NGX_OK) {  
            return rc;  
        }  
      
        // 设置返回值  
        ngx_str_t type = ngx_string("text/plain");  
        ngx_str_t response = ngx_string("hello world, this is my first http module.");  
        r->headers_out.status = NGX_HTTP_OK;  
        r->headers_out.content_length_n = response.len;  
        r->headers_out.content_type = type;  
      
        // 发送HTTP头部  
        rc = ngx_http_send_header(r);  
        // 发送出现错误,处理  
        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {  
            return rc;  
        }  
      
        // 构建ngx_buf_t结构体,准备发送包体  
        ngx_buf_t *b;  
        b = ngx_create_temp_buf(r->pool, response.len);  
        if (b == NULL) {  
            // 500错误  
            return NGX_HTTP_INTERNAL_SERVER_ERROR;  
        }  
      
        // 将内容复制到ngx_buf_t中  
        ngx_memcpy(b->pos, response.data, response.len);  
      
        // 设置last指针  
        b->last = b->pos + response.len;  
        // 声明是最后一块缓冲区  
        b->last_buf = 1;  
      
        // 构造发送时的ngx_chain_t结构体  
        ngx_chain_t out;  
        out.buf = b;  
        out.next = NULL;  
      
        return ngx_http_output_filter(r, &out);  
    };  
      

然后,建立一个config文件,文件和上述的.c文件在同一个目录下面

 

 

C代码 

 收藏代码

  1. ngx_addon_name=ngx_http_hello_module  
  2. HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"  
  3. NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"  

最后,运行三个在linux切换到root下,执行三个命令

C代码 

 收藏代码

  1. ./configure --prefix=/usr/nginx/ --add-module=/home/lizhenbin/workspace/nginx-1.7.12/src/module  
  2. make  
  3. make install  

  

最后到/usr/nginx/conf下配置一个location

C代码 

 收藏代码

  1. /usr/nginx/conf  
  2.   
  3. vim nginx.conf  
  4.   
  5. location /hello {  
  6.               hello;  
  7.          }  
  8.   
  9. /usr/nginx/sbin  
  10. ./nginx  

 

记得把linux的iptables关掉,nginx默认使用80端口

最后输入,IP地址访问即可

C代码 

 收藏代码

  1. http://127.0.0.1/hello  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发一个Nginx模块hello 的相关文章

  • 陀螺仪、加速计、磁力计等传感器汇总

    陀螺仪就是内部有一个陀螺 xff0c 它的轴由于陀螺效应始终与初始方向平行 xff0c 这样就可以通过与初始方向的偏差计算出实际方向 手机里陀螺仪实际上是一个结构非常精密的芯片 xff0c 内部包含超微小的陀螺 加速计是用来检测手机受到的加
  • STM32 HAL库串口+DMA接收不定长数据

    在串口通信中 xff0c 很多时候我们需要的是接收一帧不确定长度的数据 xff0c 而不是单个字节或者固定长度 xff0c 这时我们就需要利用STM32的空闲中断 xff08 IDLE xff09 来实现不定长数据的接收 xff0c 首先我
  • cmake学习之道

    cmke命令格式 cmake 选项 路径 最主要的选项 D 添加变量及值 使用案列 xff08 cmake D ARM BUILD 61 1 xff09 表示在当前路径执行Cmake命令并将ARM BUILD的值传到CMakeLists t
  • 20230312在Ubuntu18.04下的安装Chrome

    20230312在Ubuntu18 04下的安装Chrome 2023 3 12 23 42 百度搜索 xff1a chrome ubuntu 参考资料 xff1a https blog csdn net howard2005 articl
  • ubuntu下查看服务器的CPU详细情况(分色排版)

    https www cnblogs com liuq p 5623565 html 全面了解 Linux 服务器 1 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的CPU详细情况 大文实验室 大文哥 壹捌陆捌零陆捌
  • 为什么.h文件中只能申明不能定义全局变量

    最近使用keil编写下位机单片机程序 xff0c 打算进行模块化的设计 xff0c 遇到了在 h文件中定义全局变量报错的问题 原因 因为C语言的include是直接将文件嵌入到include这个地方的 如果多次包含这个头文件 xff0c 就
  • 跨系统传递 traceId(日志)

    34 新项目查日志太麻烦 xff0c 多台机器之间查来查去 xff0c 还不知道是不是同一个请求的 打印日志时使用 MDC 在日志上添加一个 traceId xff0c 那这个 traceId 如何跨系统传递呢 xff1f 34 1 背景
  • ThreadLocal 适合用在哪些实际生产的场景中?

    在通常的业务开发中 xff0c ThreadLocal有两种典型的使用场景 场景1 xff0c ThreadLocal 用作保存每个线程独享的对象 xff0c 为每个线程都创建一个副本 xff0c 这样每个线程都可以修改自己所拥有的副本 而
  • SpringCloud 分布式事务组件之Seata

    目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好 xff0c 今天给大家分享一个在2022年出去面试Java几乎必问的一个技术 xff0c 那就是seata 什么 xff1f xff1
  • 接口优化方案

    1 批量思想 xff1a 批量操作数据库 优化前 xff1a for循环单笔入库 for TransDetail detail transDetailList insert detail 优化后 xff1a batchInsert tran
  • springboot前端传一个对象后台怎么接受

    34 courseId 34 3 34 userId 34 34 1234456676 34 34 list 34 34 id 34 34 1 34 34 answer 34 34 B 34 34 id 34 34 1 34 34 answ
  • 前端传一个数组或者集合后台怎么接受

    34 id 34 34 1 34 34 answer 34 34 A 34 34 id 34 34 1 34 34 answer 34 34 A 34 这样的可以直接用一个 64 RequesBody List lt QuestionBac
  • Java8处理List的双层循环

    Java处理List的双层循环程序员经常遇到 xff0c 一般都是当两个List某个值满足某条件时候 xff0c 进行相应的处理 xff1b 1 list和map之间的相互转换 两个List对象当id相同的时候 注意是两个对象 而非两个集合
  • java如何抛出异常

    1 什么时候抛出异常 如果你觉得某些 问题 解决不了了 xff0c 那么你就可以抛出异常了 比如 xff0c 你在写一个service 其中在写到某段代码处 你发现可能会产生问题 xff0c 那么就请抛出异常吧 xff0c 相信我 xff0
  • 发送短信验证码过于频繁问题的解决

    1 对请求的接口做了一个限流的控制 2 利用到 AOP redis 定时器 3 在请求的congtroller层上加相应的注解就可以 具体的Demo工程如下 package com weigu xiaochuang project impo
  • spring的controller是单例还是多例

    我们经常说单例还是多例 那么究竟他们不同的根源在哪 或者说我们应该从哪一方面具体的去理解了 至于这个问题 今天做一个小的探讨 其实我们最终说的是 64 auowired注解的引入的service或mapper是不是单例还是多例的 这个是这个
  • 多线程-批量获取多条线程的执行结果

    当向线程池提交callable任务后 xff0c 我们可能需要一次性获取所有返回结果 xff0c 有三种处理方法 方法一 xff1a 自己维护返回结果 创建一个线程池 ExecutorService executorService 61 E
  • nautilus命令介绍

    nautilus 图形化桌面包括了一个叫做 Nautilus 的文件管理器 在GNOME中是Nautilus 鹦鹉螺 xff0c 而KDE中是Konqueror
  • 写个strcat函数

    include 34 stdio h 34 include lt string h gt void stracat char a char b char temp 128 char p 61 temp int alen 61 strlen
  • linux 下 tcp client的 demo

    include lt stdio h gt include lt stdlib h gt include lt string h gt include lt unistd h gt include lt sys socket h gt in

随机推荐

  • 解决MATLAB2020B关于找不到vs2019C++编译器问题

    在配置matlab 深度学习环境过程中 xff0c 出现找不到vs219C 43 43 编译器 问题 xff0c 尝试了各种办法 xff0c 还是失败 xff0c 经过摸索和结合他人经验 xff0c 最终成功 xff0c 予以总结 xff0
  • Ubuntu下使用w3m命令行模式浏览网页

    w3m是一个基于文本的网页浏览器 xff0c 支持多种操作系统 xff0c 在命令行终端可以很好的支持中文 即使在没有鼠标支持的情况下也可以检查网页的输出 我们一般用Ubuntu的X Windows来看图形界面的东西 xff0c 有没有想过
  • CC3D飞控说明书/使用手册

    CC3D飞控说明书 使用手册openpilot librepilot CC硬件配置 记得点赞哦 xff01 xff01 xff01
  • 串口服务器的原理及使用方法

    串口服务器是将来自TCP IP协议的数据包 xff0c 解析为串口数据流 xff1b 反之 xff0c 也可以将串口数据流打成TCP IP协议的数据包 xff0c 从而实现数据的网络传输 它能多个串口设备连接并能将串口数据流进行选择和处理
  • tcpdump命令

    tcpdump tcpdump命令介绍 tcpdump xff0c 用简单的语言概括就是dump the traffic on a network xff0c 是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工
  • 小程序登录后,接口调用失败返回401

    问题描述 xff1a 小程序登录后 xff0c 所有的内部接口不可调用 xff0c 全部授权失败 xff0c 接口返回401 xff1b 解决办法 xff1a 服务端清缓存就可以了 微信开发者工具中 xff0c 小程序多次登录 xff0c
  • 车牌识别算法 基于yolov5的车牌检测+crnn中文车牌识别 支持12种中文车牌识别

    yolov5 车牌识别算法 xff0c 支持12种中文车牌类型 基于yolov5的车牌检测 车牌矫正以及 基于CRNN的车牌识别 1 单行蓝牌 2 单行黄牌 3 新能源车牌 4 白色警用车牌 5 教练车牌 6 武警车牌 7 双层黄牌 8 双
  • LINUX nautilus 命令

    最近使用Ubuntu的时候发现了一个很好用的小命令 xff1a nautilus nautilus是GNOME桌面下的一个文件管理工具 通过这个命令我们可以在终端下非常方便的打开指定目录的文件 nautilus 命令后面一个 xff0c 表
  • 无人机学习之路——电机

    一 什么是电机 xff1f 电机是整个无人机的四肢 xff0c 没有电机来驱动的话整个无人机就无法飞起来 因此我们来重点介绍下电机的一些基础知识 本篇内容不会很详细 xff0c 不会全部介绍 xff0c 只会介绍无人机需要学习的知识 二 电
  • c++中“::”和“:”啥意思

    c 43 43 中 和 啥意思 1 1 类作用域操作符 指明了成员函数所属的类 如 xff1a M f s 就表示f xff08 s xff09 是类M的成员函数 2 表示 域操作符 例 xff1a 声明了一个类A xff0c 类A里声明了
  • python中执行shell脚本之subprocess模块

    一 最近subprocess使用背景和介绍 因为最近领导要求 xff0c 在Python端调用大数据的shell脚本 xff0c 所以需要用到Python来执行shell脚本 因此需要查看下subprocess模块文档 根据官网文档描述 x
  • odroid-xu4(ubuntu mate 16.04)源码编译opencv 3.2

    硬件平台 xff1a odroid xu4 软件环境 xff1a ubuntu mate 16 04 1 更新软件列表 xff1a sudo apt get update 2 安装依赖包 xff1a apt get install libq
  • Pytorch Tensor基本数学运算

    1 加法运算 示例代码 xff1a import torch 这两个Tensor加减乘除会对b自动进行Broadcasting a 61 torch rand 3 4 b 61 torch rand 4 c1 61 a 43 b c2 61
  • HC-SR04超声波测距模块介绍

    超声波简介 超声波是由机械振动产生的 可在不同介质中以不同的速度传播 具有定向性好 能量集中 传输过程中衰减较小 反射能力较强等优点 超声波传感器可广泛应用于非接触式检测方法 它不受光线 被测物颜色等影响 对恶劣的工作环境具有一定的适应能力
  • 操作系统之大端小端

    1 什么是大端 什么是小端 所谓的大端模式 xff0c 是指数据的低位保存在内存的高地址中 xff0c 而数据的高位 xff0c 保存在内存的低地址中 xff1b 所谓的小端模式 xff0c 是指数据的低位保存在内存的低地址中 xff0c
  • 激光雷达授时

    文章目录 前言部分原理图调试微信公众号 前言 给Velodyne的16和32线激光雷达授时 用的是 中科微电子 的 ATGM336H 5N31 部分原理图 部分原理图如下 J9是FAKRA接口 直接挂一个GPS有源天线 出来的TX接一个RS
  • TX2/Xavier Linux GPIO 计算

    目录 Linux GPIO子系统TX2 Linux GPIO计算Xavier Linux GPIO计算参考用C快捷计算TX2 Linux GPIO用C快捷计算Xavier Linux GPIODebug微信公众号 Linux GPIO子系统
  • Android CAN 简记

    文章目录 概要adb 连接adb 常用操作CAN配置脚本SocketCANJNIJNI与SocketCANMakefilejnican java生成的 jnican hjnican c运行github jni can NDKAndroid
  • 在C或C++中如何使用PI(π)值

    span class token macro property span class token directive keyword include span span class token string lt math h gt spa
  • 开发一个Nginx模块hello

    开发一个Nginx模块 用C语言写一个ngx http hello module c的文件 C代码 ngx http hello module c Created on Apr 25 2015 Author lizhenbin includ