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

embedded/2025/3/4 4:17:02/

详解(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/embedded/169801.html

相关文章

基础设施安全(Infrastructure Security)是什么?

基础设施安全(Infrastructure Security)指的是保护IT基础设施(包括物理和云端的服务器、网络设备、存储、数据库等)免受网络攻击、数据泄露、未授权访问、系统故障等威胁的各种安全措施和技术。 1. 基础设施安全的主要组成部分 &…

校园订餐微信小程序(全套)

网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理模块和校园订餐模块,对于校园订餐小程序将是又一个传统管理到智能化信息管理的改革,对于传统的校园订餐管理,所包括的信息内容比较多,对…

自然语言处理:稀疏向量表示

介绍 大家好,我是博主。今天又来和大家分享自然语言处理领域的知识了。原本我计划这次分享NLP中文本表示的相关内容,不过在整理分享计划的过程中,发现这部分知识里包含一些涉及复杂数学原理和抽象概念的内容。对于刚接触NLP的小伙伴们来说&a…

下载pyenv

安装 1、git clone https://gitclone.com/github.com/pyenv/pyenv.git ~/.pyenv 备用:git clone https://hub.fgit.ml/pyenv/pyenv.git ~/.pyenv 配置环境变量 export PYENV_ROOT"$HOME/.pyenv" export PATH"$PYENV_ROOT/bin:$PATH"然后&…

leetcode第17题求电话号码组合

原题出于leetcode第17题https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/题目如下: 题目稍微有点复杂,初看会感觉特别复杂,首先我们需要理清思路: 最后的结果是字母组合,因此遍历的是…

SpringBoot ——简单开发流程实战

本文使用SpringBoot进行电商系统商品数据增删改查的简单开发流程。 本文目录 一、创建Spring Boot项目二、配置数据库连接三、创建实体类四、创建Repository接口五、创建Service层六、创建Controller层七、测试 一、创建Spring Boot项目 可以通过https://start.spring.io/或者…

【Java项目】基于Spring Boot的校园博客系统

【Java项目】基于Spring Boot的校园博客系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:校园博客系统是一个典型的管理系统,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息…

ES怎么查询大于10000条数据

在Elasticsearch(ES)中,默认情况下,查询结果的最大返回条数是10,000条。如果你需要查询超过10,000条数据,可以通过以下几种方式来实现: 1. 使用 scroll API scroll API 适用于需要处理大量数据的场景&…