Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(9)

news/2025/3/1 15:09:28/

详解(9)


获取并存储主机名

    if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");ngx_destroy_pool(pool);return NULL;}/* on Linux gethostname() silently truncates name that does not fit */hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';cycle->hostname.len = ngx_strlen(hostname);cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);if (cycle->hostname.data == NULL) {ngx_destroy_pool(pool);return NULL;}ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);

1 获取主机名

if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");ngx_destroy_pool(pool);return NULL;
}

调用 gethostname() 系统调用获取本地主机名,存储到 hostname 缓冲区。

缓冲区大小为 NGX_MAXHOSTNAMELEN

若调用失败(返回 -1),记录致命错误(NGX_LOG_EMERG),销毁内存池并终止初始化。


2 强制截断主机名

hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';

确保 hostname\0 结尾,避免未终止字符串导致的安全风险。

Linux 的 gethostname() 在缓冲区不足时静默截断,但不会添加 \0
手动设置最后一个字节为 \0,确保字符串合法性。


3 记录主机名长度

cycle->hostname.len = ngx_strlen(hostname);

计算主机名的实际长度(不含终止符),存储到 cycle->hostname.len


4 分配内存存储主机名

cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);
if (cycle->hostname.data == NULL) {ngx_destroy_pool(pool);return NULL;
}

从内存池 pool 分配内存,存储主机名的副本

ngx_pnalloc 分配指定长度的内存
若分配失败,销毁内存池并终止初始化。


5 转换主机名为小写

ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);

将主机名转换为全小写,存储到 cycle->hostname.data

ngx_strlow 是 Nginx 的封装函数,逐字符转换为小写。

主机名在 DNS 和 HTTP 协议中通常不区分大小写,统一格式避免配置或路由问题。

统一小写格式,简化后续比较和匹配逻辑(如虚拟主机配置)。



http://www.ppmy.cn/news/1575799.html

相关文章

软件工程复试专业课-软件生命周期

文章目录 软件过程模型瀑布模型模型图特点优缺点改进后的瀑布模型 快速原型模型模型图优缺点 增量模型(迭代-递增模型)原型图与瀑布和快速原型的区别优缺点风险更大的增量模型 螺旋模型简介模型图优缺点 喷泉模型模型图优缺点 编码修补模型敏捷过程优缺点…

SenseGlove力反馈数据手套Nova 2:重新定义虚拟现实交互

在虚拟现实(VR)领域,交互体验的真实感是技术发展的关键。SenseGlove Nova 2 力反馈数据手套通过触觉反馈、力反馈和振动反馈技术,为用户带来了更加沉浸的虚拟体验。 SenseGlove力反馈数据手套Nova 2核心技术特点 触觉反馈技术 S…

【Prometheus】prometheus服务发现与relabel原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

实测四大开源AI视频模型 - 阿里、腾讯、阶跃星辰和智谱,无限生成的Time要来了

终于,视频模型开源卷到新阶段了! 前有智谱 CogVideoX v1.5、腾讯混元 HunyuanVideo、阶跃星辰 Step-Video-T2V、这昨天又来了一个阿里全新开源的 Wan2.1。 开源模型这么多,究竟生成效果有什么差异? 我们先来看一组之前大家都熟…

【愚公系列】《鸿蒙原生应用开发从零基础到多实战》004-TypeScript 中的泛型

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…

xss-labs搭建及学习

搭建 搭建过程与一般的网站搭建差不多 参考资料 当出现这个界面就是成功了 学习 学习资料 xss概念理解:XSS跨站脚本攻击 xss常见标签:XSS常见触发标签 level1-直接打 这里提示payload长度为4查看一下源码 发现get传参name的值test插入了html里头&am…

harbor拉取全部镜像

本脚本通过harbor v2.0 API请求,采用三层for循环,分别是project、repository、tag三层来将拉取全部镜像到本地,tag的名称列表输出到imagelist文件中。并有两三个优化改编版本。 文章目录 拉取harbor仓库全部镜像拉取全部repository中最新的几…