当前位置: 首页 > news >正文

Nginx 功能扩展与二次开发实践

一、添加 echo 模块扩展功能

1.1.实验目的

通过为 Nginx 添加第三方 echo-nginx-module 模块,实现直接在配置中输出变量(如请求路径、客户端信息)或自定义文本的功能,简化调试过程(无需依赖后端程序即可查看请求细节),扩展 Nginx 的响应处理能力。

1.2.echo 模块的核心作用

echo-nginx-module 是 Nginx 的一个第三方扩展模块,主要功能是在 Nginx 响应中直接输出文本、变量或执行简单逻辑,无需通过后端服务(如 PHP、Python)即可返回内容。其核心价值:

  • 快速调试:直接输出请求相关变量(如 $uri、$http_user_agent),查看请求细节;

  • 简化响应:返回简单文本(如状态提示、变量值),无需编写额外后端代码;

  • 灵活扩展:结合 Nginx 变量系统,实现动态响应(如根据客户端信息返回不同内容)。

1.3.部署

nginx -s stop                               # 先停止 nginx
​
cd /mnt/nginx-1.26.1/                       # 进入 Nginx 源码目录(之前编译 Nginx 时的源码路径)
make clean                                  # 清理之前的编译产物(如目标文件、中间文件),避免旧配置干扰新编译
​
./configure --prefix=/usr/local/nginx \     # 执行此命令需要到 /mnt/nginx-1.26.1/ 目录下
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre --with-stream \
--with-stream_ssl_module \
--add-module=/mnt/echo-nginx-module-0.63cd /mnt/nginx-1.26.1/objs/                  # 进入编译生成的目标文件目录(configure 后会在 objs/ 目录生成新的 nginx 执行文件)
cp nginx /usr/local/nginx/sbin/nginx        # 复制新编译的 nginx 执行文件到安装目录(覆盖旧文件)
​
cd /usr/local/nginx/sbin/nginx              # 进入 Nginx 执行文件目录
nginx                                       # 启动 nginxnginx -V                                    # 查看 Nginx 版本及编译参数(验证模块是否添加)

1.4.验证

看到添加的模块,则更新成功。

