当前位置: 首页 > 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.lryc.cn/news/614943.html

相关文章:

  • 目标检测数据集 - 无人机检测数据集下载「包含COCO、YOLO两种格式」
  • 1.JavaScript 介绍
  • 130Kw双向储能PCS电源及关键技术分析
  • 彻底解决vscode中fnm调用失败的问题
  • 嵌入式 Linux Mender OTA 实战全指南
  • Microsoft 365中的Message Encryption (Basic)功能深度解析
  • 【JVM】深入解析Java虚拟机
  • Vitalik谈以太坊:ETH财库储备策略“有益且有价值”
  • Jmeter性能测试之安装及启动Jmeter
  • 检索增强生成:RAG(Retrieval Augmented Generation)
  • 如何在linux(CentOS7)上面安装 jenkins?
  • 【Vapor Mode】Vue 从“运行时“优化转向“编译时“优化的范式跃迁
  • 浏览器自动播放策略
  • OpenAI发布的GPT-5 更新了哪些内容,它的核心能力有哪些?AI编码能力这么强,前端程序员何去何从?
  • FreeRTOS学习笔记:任务通知和软件定时器
  • SpringBoot学习日记 Day6:解锁微服务与高效任务处理
  • 39.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--调整发布脚本
  • 24SpringCloud黑马商城微服务整合Seata重启服务报错的解决办法
  • Web3: DeFi借贷的安全基石, 了解喂价与清算机制的原理与重要性
  • 递归---记忆化搜索
  • 八、Linux Shell 脚本:变量与字符串
  • ESP32之wifi_HTTP
  • 商品、股指及ETF期权五档盘口Tick级与分钟级历史行情数据多维解析
  • 网盘短剧资源转存项目源码 支持垮克 带后台 附教程
  • 深入解析 Apache APISIX 在微服务网关中的性能优化实践指南
  • LeetCode 面试经典 150_数组/字符串_分发糖果(15_135_C++_困难)(贪心算法)
  • Swift 实战:秒算两个数组的交集(LeetCode 349)
  • 海康威视摄像头实时推流到阿里云公网服务器(Windows + FFmpeg + nginx-rtmp)
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的零售智能化升级路径研究
  • Selenium使用超全指南