Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)

四自由度SCARA机器人的运动学和动力学MATLAB建模与仿真 本文介绍了四自由度SCARA机器人的运动学和动力学建模,使用MATLAB进行了相应的建模与仿真。通过正运动学和动力学分析,可以了解机器人在不同状态下的运动特性和力学特性。这为后续的控制算法设计和性能优化打下了基础。希望本教程对学习SCARA机器人有帮助。 阅读详情

目录

一、代码实例

二、初始化绑定阶段处理

三、回调函数写日志

四、编译调试结果


一、代码实例


HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler》

我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r);

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

static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf);
static ngx_int_t ngx_http_hello_log_handler(ngx_http_request_t *r);

/**
 * 处理nginx.conf中的配置命令解析
 * 例如:
 * location /hello {
 *  	hello
 * }
 * 当用户请求:http://127.0.0.1/hello的时候,请求会跳转到hello这个配置上
 * 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 };

/**
 * 模块上下文
 */
static ngx_http_module_t ngx_http_hello_module_ctx = { NULL, ngx_http_hello_init, NULL, NULL,
		NULL, NULL, NULL, NULL };

/**
 * 模块的定义
 */
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 };

/**
 * 命令解析的回调函数
 * 该函数中,主要获取loc的配置,并且设置location中的回调函数handler
 */
static char *
ngx_http_hello(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);
	/* 设置回调函数。当请求http://127.0.0.1/hello的时候,会调用此回调函数 */
	clcf->handler = ngx_http_hello_handler;

	return NGX_CONF_OK;
}

/**
 * 模块回调函数,输出hello world
 */
static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r) {
	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");
	r->headers_out.status = NGX_HTTP_OK;
	r->headers_out.content_length_n = response.len;
	r->headers_out.content_type = type;

	rc = ngx_http_send_header(r);
	if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
		return rc;
	}

	ngx_buf_t *b;
	b = ngx_create_temp_buf(r->pool, response.len);
	if (b == NULL) {
		return NGX_HTTP_INTERNAL_SERVER_ERROR;
	}

	ngx_memcpy(b->pos, response.data, response.len);
	b->last = b->pos + response.len;
	b->last_buf = 1;

	ngx_chain_t out;
	out.buf = b;
	out.next = NULL;

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                            "hello world ");

	return ngx_http_output_filter(r, &out);
}

/**
 * 初始化
 * 将ngx_http_hello_log_handler挂载到NGX_HTTP_LOG_PHASE日志处理阶段
 */
static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf) {
	ngx_http_handler_pt *h;
	ngx_http_core_main_conf_t *cmcf;

	cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);

	h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);
	if (h == NULL) {
		return NGX_ERROR;
	}

	*h = ngx_http_hello_log_handler;

	return NGX_OK;
}

/**
 * NGX_HTTP_LOG_PHASE日志处理阶段的回调函数å
 */
static ngx_int_t ngx_http_hello_log_handler(ngx_http_request_t *r) {

	/* 仅仅在日志处理阶段,新增加一行日志 */
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                            "hello ==================================> ");

	return NGX_DECLINED;
}

二、初始化绑定阶段处理


我们定义了一个ngx_http_hello_init的方法,主要用于将ngx_http_hello_log_handler函数挂载到NGX_HTTP_LOG_PHASE日志处理阶段

/**
 * 初始化
 * 将ngx_http_hello_log_handler挂载到NGX_HTTP_LOG_PHASE日志处理阶段
 */
static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf) {
	ngx_http_handler_pt *h;
	ngx_http_core_main_conf_t *cmcf;

	cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);

	h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);
	if (h == NULL) {
		return NGX_ERROR;
	}

	*h = ngx_http_hello_log_handler;

	return NGX_OK;
}

其中ngx_http_hello_init方法在模块上下文ngx_http_hello_module_ctx的处理阶段被初始化

/**
 * 模块上下文
 */
static ngx_http_module_t ngx_http_hello_module_ctx = { NULL, ngx_http_hello_init, NULL, NULL,
		NULL, NULL, NULL, NULL };

三、回调函数写日志


回调函数ngx_http_hello_log_handler,主要写一行error的日志

