Nginx 模块开发新手指南

1,277 阅读2分钟

Nginx 模块开发介绍

主流的Nginx模块开发方式一般有两种:

一种是结合Lua语言 openresty

一种是结合JavaScript语言 Nginx JavaScript

同时还有一些采用其他语言的开发方式,eg. Perl , C

本文介绍的是基于C语言的原生Nginx模块开发方式

以下来自官方说明,虽然官方更加推荐采用JavaScript,Lua等高级语言来开发模块,扩展功能,确实采用这些高级语言更加简单高效,但是由于Nginx本身就是C语言开发的,采用C语言来开发模块更能深入学习理解Nginx,所以了解一下C语言原生模块开发的基本知识,有利于深入学习Nginx

Before starting a module, consider the following questions:

  • Is it possible to implement a desired feature using already available modules?
  • Is it possible to solve an issue using built-in scripting languages, such as Perl or njs?

Nginx 模块开发学习路线

前置知识:需要对Nginx有基本的了解,可以配置简单的Nginx服务器

推荐路线:官方开发指南 ——> nginx-dev-examples ——> write the code yourself

首先可以通读一遍 官方开发指南,了解Nginx工作流程 。这篇指南大概有一百页左右,预计读完需要四天的时间。指南前面部分简单介绍Nginx开发环境,重点在于后面这 Modules, HTTP 两部分。

看完官方指南之后接着可以仔细阅读官方的示例 nginx-dev-examples。官方精心编写了 access, append, hello_world, md5, set_header 等示例,建议仔细阅读每个示例,弄清楚每行代码的意思,如果通读过上述官方指南,基本上每行代码一眼就能明白其含义。

最后参考官方示例,自己编写几个例子。到此为止,已经初步入门Nginx模块开发,后续需要继续深入学习哪些知识,此时您应该可以做到心中有数!

Nginx 官方模块学习实践

编译官方模块首先需要搭建起一个Nginx编译环境,具体可以参考 Nginx 源码编译安装

克隆官方模块仓库到本地

hg clone http://hg.nginx.org/nginx-dev-examples

进入Nginx源码模块,配置将模块编译成动态库的形式,这里官方的 hello_world_3 示例来演示

./configure --add-dynamic-module=/home/lotuscc/git_projects/nginx_module/nginx-dev-examples/hello_world_3

编译Nginx, 只编译模块使用 make modules

make

编译完成以后可以在objs目录下看到,已经生成了 ngx_http_hello_world_module.so 动态库

Snipaste_2022-08-01_17-54-45.png

将官方模块配置文件复制到objs目录下,并添加一行加载动态模块

load_module objs/ngx_http_hello_world_module.so;

因为官方配置文件自定义了log位置,所以还需要创建一个logs目录

mkdir logs

启动Nginx

objs/nginx -p "$PWD" -c objs/nginx.conf

测试

Snipaste_2022-08-02_09-40-52.png

关闭

objs/nginx -p "$PWD" -c objs/nginx.conf -s stop

参考资料

Development guide

nginx-dev-examples

零基础开发 nginx 模块