Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options
ngx_process_options
声明在 src\core\nginx.c
static ngx_int_t ngx_process_options(ngx_cycle_t *cycle);
定义在 src\core\nginx.c
static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len = ngx_strlen(ngx_prefix);p = ngx_prefix;if (len && !ngx_path_separator(p[len - 1])) {p = ngx_pnalloc(cycle->pool, len + 1);if (p == NULL) {return NGX_ERROR;}ngx_memcpy(p, ngx_prefix, len);p[len++] = '/';}cycle->conf_prefix.len = len;cycle->conf_prefix.data = p;cycle->prefix.len = len;cycle->prefix.data = p;} else {#ifndef NGX_PREFIXp = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);if (p == NULL) {return NGX_ERROR;}if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");return NGX_ERROR;}len = ngx_strlen(p);p[len++] = '/';cycle->conf_prefix.len = len;cycle->conf_prefix.data = p;cycle->prefix.len = len;cycle->prefix.data = p;#else#ifdef NGX_CONF_PREFIXngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX); #elsengx_str_set(&cycle->conf_prefix, NGX_PREFIX); #endifngx_str_set(&cycle->prefix, NGX_PREFIX);#endif}if (ngx_conf_file) {cycle->conf_file.len = ngx_strlen(ngx_conf_file);cycle->conf_file.data = ngx_conf_file;} else {ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);}if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {return NGX_ERROR;}for (p = cycle->conf_file.data + cycle->conf_file.len - 1;p > cycle->conf_file.data;p--){if (ngx_path_separator(*p)) {cycle->conf_prefix.len = p - cycle->conf_file.data + 1;cycle->conf_prefix.data = cycle->conf_file.data;break;}}if (ngx_error_log) {cycle->error_log.len = ngx_strlen(ngx_error_log);cycle->error_log.data = ngx_error_log;} else {ngx_str_set(&cycle->error_log, NGX_ERROR_LOG_PATH);}if (ngx_conf_params) {cycle->conf_param.len = ngx_strlen(ngx_conf_params);cycle->conf_param.data = ngx_conf_params;}if (ngx_test_config) {cycle->log->log_level = NGX_LOG_INFO;}return NGX_OK; }
ngx_process_options是 Nginx 启动过程中用于处理命令行选项的函数
主要逻辑
处理前缀路径 (
ngx_prefix) :
- 如果用户指定了
ngx_prefix,则检查是否需要添加路径分隔符/。- 如果未指定
ngx_prefix,则根据编译时的宏定义(如NGX_PREFIX和NGX_CONF_PREFIX)或当前工作目录设置默认路径。处理配置文件路径 (
ngx_conf_file) :
- 如果用户指定了
ngx_conf_file,则使用该路径。- 如果未指定,则使用默认路径
NGX_CONF_PATH。- 调用
ngx_conf_full_name将路径转换为完整路径,并提取配置文件所在目录作为conf_prefix。处理错误日志路径 (
ngx_error_log) :
- 如果用户指定了
ngx_error_log,则使用该路径。- 如果未指定,则使用默认路径
NGX_ERROR_LOG_PATH。处理额外配置参数 (
ngx_conf_params) :
- 如果用户提供了额外的配置参数,则将其存储到
cycle->conf_param。测试模式 (
ngx_test_config) :
- 如果启用了测试模式,则调整日志级别为
NGX_LOG_INFO。返回结果 :
- 如果所有步骤成功完成,则返回
NGX_OK;否则返回NGX_ERROR。
详解
函数定义
static ngx_int_t ngx_process_options(ngx_cycle_t *cycle)参数:
cycle是 Nginx 的核心结构体,保存全局配置和运行时状态返回值:
ngx_int_t表示处理状态(NGX_OK或NGX_ERROR)
变量声明
u_char *p;size_t len;定义局部变量
p和len。
p:临时指针,用于操作路径字符串。
len:路径字符串的长度。
处理
ngx_prefix(路径前缀)if (ngx_prefix) {len = ngx_strlen(ngx_prefix);p = ngx_prefix;检查是否指定了
ngx_prefix(即用户通过命令行或编译时指定的工作目录)。
- 如果
ngx_prefix存在,则计算其长度并将其赋值给p
确保路径以路径分隔符
/结尾if (len && !ngx_path_separator(p[len - 1])) {p = ngx_pnalloc(cycle->pool, len + 1);if (p == NULL) {return NGX_ERROR;}ngx_memcpy(p, ngx_prefix, len);p[len++] = '/';}
- 如果
ngx_prefix不以/结尾:
- 分配一块新的内存空间,大小为
len + 1- 将原始路径复制到新分配的内存中
- 在末尾追加
/并更新长度len
ngx_path_separator
定义在 src/os/unix/ngx_files.h 中
#define ngx_path_separator(c) ((c) == '/')
ngx_pnalloc
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pnalloc函数-CSDN博客
cycle->conf_prefix.len = len;cycle->conf_prefix.data = p;cycle->prefix.len = len;cycle->prefix.data = p;} else {将处理后的路径赋值给
cycle->conf_prefix和cycle->prefix。
conf_prefix和prefix都表示 Nginx 的工作目录。- 如果未指定
ngx_prefix,则进入else分支。
#ifndef NGX_PREFIXp = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);if (p == NULL) {return NGX_ERROR;}if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");return NGX_ERROR;}len = ngx_strlen(p);p[len++] = '/';cycle->conf_prefix.len = len;cycle->conf_prefix.data = p;cycle->prefix.len = len;cycle->prefix.data = p; #else #ifdef NGX_CONF_PREFIXngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX); #elsengx_str_set(&cycle->conf_prefix, NGX_PREFIX); #endifngx_str_set(&cycle->prefix, NGX_PREFIX); #endif根据是否定义了
NGX_PREFIX宏,选择不同的路径初始化方式。
- 未定义
NGX_PREFIX:
- 动态获取当前工作目录(
ngx_getcwd)。- 确保路径以
/结尾。- 将结果赋值给
conf_prefix和prefix。- 定义了
NGX_PREFIX:
- 使用预定义的路径(
NGX_PREFIX或NGX_CONF_PREFIX)。- 调用
ngx_str_set将路径赋值给conf_prefix和prefix。
ngx_str_set
定义在 src\core\ngx_string.h
#define ngx_str_set(str, text) \(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
if (ngx_conf_file) {cycle->conf_file.len = ngx_strlen(ngx_conf_file);cycle->conf_file.data = ngx_conf_file;} else {ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);}设置配置文件路径。
- 如果用户指定了
ngx_conf_file,则使用用户提供的路径。- 否则,使用默认路径
NGX_CONF_PATH。
if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {return NGX_ERROR;}将配置文件路径转换为绝对路径。
- 调用
ngx_conf_full_name函数完成路径标准化。- 如果失败,返回错误。
ngx_conf_full_name
该函数的主要作用是将相对路径转换为绝对路径
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_full_name 函数-CSDN博客
for (p = cycle->conf_file.data + cycle->conf_file.len - 1;p > cycle->conf_file.data;p--){if (ngx_path_separator(*p)) {cycle->conf_prefix.len = p - cycle->conf_file.data + 1;cycle->conf_prefix.data = cycle->conf_file.data;break;}}从配置文件路径中提取配置目录。
- 从路径末尾向前遍历,找到最后一个路径分隔符
/。- 将分隔符之前的部分作为
conf_prefix。
if (ngx_error_log) {cycle->error_log.len = ngx_strlen(ngx_error_log);cycle->error_log.data = ngx_error_log;} else {ngx_str_set(&cycle->error_log, NGX_ERROR_LOG_PATH);}设置错误日志路径。
- 如果用户指定了
ngx_error_log,则使用用户提供的路径。- 否则,使用默认路径
NGX_ERROR_LOG_PATH
if (ngx_conf_params) {cycle->conf_param.len = ngx_strlen(ngx_conf_params);cycle->conf_param.data = ngx_conf_params;}设置额外的配置参数。
- 如果用户指定了
ngx_conf_params,则将其赋值给cycle->conf_param
if (ngx_test_config) {cycle->log->log_level = NGX_LOG_INFO;}如果启用了测试模式(
ngx_test_config),将日志级别设置为INFO
return NGX_OK; }返回成功状态。
相关文章:
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options
ngx_process_options 声明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定义在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …...
ollama如何安全卸载,解决Ollama unins000.msg is missing
春节后在本地电脑安装了Ollama的客户端,每次开机自启,影响开机速度,而且本地的模型不如联网的回答效果好,果断选择了卸载,但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…...
网络安全设备防护原理 网络安全防护装置
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 防火墙 简介 网络层的防护设备,依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成,在内部网和外部网之间、专用网…...
Python的那些事第二十八篇:数据分析与操作的利器Pandas
Pandas:数据分析与操作的利器 摘要 Pandas是基于Python的开源数据分析库,广泛应用于数据科学、机器学习和商业智能等领域。它提供了高效的数据结构和丰富的分析工具,能够处理结构化数据、时间序列数据以及复杂的数据转换任务。本文从Pandas的基础概念入手,深入探讨其核心…...
学习threejs,使用MeshBasicMaterial基本网格材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshBasicMaterial 二…...
【git-hub项目:YOLOs-CPP】本地实现05:项目移植
ok,经过前3个博客,我们实现了项目的跑通。 但是,通常情况下,我们的项目都是需要在其他电脑上也跑通,才对。 然而,经过测试,目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】: 精…...
Html5学习教程,从入门到精通,HTML5 元素语法知识点及案例代码(2)
HTML5 元素语法知识点及案例代码 一、HTML5 元素概述 HTML5 元素是构成网页的基本单位,每个元素都有特定的语义和功能。HTML5 元素由开始标签、内容和结束标签组成,例如: <p>这是一个段落。</p><p> 是开始标签这是一个段…...
【python】协程(coroutine)
协程(coroutine)可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数,多个协程共用一个线程执行,适合执行需要“等待”的任务。 所以严格意义上,多个协程同一时刻也只有一个在真正的执行&#…...
【编译器】-LLVMIR
概述 LLVM 是一种基于静态单赋值 (SSA) 的表示形式,提供类型安全、低级操作、灵活性以及干净地表示“所有”高级语言的能力。 LLVM IR 是一门低级语言,语法类似于汇编任何高级编程语言(如C)都可以用LLVM IR表示基于LLVM IR可以很…...
java面试场景问题
还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...
算法菜鸡备战3月2日传智杯省赛----0221
2209. 用地毯覆盖后的最少白色砖块 - 力扣(LeetCode) 力扣每日一题 class Solution { public:// 白色最少 黑色最多int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {int n floor.size();// 记忆化搜索vector memo(n 1, vector&…...
python pandas下载
pandas pandas:就是一个可以处理数据的 python 库 核心功能: 数据的清洗:处理丢失值,重复值数据分析:计算和统计信息,或分组汇总数据可视化:结合 图标库(Matplotlib)完成数据可视化…...
高斯牛顿法(GN)与列文伯格-马夸尔特方法在ORB-SLAM3中的应用
问题背景 高斯牛顿法(Gauss-Newton, GN)和列文伯格-马夸尔特方法(Levenburg-Marquadt, LM)是两种最常用的非线性优化方法,这两种方法在ORB-SLAM3系统中均有使用。 在ORB-SLAM3前端跟踪线程(Tracking)中,局…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
猿大师中间件:网页直接内嵌本机EXE、OCX控件、ActiveX控件或桌面应用程序神器
猿大师中间件自从2019年发布以来,迄今为止不断迭代升级,给第三方提供了将自己的桌面程序和OCX控件支持直接内嵌到浏览器网页运行的赋能SDK开发包。 目前针对不同需求发布了三个成熟且商用的产品: 猿大师播放器:浏览器中直接原生…...
【Python】03-Python语法入门
文章目录 1、基本概念1.1、表达式1.2、语句1.3、程序(program)1.4、函数(function) 2、基本语法3、字面量与变量4、变量与标识符 1、基本概念 1.1、表达式 表达式就是一个类似于数学公式的东西,表达式一般仅用来计算一…...
C++,设计模式,【工厂方法模式】
文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…...
跟着 Lua 5.1 官方参考文档学习 Lua (5)
文章目录 2.10 – Garbage Collection2.10.1 – Garbage-Collection Metamethods2.10.2 – Weak Tables 2.10 – Garbage Collection Lua performs automatic memory management. This means that you have to worry neither about allocating memory for new objects nor abo…...
9.PG数据库层权限管理(pg系列课程)第2遍
一、PostgreSQL数据库属主 Postgres中的数据库属主属于创建者,只要有createdb的权限就可以创建数据库,数据库属主不一定拥有存放在该数据库中其它用户创建的对象的访问权限。数据库在创建后,允许public角色连接,即允许任何人连接…...
鸿蒙-canvas-画时钟
文章目录 前言准备分析组成部分数值计算过程 开始第一步 画圆环第二步 画格子第三步 画数字第四、五步 画指针&定时更新最后一步 前言 你在 Android 上能画出来的东西,在鸿蒙上画不出来? 画个时钟嘛,有啥难的? 你行你上&…...
【AI实践】阿里百炼文本对话Agent安卓版搭建
环境:安卓手机运行环境;WinsurfAI编程工具;阿里百炼提前创建Agent应用; 耗时:2小时; 1,新建安卓项目 完成文本输入,并将输入的文字显示出来。 2,安装SDK 参考文档 安…...
算法很美笔记(Java)——动态规划
解重叠子问题(当前解用到了以前求过的解) 形式:记忆型递归或递推(dp) 动态规划本质是递推,核心是找到状态转移的方式,也就是填excel表时的逻辑(填的方式),而…...
Jest单元测试
由于格式和图片解析问题,可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序 单元测试(Unit Testi…...
《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》-配套代码示例
第一章:模型加载与基础生成 1.1 基础模型加载 from diffusers import StableDiffusionPipeline import torch# 加载SD 1.5基础模型(FP32精度) pipe StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",…...
OnlyOffice:前端编辑器与后端API实现高效办公
OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…...
springboot多实例部署时,@Scheduled注释的方法重复执行
问题:springboot多实例部署时,Scheduled注释的方法重复执行 在 Spring Boot 中要实现 Redis 的SET NX EX命令,可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对,并同时设置过期时间。 <dependen…...
coco格式
COCO(Common Objects in Context)格式是一种广泛用于图像识别和分割任务的数据格式,尤其是在目标检测、语义分割等任务中。COCO格式的核心包括以下几个部分: images: 包含图像的基本信息(如文件名、大小、ID等&#x…...
骶骨神经
骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术(七) 勇闯禁区 骶骨肿瘤切除术...
Nacos学习(二)——继承Feign与Config中心
目录 一、集成Feign (一)基础用法 1.添加openfeign依赖 2. 开启openFeign注解扫描 3.创建ProviderService接口 4.修改ConsumerController (二)OpenFeign日志配置 (三)参数传递 1.参数传递的问题 2.参数传递的方式 2.1URL路径传参 2.2URL上拼接参数 2.3body传参 …...
计算机网络安全之一:网络安全概述
1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及,越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是,支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而࿰…...