/**
 * NGX_HTTP_LOG_PHASE日志处理阶段的回调函数å
 */
static ngx_int_t ngx_http_hello_log_handler(ngx_http_request_t *r) {

	/* 仅仅在日志处理阶段,新增加一行日志 */
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                            "hello ==================================> ");

	return NGX_DECLINED;
}

四、编译调试结果


因为我们绑定的是日志处理阶段,所以每次对Nginx的HTTP请求,都会回调ngx_http_hello_log_hanlder方法

我们可以看Nginx的日志中发现,我们已经成功了


 

一。CST 电路 微带低通滤波器设计练习 I CST 电路和系统软件功能还是比较强的,我们一起一步一步学习,一起进步。 这个例子出现在CST的电路和系统软件功能(Circuit Simulation & SAM (System Assembly and Modeling) )介绍资料中。本文是用CST2021建模操作仿真到,不同版本在视觉和结果上稍有不同。 利用电路模块可以很快很准确地建立3D微带平面电路,用于仿真滤波器、功分器、巴伦等等。 阅读详情

相关推荐

在Windows 11上用VirtualBox搞定WRF-Hydro 5.2.0:一个水文模型小白的Ubuntu 22.04虚拟机避坑实录

本文详细记录了在Windows 11上使用VirtualBox和Ubuntu 22.04虚拟机成功编译安装WRF-Hydro 5.2.0水文模型的全过程。从虚拟环境配置、依赖库安装到环境变量设置,作者分享了针对Linux新手的实用避坑技巧和关键命令,帮助科研人员高效完成水文模型的环境搭建。

weixin_30733003的博客 354

nginx变量ngx.var

ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash、hash 表查找等过程。 ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)。 使用 ngx.ctx 比 ngx.var 往往是更好的选择。 参考: nginx变量使用方法详解(7):http://www.ttlsa.com/nginx/nginx-var-7/ nginx的ngx.var ngx.ctx ngx.req: https..

u011764940的博客 3080

NeRF必读:Mip-NeRF总结与公式推导

由于远景近景的分辨率不同,导致经典NeRF对于多尺度场景的表达存在明显瑕疵:NeRF对于近景的重建比较模糊而对于远景的重建出现锯齿。简单粗暴的策略是supersampling,但是费时费力。相较于NeRF使用的位置编码(PE)方式,Mip-NeRF提出了积分位置编码的方式(IPE).这种编码方式可以多尺度地描述空间中的信息分布,make sense.

i_head_no_back的博客 6078

代码审计与web安全第四章作业SQL注入

代码审计与web安全第四章作业

m0_72471315的博客 2128

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2054

单总线CPU设计(变长指令周期3级时序)(HUST)(头歌实验)

