Nginx配置详情-配置说明-参数优化-ngx_http_core_module模块变量(三)

本文详细介绍了Nginx的ngx_http_core_module模块提供的丰富变量,这些变量可用于记录访问日志、设置条件等场景。例如,$arg_PARAMETER用于获取URI参数值,$limit_rate记录限速信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:上一篇写到Nginx核心模块HTTP模块,这一篇主要讲ngx_http_core_module模块提供的变量

在记录access_log访问日志文件时,可以使用ngx_http_core_module模块处理请求时所产生的丰富的变量,当然这些变量还可以用户其他HTTP模块。例如:当URI中的某个参数满足设定的条件时,有些HTTP模块的配置项可以使用类似$arg_PARAMETER这样的变量。又如,若想把每个请求中的限速信息记录到access日志文件中,则可以使用$limit_rate变量。

参数名意义
$arg_PARAMETERHTTP请求中某个参数的值,如/index.html?size=10,可以用&arg_size取得10这个值
$argsHTTP请求中的完整参数。例如:在请求/index.html?a=110&b=120中,$args表示字符串a=110&b=120
$binary_remote_addr二进制格式的客户端地址。例如:\x0A\xE0B
$body_bytes_sent表示在向客户端发送的http响应中,包体部分的字节数
$content_length表示客户端请求头部中的Content-length字段
$content_type表示客户端请求头部中国年的Content-Type字段
$cookie_COOKIE表示在客户端请求头部中的cookie字段
$document_root表示当前请求所使用的root配置项的值
$uri表示当前请求的URI,不带任何参数。例如:/index.html
$request_uri表示客户端发送来的原始请求URI,带完整参数。$uri和$document_root未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri永远不会改变,始终是客户端的原始URI
$host表示客户端请求头部中的Host字段。如果Host字段不存在则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如127.0.0.1:8080,那么$host是去掉端口的,它的值为IP。$host是全小写的。这些特性与http_HEADER中的http_host不同,http_host只是完全取出Host头部对应的值
$hostname表示Nginx所在机器的名称,与gethostbyname调用返回的值相同
$http_HEADER表示当前HTTP请求中相应头部的值。HEADER名称全小写,例如:用$htto_host表示请求中的Http头部对应的值
$send_http_HEADER表示返回客户端的HTTP响应中头部的值。HEADER名称全小写。例如:用$send_http_content_type表示响应中Content_Type头部对应的值
$is_args表示请求中的URI是否带参数,如果带参数,$is_args值为?,如果不带参数,则是空字符串
$limit_rate表示当前连接的限速是多少,0表示不限速
$nginx_version表示当前Nginx的版本号
$query_string请求URI中的参数,与$args相同,然而$query_string是只读的不会改变
$remote_addr表示客户端的ip地址
$remote_port表示客户端连接使用的端口
$remote_user表示使用Auth Basic Module 时定义的用户名
$request_filename表示用户请求中的URI经过root或alias转换后的文件路径
$request_body表示HTTP请求中的包体,该参数只在proxy_pass或fastcgi_pass中有意义
$request_body_file表示HTTP请求中的包体存储的临时文件名
$request_completion当请求已经全部完成时,其值为”ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用HTTP range访问的并不是文件的最后一块,那么其值也是空字符串
$request_method表示HTTP请求的方法名,如:GET,POST等
$scheme表示HTTP scheme,如在请求https://www.baidu.com/中表示https
$server_addr表示服务器地址
$server_name表示服务器名称
$server_post表示服务器端口
$server_protocol表示服务器向客户端发送响应的协议,如:HTTP/1.1或HTTP/1.0

博客原创:写作不易,转载请标明出处。文章地址:http://blog.csdn.net/hatsune_miku_/article/details/78080754(๑˃∀˂๑)♪阿里嘎多(๑˃∀˂๑)♪
Nginx配置详情-配置说明-参数优化(一)
Nginx配置详情-配置说明-参数优化-核心HTTP配置(二)
Nginx配置详情-配置说明-参数优化-ngx_http_core_module模块变量(三)
Nginx配置详情-配置说明-参数优化-Nginx反向代理、负载均衡(四)

