当前位置: 首页 > article >正文

ngx_http_set_virtual_server

1 定义ngx_http_set_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstaticngx_int_tngx_http_set_virtual_server(ngx_http_request_t*r,ngx_str_t*host){ngx_int_trc;ngx_http_connection_t*hc;ngx_http_core_loc_conf_t*clcf;ngx_http_core_srv_conf_t*cscf;#if(NGX_SUPPRESS_WARN)cscfNULL;#endifhcr-http_connection;#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(hc-ssl_servername){if(hc-ssl_servername-lenhost-lenngx_strncmp(hc-ssl_servername-data,host-data,host-len)0){#if(NGX_PCRE)if(hc-ssl_servername_regexngx_http_regex_exec(r,hc-ssl_servername_regex,hc-ssl_servername)!NGX_OK){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}#endifreturnNGX_OK;}}#endifrcngx_http_find_virtual_server(r-connection,hc-addr_conf-virtual_names,host,r,cscf);if(rcNGX_ERROR){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(hc-ssl_servername){ngx_http_ssl_srv_conf_t*sscf;if(rcNGX_DECLINED){cscfhc-addr_conf-default_server;rcNGX_OK;}sscfngx_http_get_module_srv_conf(cscf-ctx,ngx_http_ssl_module);if(sscf-verify){ngx_log_error(NGX_LOG_INFO,r-connection-log,0,client attempted to request the server name different from the one that was negotiated);ngx_http_finalize_request(r,NGX_HTTP_MISDIRECTED_REQUEST);returnNGX_ERROR;}}#endifif(rcNGX_DECLINED){returnNGX_OK;}r-srv_confcscf-ctx-srv_conf;r-loc_confcscf-ctx-loc_conf;clcfngx_http_get_module_loc_conf(r,ngx_http_core_module);ngx_set_connection_log(r-connection,clcf-error_log);returnNGX_OK;}ngx_http_set_virtual_server 函数的作用是 根据 HTTP 请求的 Host 头为请求选定并设置对应的虚拟主机server 块配置。2 详解1 函数签名staticngx_int_tngx_http_set_virtual_server(ngx_http_request_t*r,ngx_str_t*host)返回值 NGX_OK成功设置了请求对应的虚拟主机配置 NGX_ERROR发生错误参数1 ngx_http_request_t *r 指向当前正在处理的请求的上下文环境参数2 ngx_str_t *host 解析出的主机名2 逻辑流程1 局部变量 2 SSL 快速匹配路径 3 查找虚拟主机 4 错误检查 5 SSL 处理 6 未匹配 7 更新请求的配置 8 返回 成功1 局部变量{ngx_int_trc;ngx_http_connection_t*hc;ngx_http_core_loc_conf_t*clcf;ngx_http_core_srv_conf_t*cscf;#if(NGX_SUPPRESS_WARN)cscfNULL;#endifhcr-http_connection;rc 用于保存函数调用的返回值记录操作结果状态 hc 将指向当前请求关联的 HTTP 连接结构体r-http_connection 可从中获取地址配置信息等。 clcf 将指向核心模块ngx_http_core_module的 location 级配置 主要用于后续重设连接日志。 cscf 将指向匹配到的 server 级别的核心配置 即虚拟主机对应的 ngx_http_core_srv_conf_t 这是函数最终要确定并赋予请求的配置对象。条件编译 若定义了宏 NGX_SUPPRESS_WARN用于抑制某些编译器“可能未初始化”的警告 则将 cscf 初始化为 NULL。 这只影响编译警告对运行时逻辑无实际影响 因为所有可达路径都会给 cscf 赋值。将请求中的 HTTP 连接对象指针赋值给 hc 方便后续访问 hc-addr_conf、hc-ssl_servername 等字段。2 SSL 快速匹配路径#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(hc-ssl_servername){if(hc-ssl_servername-lenhost-lenngx_strncmp(hc-ssl_servername-data,host-data,host-len)0){#if(NGX_PCRE)if(hc-ssl_servername_regexngx_http_regex_exec(r,hc-ssl_servername_regex,hc-ssl_servername)!NGX_OK){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}#endifreturnNGX_OK;}}#endif条件编译开始 仅当 Nginx 编译时包含 SSL 模块 并且 OpenSSL 库支持 SSL_CTRL_SET_TLSEXT_HOSTNAME即 SNI 扩展时 才编译 SNI 相关代码块。3 查找虚拟主机rcngx_http_find_virtual_server(r-connection,hc-addr_conf-virtual_names,host,r,cscf);调用核心函数 ngx_http_find_virtual_server 执行真正的虚拟主机查找 参数1 r-connection底层网络连接。 参数2 hc-addr_conf-virtual_names 监听地址addr_conf下的所有虚拟主机名集合包含精确名、前置通配、后置通配、正则表达式等。 参数3 host请求的 Host 头内容。 参数4 r请求对象可能用于日志或上下文。 参数5 cscf输出参数 若找到匹配则将对应的 ngx_http_core_srv_conf_t 指针写入此处。 返回值 rc 表示查找结果 NGX_OK成功找到匹配的虚拟主机。 NGX_DECLINED未找到任何匹配。 NGX_ERROR查找过程出错如正则匹配异常。4 错误检查if(rcNGX_ERROR){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}如果查找过程发生错误 以 500 内部服务器错误结束请求 并返回 NGX_ERROR 给上层 通知其停止进一步处理。5 SSL 处理#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(hc-ssl_servername){ngx_http_ssl_srv_conf_t*sscf;if(rcNGX_DECLINED){cscfhc-addr_conf-default_server;rcNGX_OK;}sscfngx_http_get_module_srv_conf(cscf-ctx,ngx_http_ssl_module);if(sscf-verify){ngx_log_error(NGX_LOG_INFO,r-connection-log,0,client attempted to request the server name different from the one that was negotiated);ngx_http_finalize_request(r,NGX_HTTP_MISDIRECTED_REQUEST);returnNGX_ERROR;}}#endifSSL 场景下匹配失败的补救及主机名验证6 未匹配if(rcNGX_DECLINED){returnNGX_OK;}未找到匹配 返回成功 意味着请求将继续使用之前已设置的 server 配置 通常是在收到请求前根据 IP/端口选定的默认 server7 更新请求的配置r-srv_confcscf-ctx-srv_conf;r-loc_confcscf-ctx-loc_conf;找到了匹配的虚拟主机 将请求对象的模块配置指针切换到新选定的 server 块clcfngx_http_get_module_loc_conf(r,ngx_http_core_module);ngx_set_connection_log(r-connection,clcf-error_log);获取新选定 server及当前 location 上下文下 核心模块的 location 级配置其中包含 error_log 等设置。 更新底层连接的日志对象 这样后续日志会输出到正确的地方 并遵循该虚拟主机定义的日志级别8 返回 成功returnNGX_OK;}

相关文章:

ngx_http_set_virtual_server

1 定义 ngx_http_set_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstatic ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host) {ngx_int_t rc;ngx_http_connection_t *hc;ngx_http_core_loc_con…...

服务器末级缓存管理优化与Garibaldi架构解析

1. 服务器末级缓存管理的核心挑战 在现代服务器架构中,末级缓存(Last-Level Cache, LLC)作为CPU与主存之间的关键缓冲层,其管理效率直接影响系统整体性能。传统LLC管理面临一个根本性矛盾:随着核心数量增加和负载多样化,有限的缓存…...

C51编译器浮点数支持与嵌入式优化实践

1. C51编译器对浮点数的支持解析作为一名在嵌入式领域摸爬滚打多年的老工程师,我深知在8位单片机上进行浮点运算的痛点。最近有同行问我关于Keil C51编译器对浮点数的支持情况,这让我想起自己早年从PL/M-51转向C51时遇到的类似困惑。本文将结合官方文档和…...

微信小程序 社区老年人健康管理系统

目录同行可拿货,招校园代理 ,本人源头供货商项目背景核心功能技术实现服务模式社会效益项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目背景 随着老龄化社会…...

DPO vs PPO:两种AI对齐技术到底选哪个?我全试了一遍

整整一个月的实验,四块4090烧了不知道多少电费。这不算什么,真正让我崩溃的是——跑了三天的PPO训练,在最后一刻因为reward model打分偏差炸了。 那一刻我真的很想摔键盘。 但后来换上DPO重新跑,12小时搞定,效果还更…...

2026年南京Geo公司将有何新动态?一起探寻其发展新方向!

在数字化浪潮汹涌澎湃的当下,AI智能营销领域正经历着前所未有的变革。顺炫科技作为该领域的深耕者,一直致力于为全球客户提供高效、智能的数字化推广解决方案。随着2026年的到来,顺炫科技又将有哪些新动态,其发展新方向又将指向何…...

微信小程序 消防知识学习平台系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术实现特色亮点适用场景项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 微信小程序“消…...

【awinic inside】音质续航,听声辨位 | 艾为芯助力小天才AI手表Z12

...

【MySQL 三大日志深度解析】:redo log、undo log、binlog 作用与两阶段提交原理

🔥你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 前言…...

用wireshark抓取分析EtherCAT报文

📜 第1章:EtherCAT报文结构 EtherCAT报文结构及Wireshark对应显示: 以太网帧头:14字节,包含目标/源MAC地址,帧类型 (EtherType) 固定为 0x88A4。EtherCAT帧头:2字节,包含一个11位的“…...

AI技术的未来发展方向

AI技术的未来发展方向AI技术的未来发展将围绕以下几个关键领域展开,这些方向不仅推动技术进步,也深刻影响社会和经济结构。通用人工智能(AGI)的探索AGI旨在实现与人类智能相当的通用性,能够跨领域学习和推理。当前研究…...

Python运算符:逻辑运算符(and/or/not)的短路特性

Python运算符:逻辑运算符(and/or/not)的短路特性📚 本章学习目标:深入理解逻辑运算符(and/or/not)的短路特性的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与…...

通用人工智能(AGI)完整技术方案:以字序生命模型(WOLM)为认知内核的双脑协同架构

一、AGI的终极定义在讨论技术方案之前,先定义什么是AGI。当前主流的AGI定义,强调一个系统能在绝大多数人类能做的智力任务上达到或超越人类水平。这个定义隐含了一个假设:AGI的核心是“智力”——逻辑推理、知识储备、创造力。我们的定义不同…...

python文化旅游服务系统 小程序系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术栈项目亮点应用场景项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->->进我个人主页-->获取博主联系方式同行可拿货,招校园代理 ,本人源头供货商 项目概述 Python文化旅游服…...

Logback 日志框架使用与配置指南

1. Logback 核心概念与架构 Logback 是 Java 生态中最主流的日志框架之一,其配置体系主要围绕以下三个核心概念展开: Logger(日志记录器):负责捕获日志事件。它通过 name 属性(通常是包名或类名&#xff09…...

论软件系统建模方法及其应用——以飞秒激光加工控制系统为例

摘要 2024年1月,我参与了某精密制造企业“高精度飞秒激光加工控制系统”项目的研发,担任系统架构设计师,主要负责系统建模、核心模块设计与集成测试。该项目旨在开发一套用于航空叶片微孔加工的数控系统,要求实现1μm的定位精度、实时补偿与工艺自适应调整。系统具有强实时…...

视频拖动进度条时如果落在GOP内,是怎么定位的?

视频拖动进度条时的 GOP 定位行为说明 0. 名词解释:Seek 是什么? Seek(寻址/定位)来自英文 “seek”(寻找、定位),在视频/音频领域特指将播放位置跳转到指定时间点的操作。 用户拖动进度条、点击…...

DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全

DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全 一句话收益:掌握从 SharedPreferences 迁移到 Jetpack DataStore 的完整路径,彻底消除主线程 I/O 阻塞与类型安全隐患。 适用版本:Android API 21&…...

深入理解 MCP 协议:原理、架构与实战开发指南

前言 2024年底 Anthropic 发布了 MCP(Model Context Protocol),短短几个月内 GitHub 星标突破 8 万。这个协议解决了一个核心问题:如何让大模型标准化地连接外部工具和数据源。 本文将从协议设计原理出发,手把手带你实…...

【RT-DETR实战】064、NMS后处理优化与替代方案:我在RT-DETR里踩过的那些坑

今天调一个RT-DETR的部署问题,模型推理速度明明达标了,但在实际视频流里跟踪目标时总出现“闪跳”——同一个目标在相邻帧里忽左忽右。 盯着输出看了半天,发现是相邻帧的检测框置信度相差0.01,NMS直接就把低分框干掉了,导致目标位置在帧间不连续。这个经典问题让我决定好…...

从0到就业,学习网络安全的正确顺序

从0到就业,学习网络安全的正确顺序 想入行网络安全,别怕,这条路虽然看起来复杂,但只要找对方法,就能少走很多弯路。核心原则就是:先学基础,再学安全,动手永远比光看重要 一、入门基…...

汽车零部件品牌升级方法拆解:复杂B2B能力如何被客户看懂

从B2B表达方法看,汽车零部件品牌升级可以理解为一个“客户判断结构化”的问题。企业不是简单输出自我介绍,而是要把技术能力、项目经验、质量体系、协同机制与证据材料,转化为客户不同角色都能使用的判断信息。很多汽车零部件企业已经完成了实…...

河北邯郸职称评审的方式有哪几种?

1、以考代评以考代评就是指有些专业技术岗位可以通过参加考试而不是递交繁琐的材料来获得专业技术职务资格。只要顺利通过国家指定的科目考试,你就可以获得专业技术资格,省去了各种审核流程的烦恼。2、只评不考只评不考是目前zui常见、适用范围zui广的一…...

实时反欺诈Agent部署失败率高达68%?金融IT总监亲述4类典型故障链及容灾切换黄金12分钟法则

更多请点击: https://codechina.net 第一章:实时反欺诈Agent部署失败率高达68%?金融IT总监亲述4类典型故障链及容灾切换黄金12分钟法则 某头部城商行在2023年Q3上线新一代实时反欺诈Agent集群后,监控平台显示首次部署成功率仅32…...

四川资产盘活实战教培|从业者真实学习感悟

深耕资管行业多年,我发现四川不少企业长期受不良债权积压、存量资产沉淀困扰。自主催收效率低、回款周期长,再加上缺乏专业尽调、估值及司法处置能力,极易造成资产贬值、合规风险增加。在此背景下,本土实战型资产盘活教培&#xf…...

基于GIS三维地球的全球指挥官推演沙盘软件军迷免费版 谷歌地球 数字孪生 自媒体创作 战术想定编辑

一套完全自主的、基于真实地理坐标系的沉浸式战术推演引擎,其技术栈的构建是对传统可视化与交互范式的系统性革新。 全球指挥官沙盘软件军迷免费版下载 一、 项目概述:一个核心命题与两项技术挑战 本项目源于一个明确的工程命题:构建一个允…...

私有化 IM vs 公有云 IM:3 个维度告诉你该怎么选

企业在选择即时通讯工具时,常常陷入 “功能越多越好” 的误区。实际上,IM 选型的本质是一次数据治理策略的决策。私有化 IM 和公有云 IM 没有绝对的好坏,只有适合不适合。今天我们从三个核心维度,帮你做出正确的选择。第一个维度&…...

三亚高端小区实景落地选哪家

在三亚,高端小区对居住品质的要求近乎苛刻——不仅要有气派的视觉呈现,更要经得起台风、高湿、海风盐雾的考验。如果您正在寻找一家能真正实现“所见即所得”的实景落地服务商,三亚秦鼎科技有限公司就是您不容错过的选择。为什么是秦鼎科技&a…...

巨噬细胞M1型与M2型的差异

巨噬细胞具有高度的功能可塑性,依据微环境信号的不同,可极化为功能迥异的M1型(经典活化)与M2型(替代活化)两大表型。两者在活化机制、代谢特征及生物学功能上呈现出显著的“阴阳”对立与平衡。1. 活化诱导与…...

GitHub Copilot X:AI编程助手如何重塑开发工作流与效率

1. 项目概述:当代码编辑器遇见“副驾驶”如果你和我一样,每天有超过一半的时间是在代码编辑器里度过的,那你一定对“效率”这个词有着近乎偏执的追求。从语法高亮、代码补全,到后来的LSP(Language Server Protocol&…...