利用比较器等功能模块将32位MIPS 指令字译码生成LW、SW、BEQ、SLT、ADDI、OtherInstr信号也就是利用比较器将指令字转换为译码信号,OP与不同信号对应(查询MIPS手册得知) 16 进制 :23 是 2进制: 00100011 ,把获得的OP,Func,和常数比对,相同输出1.按照题目要求填写表格,使用logisim的组合逻辑电路分析功能,当然也可以直接再logisim中写真值表。单总线采用变长指令周期,不同指令周期数不同,节拍数可变化。写的excel表格最终生成电路(当然 需要先把

xuxuaifeifei的博客 1万+

nginx加载var变量

ssl的var变量由数组ngx_http_ssl_vars定义,在ngx_http_ssl_add_variables中调用,该函数执行时间是读取conf配置前置操作,ngx_http_ssl_add_variables主要操作就是挂载变量的get_handler和data函数,并在调用ngx.var.xxx执行get_handler函数。var_get 通过核心函数ngx_lua_ffi_var_get,调用上述注册的get handler 函数,获取变量的值。首先ngx.var变量名结构体定义如下。

shuzishiyingzhong的博客 1023

欢乐熊大话蓝牙知识16:蓝牙是怎么找设备的?扫描与广播的“对话内幕”

蓝牙是怎么找设备的?扫描与广播的对话技术介绍

hoony123的博客 1381

带你全面认识Nginx

Nginx特点Nginx作用Nginx安装Nginx应用核心概念动态代理反向代理动静分离负载均衡 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。 Nginx作用 Nginx的最重要的几个使用场景:

weixin_44132327的博客 844

CST 仿真_NFC仿真

在CST中实现NFC天线单体的仿真

qq_43706810的博客 3961

Python爬虫实战:用Selenium+ChromeDriver批量抓取政府网站政策文件(附完整代码)

本文详细介绍了使用Python的Selenium和ChromeDriver进行政府网站政策文件批量抓取的实战技巧。从环境配置、动态页面元素定位到分页机制破解和反爬虫策略,提供了完整的解决方案和代码示例,帮助开发者高效获取结构化政策数据。

weixin_42531710的博客 265

Nginx配置详解

自学资料

qq_44287299的博客 350

087、DAMO-YOLO Efficient-RepGFPN:重参数化加皇后融合加黄金分割的创新 Neck

DAMO-YOLO的Efficient-RepGFPN创新性Neck结构摘要: 该结构通过三重创新提升目标检测性能: 重参数化卷积:训练时多分支(3x3卷积+1x1卷积+BN分支)提升特征表达能力,推理时合并为单路3x3卷积保证效率; 皇后融合机制:采用可学习权重对不同尺度特征进行自适应加权融合,而非简单相加,通过Softmax归一化权重实现特征选择; 黄金分割连接:优化特征金字塔层间连接方式,按比例分配相邻层特征权重(如P3:P5≈0.618:0.382),减少冗余连接噪声。 实验表明,该结构有效解决了传

ai技术增长的博客 102

Nginx源码分析(25篇)

Nginx源码分析 - 初探Nginx的架构 Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c Nginx源码分析 ......

奇华资料的博客 9万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Nginx 源码分析

nginx.caspect:constants:nginx.hfilter:fixture:lang:runtime:tools:

zjw12221的专栏 1136

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深入理解nginx mp4流媒体模块[上]

本文通过对nginx mp4模块的源码分析,来学习nginx mp4模块的功能和实现原理。 并对mp4格式的分析有一个更加深入的了解。

一个致力于开源代码学习、分析和交流的博客 2478

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Nginx源码分析(25篇),【设计思想解读开源框架】

加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84265751的博客 809

nginx源码分析--多阶段请求处理

读取完请求头后,nginx进入请求的处理阶段。简单的情况下,客户端发送过的统一资源定位符(url)对应服务器上某一路径上的资源,web服务器需要做的仅仅是将url映射到本地文件系统的路径,然后读取相应文件并返回给客户端。但这仅仅是最初的互联网的需求,而如今互联网出现了各种各样复杂的需求,要求web服务器能够处理诸如安全及权限控制,多媒体内容和动态网页等等问题。这些复杂的需求导致web服务器不再是一

鱼思故渊的专栏 1435

nginx源码分析--模块分类

ngx-modules Nginx 主要的模块大致可以分为四类: handler – 协同完成客户端请求的处理、产生响应数据。比如模块, ngx_http_rewrite_module, ngx_http_log_module, ngx_http_static_module。 filter – 对 handler 产生的响应数据做各种过滤处理。比如模块, ngx_http_n

鱼思故渊的专栏 2130

nginx slice模块的使用和源码分析

nginx slice 切片模块的使用和源代码详细分析

一个致力于开源代码学习、分析和交流的博客 1476

Nginx源码分析—架构设计思想

Nginx源码分析—架构设计思想 我任务nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx。          至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩

鱼思故渊的专栏 2482

ffmpeg nginx flv_nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译...

weixin_39702400的博客 116

nginx 源码分析:http 请求处理流程——请求处理的 11 个阶段

nginx 将处理 http 的请求分为 11 个阶段,每个阶段的作用不同,内置的一些模块都在不同的阶段实现它们的功能。这些阶段定义为如下的枚举类型: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, NGX_HTTP_SERVER_REWRITE_PHASE, NGX_HTTP_FIND_CONFIG_PHASE, NG...

alenliu's blog 1974
上一篇: Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)
下一篇: 转载和积累系列 - 分析服务器日志常用命令
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值