/opt/nginx-sticky-module/ngx_http_sticky_misc.c: 在函数‘ngx_http_sticky_misc_sha1’中: /opt/nginx-sticky-module/ngx_http_sticky_misc.c:176:15: 错误:‘SHA_DIGEST_LENGTH’未声明(在此函数内第一次使用) u_char hash[SHA_DIGEST_LENGTH]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c:176:15: 附注:每个未声明的标识符在其出现的函数内只报告一次 /opt/nginx-sticky-module/ngx_http_sticky_misc.c:176:10: 错误:未使用的变量‘hash’ [-Werror=unused-variable] u_char hash[SHA_DIGEST_LENGTH]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c: 在函数‘ngx_http_sticky_misc_hmac_sha1’中: /opt/nginx-sticky-module/ngx_http_sticky_misc.c:242:15: 错误:‘SHA_DIGEST_LENGTH’未声明(在此函数内第一次使用) u_char hash[SHA_DIGEST_LENGTH]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c:243:12: 错误:‘SHA_CBLOCK’未声明(在此函数内第一次使用) u_char k[SHA_CBLOCK]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c:243:10: 错误:未使用的变量‘k’ [-Werror=unused-variable] u_char k[SHA_CBLOCK]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c:242:10: 错误:未使用的变量‘hash’ [-Werror=unused-variable] u_char hash[SHA_DIGEST_LENGTH]; ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c: 在函数‘ngx_http_sticky_misc_text_raw’中: /opt/nginx-sticky-module/ngx_http_sticky_misc.c:324:5: 错误:传递‘ngx_sock_ntop’的第 1 个参数时将整数赋给指针,未作类型转换 [-Werror] digest->len = ngx_sock_ntop(1); ^ In file included from src/core/ngx_core.h:82:0, from /opt/nginx-sticky-module/ngx_http_sticky_misc.c:8: src/core/ngx_inet.h:114:8: 附注:需要类型‘struct sockaddr *’,但实参的类型为‘int’ size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, ^ /opt/nginx-sticky-module/ngx_http_sticky_misc.c:324:5: 错误:提供给函数‘ngx_sock_ntop’的实参太少 digest->len = ngx_sock_ntop(1); ^
最新发布
06-24
<think>我们遇到了两个主要问题:1.SHA_DIGEST_LENGTH和SHA_CBLOCK未声明:这通常是因为在较新的Nginx版本中,OpenSSL的头文件使用方式发生了变化,或者模块代码没有正确包含相关头文件。2.ngx_sock_ntop参数类型不匹配:这个函数在新版Nginx中参数发生了变化。解决方案如下:###问题1:SHA_DIGEST_LENGTH和SHA_CBLOCK未声明在旧版模块中,可能直接使用了OpenSSL的宏,但新版OpenSSL中,这些宏可能被移到了不同的头文件或者被废弃(例如,使用更现代的EVP接口)。我们可以通过以下步骤修复:####修复步骤:1.在模块源码中,找到使用`SHA_DIGEST_LENGTH`和`SHA_CBLOCK`的地方。2.检查是否包含了正确的OpenSSL头文件。通常需要包含:```c#include<openssl/sha.h>```3.如果包含后仍然报错,可能是因为在OpenSSL1.1.x版本中,这些宏被移除了。我们可以改用`EVP_MD_size(EVP_sha1())`和`EVP_MD_block_size(EVP_sha1())`来获取对应的值。具体修改示例:```c//原代码#defineSTICKY_SHA1_LENSHA_DIGEST_LENGTH#defineSTICKY_SHA1_CBLOCKSHA_CBLOCK//修改为#include<openssl/evp.h>#defineSTICKY_SHA1_LENEVP_MD_size(EVP_sha1())#defineSTICKY_SHA1_CBLOCKEVP_MD_block_size(EVP_sha1())```注意:如果模块中直接使用了SHA1函数,那么可能需要将SHA1相关的调用改为EVP接口。但是,如果只是需要长度和块大小的定义,上述修改即可。###问题2:ngx_sock_ntop参数类型不匹配在新版Nginx中,`ngx_sock_ntop`函数的参数发生了变化。旧版可能是两个参数,而新版只需要一个参数(sockaddr结构体)。####修复步骤:查找模块中所有调用`ngx_sock_ntop`的地方,并修改参数。例如,原代码可能是:```cchar*addr_text=ngx_sock_ntop(ip,port,...);```修改为(新版Nginx):```c//新版ngx_sock_ntop只需要一个参数:sockaddr指针char*addr_text=ngx_sock_ntop(&ip->sockaddr,...);```具体修改需要根据模块中的实际调用进行调整。通常,`ngx_sock_ntop`的第一个参数是一个指向`sockaddr`的指针,第二个参数可能是长度,或者没有第二个参数。查看Nginx源码中`ngx_sock_ntop`的定义(在`src/core/ngx_inet.h`中)以确定正确的参数。例如,在较新的Nginx中,函数声明为:```cu_char*ngx_sock_ntop(structsockaddr*sa,socklen_tsocklen,u_char*text,size_tlen,ngx_uint_tport);```所以,如果模块中调用方式不对,需要调整。###综合修改示例假设在`ngx_http_sticky_misc.c`文件中,有如下调用:```c//旧代码p=ngx_sock_ntop(sin,p,len);```修改为:```c//新代码:假设sin是sockaddr_in指针,需要转换为sockaddr指针,并且传递正确的长度p=ngx_sock_ntop((structsockaddr*)sin,sizeof(structsockaddr_in),p,len,1);```但具体参数需要根据实际上下文和Nginx版本调整。###重新编译修改完成后,重新编译Nginx。###注意事项1.这些修改可能因Nginx版本和OpenSSL版本而异。2.如果模块还有其他错误,可能需要进一步调整。3.建议使用一个已经修复了这些问题的分支,比如`nginx-sticky-module-ng`。###替代方案如果修复困难,可以考虑使用已经维护的分支:```bashgitclonehttps://github.com/Refinitiv/nginx-sticky-module-ng.git```然后在配置Nginx时使用这个模块路径。###示例编译命令```bash./configure\--prefix=/usr/local/nginx\--add-module=/path/to/nginx-sticky-module-ng\[其他原有参数]```然后执行`make`和`makeinstall`。###引用说明[^1]:此错误通常是由于OpenSSL版本升级导致宏定义变化。[^2]:此错误可能是由于调用函数参数与新版Nginx不匹配。</think>### 解决 Nginx Sticky 模块编译错误:SHA 宏和参数类型问题 以下是针对 `SHA_DIGEST_LENGTH`、`SHA_CBLOCK` 未声明和 `ngx_sock_ntop` 参数类型错误的完整解决方案: --- ### 问题分析 1. **SHA 相关宏未声明** - `SHA_DIGEST_LENGTH` 和 `SHA_CBLOCK` 是 OpenSSL 的宏定义 - 错误原因:模块未正确包含 OpenSSL 头文件或使用了过时的 SHA 实现[^1] 2. **`ngx_sock_ntop` 参数类型不匹配** - 新版 Nginx 修改了 `ngx_sock_ntop()` 的函数签名 - 错误原因:模块代码未适配新参数格式[^2] --- ### 解决方案 #### 1. 修复 SHA 宏错误 ```c // 在 ngx_http_sticky_misc.c 文件顶部添加 #include <openssl/sha.h> // 替换所有 MD5 相关代码为 SHA // 原代码 (MD5) MD5_Update(&ctx, (u_char *) text->data, text->len); MD5_Final(digest, &ctx); // 修改为 (SHA1) SHA1_Init(&ctx); SHA1_Update(&ctx, (u_char *) text->data, text->len); SHA1_Final(digest, &ctx); ``` #### 2. 修复 `ngx_sock_ntop` 参数类型 ```c // 在 ngx_http_sticky_misc.c 中查找 ngx_sock_ntop 调用 // 原错误代码 p = ngx_sock_ntop(sin, p, len); // 修改为 (适配 Nginx 1.19+) p = ngx_sock_ntop((struct sockaddr *)sin, sizeof(struct sockaddr_in), p, len, 1); ``` #### 3. 完整补丁示例 ```diff --- ngx_http_sticky_misc.c.orig +++ ngx_http_sticky_misc.c @@ -1,5 +1,6 @@ #include <ngx_config.h> #include <ngx_core.h> +#include <openssl/sha.h> // 添加 OpenSSL 头文件[^1] static ngx_int_t ngx_http_sticky_misc_text(ngx_pool_t *pool, ngx_str_t *text, ...) { @@ -187,7 +188,10 @@ } // 修复 ngx_sock_ntop 调用 - p = ngx_sock_ntop(sin, p, len); + p = ngx_sock_ntop( + (struct sockaddr *)sin, // 第一个参数改为 sockaddr 指针 + sizeof(struct sockaddr_in), // 添加长度参数 + p, len, 1); // 添加端口标志位[^2] @@ -220,10 +224,10 @@ u_char digest[20]; ... // 替换 MD5 为 SHA1 - MD5_Init(&ctx); - MD5_Update(&ctx, (u_char *) text->data, text->len); - MD5_Final(digest, &ctx); - + SHA1_Init(&ctx); + SHA1_Update(&ctx, (u_char *) text->data, text->len); + SHA1_Final(digest, &ctx); + ngx_hex_dump(result, digest, sizeof(digest)); } ``` --- ### 验证修复 1. **检查头文件包含** ```bash grep -r "openssl/sha.h" ngx_http_sticky_misc.c # 应返回: #include <openssl/sha.h> ``` 2. **重新编译 Nginx** ```bash ./configure --add-module=/path/to/fixed-module make -j4 2>&1 | grep -iE 'sha|sock_ntop' # 无错误输出表示修复成功 ``` --- ### 替代方案:使用维护分支 ```bash # 使用已修复的 nginx-sticky-module-ng git clone https://github.com/Refinitiv/nginx-sticky-module-ng.git ./configure --add-module=nginx-sticky-module-ng ``` --- ### 配置示例(修复后) ```nginx upstream backend { sticky hash=sha1; # 使用 SHA1 算法 server backend1.example.com; server backend2.example.com; } ``` --- ### 技术说明 | 问题类型 | 根本原因 | 解决方案 | |---------|---------|---------| | `SHA_*` 未声明 | OpenSSL 头文件缺失 | 添加 `#include <openssl/sha.h>` | | `ngx_sock_ntop` 类型错误 | Nginx API 变更 | 适配新函数签名 `(sockaddr*, socklen_t, u_char*, size_t, ngx_uint_t)` | | MD5 弃用问题 | 安全策略升级 | 替换为 `SHA1_Init/Update/Final` | > **注意**:如果使用 OpenSSL 3.0+,建议改用更安全的 `EVP` 接口[^1]: > ```c > #include <openssl/evp.h> > EVP_MD_CTX *ctx = EVP_MD_CTX_new(); > EVP_DigestInit_ex(ctx, EVP_sha1(), NULL); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值