vim /usr/local/nginx/conf.d/haha.conf 
##########
server {listen  80;server_name www.haha.org;root        /web/html;index       index.html;
​location /vars {default_type text/html;         # 设置该路径下默认的响应内容类型为 text/htmlecho $uri;                      # 输出当前请求的 URI 路径echo $http_user_agent;          # 输出客户端的 User-Agent 信息}
}
##########

1.5.总结

为什么这样配置?核心价值

  • 扩展 Nginx 功能:原生 Nginx 无法直接输出变量,echo 模块填补了这一空白,使其能独立完成简单的响应输出,无需依赖后端服务;

  • 简化调试流程:通过输出 $uri、$http_user_agent 等变量,可快速验证请求路径是否正确、客户端信息是否被正确识别(如反向代理场景中验证真实 IP);

  • 灵活响应场景:可用于返回简单状态(如 echo "OK";)、动态拼接内容(如 echo "Hello, $remote_addr"; 输出客户端 IP),适合轻量场景。

注意事项

  • 模块依赖:echo-nginx-module 是第三方模块,需提前下载源码(如从 GitHub 获取)并放置到指定路径(如 /mnt/echo-nginx-module-0.63);

  • 编译一致性:重新编译时必须保留原有模块(如 --with-http_ssl_module),否则新 Nginx 会丢失旧功能;

  • 变量使用:echo 支持所有 Nginx 内置变量(如 $remote_addr 客户端 IP、$status 响应状态码),可根据需求灵活组合。

通过添加 echo 模块,Nginx 不仅能作为 Web 服务器 / 反向代理,还能直接处理简单的响应输出,大幅提升调试效率和轻量场景的响应灵活性,是扩展 Nginx 功能的典型实践。


二、nginx 二次开发版本

2.1.实验目的

通过部署 OpenResty(Nginx 的二次开发版本),利用其集成的 LuaJIT 引擎和丰富的 Lua 模块,扩展 Nginx 的功能边界,使其支持动态脚本编程(如复杂业务逻辑处理、动态路由、请求过滤等),同时保留 Nginx 高性能的核心优势,适用于需要二次开发的场景(如 API 网关、动态内容生成、安全防护等)。

2.2.OpenResty 的核心价值

OpenResty 并非全新软件,而是 “Nginx + LuaJIT + 丰富 Lua 模块” 的集成套件,其核心优势在于:

  • 保留 Nginx 高性能:基于 Nginx 核心,继承其事件驱动、高并发、低内存占用的特性;

  • 支持 Lua 动态脚本:通过 Lua 语言(轻量、高效)编写业务逻辑,无需重新编译 Nginx 即可实现复杂功能(如动态修改请求、根据条件路由、实时计算等);

  • 预集成实用模块:包含 ngx_lua、lua-resty-redis 等模块,支持直接操作 Redis、MySQL、处理 JSON 等,简化开发流程;

  • 适合二次开发:相比原生 Nginx 需通过 C 语言开发模块(门槛高),OpenResty 允许通过 Lua 脚本快速实现自定义功能,降低开发成本。

2.3.部署

systemctl stop nginx            # 停止原有 Nginx 服务(防止端口或进程冲突)
rm -rf /usr/local/nginx/*       # 清理原有 Nginx 安装目录(为 OpenResty 腾出空间,避免路径冲突)
cd /mnt                         # 进入存放源码包的目录
​
tar xzf openresty-1.25.3.1.tar.gz   # 解压 OpenResty 源码包
cd openresty-1.25.3.1/          # 进入源码目录,准备编译配置
​
./configure \--prefix=/usr/local/openresty \  # 指定 OpenResty 安装路径(区别于原生 Nginx,便于管理)--user=nginx --group=nginx \  # 运行用户/组(与系统用户一致,避免权限问题)--with-http_ssl_module \  # 保留 SSL 支持(HTTPS 必备)--with-http_v2_module \  # 支持 HTTP/2 协议--with-http_realip_module \  # 支持获取客户端真实 IP(反向代理场景)--with-http_stub_status_module \  # 状态监控模块--with-http_gzip_static_module \  # 静态预压缩支持--with-pcre --with-stream \  # 正则支持、Stream 模块(TCP/UDP 代理)--with-stream_ssl_module \  # Stream 模块 SSL 支持--with-stream_realip_module  # Stream 模块获取真实 IP
  • --prefix=/usr/local/openresty:将 OpenResty 安装到独立目录(而非原生 Nginx 的 /usr/local/nginx),便于区分版本和管理;

  • 保留核心模块:参数与之前 Nginx 配置一致,确保 OpenResty 支持 SSL、HTTP/2、状态监控等必备功能,保证功能连续性;

  • 隐含 Lua 模块:OpenResty 默认集成 ngx_lua、LuaJIT 等核心模块(无需显式指定),编译后自动支持 Lua 脚本编程。

make && make install 
  • make:将源码编译为可执行文件(包含 Nginx 核心、LuaJIT 引擎、Lua 模块等);

  • make install:将编译产物复制到 --prefix 指定的目录(/usr/local/openresty),完成安装。安装后,/usr/local/openresty/nginx 目录包含 Nginx 核心,/usr/local/openresty/bin 包含 openresty 命令(用于启动 / 管理服务)。

vim ~/.bash_profile             # 编辑用户环境变量文件
#############
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin:/usr/local/openresty/bin
#############
​
source ~/.bash_profile          # 使环境变量立即生效
​
cd /usr/local/openresty/bin/    # 进入 OpenResty 命令目录
openresty                       # 启动 OpenResty 服务(本质是启动集成的 Nginx 核心)
openresty -v                    # 查看版本,验证安装成功

2.4.验证

浏览器访问服务器 IP(如 http://192.168.67.100),若显示 OpenResty 默认页面(包含 “Welcome to OpenResty!” 字样),说明部署成功。

2.5.总结

为什么选择 OpenResty 作为二次开发版本?

  1. 开发门槛低:原生 Nginx 需通过 C 语言开发模块(门槛高、周期长),而 OpenResty 支持 Lua 脚本(轻量、易学),可快速实现自定义功能(如动态修改请求头、根据用户 ID 路由到不同后端);

  2. 功能扩展性强:集成的 Lua 模块支持操作 Redis、MySQL、处理 JSON、签名验证等,可直接在 Nginx 层面实现复杂业务逻辑(如 API 网关的权限校验、限流);

  3. 性能接近原生 Nginx:LuaJIT 是 Lua 的即时编译引擎,执行效率接近 C 语言,避免因引入脚本而显著降低性能;

  4. 兼容 Nginx 生态:完全兼容 Nginx 的配置语法和模块,原有 Nginx 配置可直接复用,学习成本低。

适用场景

OpenResty 特别适合需要二次开发的场景:

  • API 网关:实现动态路由、限流、日志收集、安全过滤(如防刷、鉴权);

  • 动态内容生成:结合 Lua 脚本实时生成页面内容(如个性化推荐);

  • 服务治理:对后端服务进行健康检查、负载均衡策略定制;

  • 监控与分析:实时统计请求指标(如 QPS、响应时间)并写入监控系统。

通过部署 OpenResty,可在保留 Nginx 高性能的基础上,大幅扩展其功能边界,使 Nginx 从 “静态 Web 服务器 / 反向代理” 升级为 “可编程的动态服务平台”,是需要二次开发的企业级场景的理想选择。

http://www.dtcms.com/a/322380.html

相关文章:

  • 黑马SpringAI项目-聊天机器人
  • axios 发请求
  • 束搜索(Beam Search):原理、演进与挑战
  • ubuntu 端口占用 但是找不到进程 与docker 容器镜像相关
  • 【网络与爬虫 52】Scrapyd-k8s集群化爬虫部署:Kubernetes原生分布式爬虫管理平台实战指南
  • 【新启航】飞机起落架外筒深孔型腔的测量方法 - 激光频率梳 3D 轮廓检测
  • 基于遗传优化的智能灌溉系统控制策略matlab仿真
  • python学智能算法(三十六)|SVM-拉格朗日函数求解(中)-软边界
  • docker的开源跨平台替代Vagrant
  • Zread:把 GitHub 仓库“一键变说明书”的体验与实战指南
  • 【超强总结】图像分割模型训练核心:优化器选型与学习率调控策略
  • 【数据结构初阶】--文件归并排序
  • 前端懒加载技术全面解析
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用
  • Vue3的简单学习
  • docker基础前置
  • day18 - CSS函数
  • ADB(Android Debug Bridge)—— Android调试桥
  • Android MediaMetadataRetriever取视频封面,Kotlin(1)
  • 【Android调用相册、拍照、录像】等功能的封装
  • Milvus 向量数据库基础操作解析
  • 进阶向:Python编写网页爬虫抓取数据
  • vulnhub-Beelzebub靶场通关攻略
  • 【Spring Boot 快速入门】八、登录认证(二)统一拦截
  • Android中RecyclerView基本使用
  • 鸿蒙分布式任务调度深度剖析:跨设备并行计算的最佳实践
  • Java安全-组件安全
  • 哈希与安全
  • Red Hat Enterprise Linux 7.9安装Oracle 11.2.0.4单实例数据库-图文详解
  • urmom damn the jvm