从零手写实现 nginx-13-nginx.conf 是 HOCON 的格式吗?

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 nginx 原理感兴趣,可以阅读:

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

从零手写实现 nginx-11-file+range 合并

从零手写实现 nginx-12-keep-alive 连接复用

从零手写实现 nginx-13-nginx.conf 配置文件介绍

从零手写实现 nginx-14-nginx.conf 和 hocon 格式有关系吗?

从零手写实现 nginx-15-nginx.conf 如何通过 java 解析处理?

从零手写实现 nginx-16-nginx 支持配置多个 server

从零手写实现 nginx-17-nginx 默认配置优化

从零手写实现 nginx-18-nginx 请求头+响应头操作

从零手写实现 nginx-19-nginx cors

配置相关

配置文件部分,可以阅读下面的文章:

config 配置方式概览-8 种配置文件介绍对比 xml/json/proeprties/ini/yaml/TOML/hcl/hocon

config HCL(HashiCorp Configuration Language) 配置文件介绍

config HCL(HashiCorp Configuration Language) 官方文档翻译

config HOCON(Human-Optimized Config Object Notation)配置文件介绍

toml-01-toml 配置文件介绍

YAML-01-yml 配置文件介绍

YAML-02-yml 配置文件 java 整合使用 yamlbeans + snakeyaml + jackson-dataformat-yaml

YAML-03-yml 配置文件介绍官方文档翻译

config ini 配置文件介绍

config properties 配置文件介绍

java 实现 xml 与对象 pojo 之间的转换的几种方式 dom4j/xstream/jackson

XStream java 实现 xml 与对象 pojo 之间的转换

json 专题系列

目标

本小节,我们主要看下面几个问题:

1) nginx.conf 是 hocon 格式吗?

2)nginx.conf 格式和 hocon 之间可以转换吗?

3)我们自己设计格式,应该选择哪一种?

Q1: nginx.conf 是 hocon 格式的吗?

Nginx 的配置文件不是 HOCON 格式的。Nginx 使用自己的配置格式,通常称为 Nginx 配置语法(Nginx configuration syntax)。

这种格式相对简单且专门为 Nginx 设计。

它使用块(block)和指令(directive)的组合来定义服务器的行为和特性。

以下是一个简单的 Nginx 配置文件示例:

worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;location / {root   html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

在这个示例中,worker_processeseventshttpserver 等都是块指令,而 listenserver_namelocation 等是普通指令。

相比之下,HOCON(Human-Optimized Config Object Notation)是一种用于配置文件的格式,主要用于配置基于 JVM 的应用程序,如 Akka、Play Framework 等。

HOCON 具有更复杂和灵活的语法,支持嵌套结构、对象、数组等。

下面是一个 HOCON 配置示例:

application {name = "MyApp"version = "1.0.0"http {host = "localhost"port = 8080}database {url = "jdbc:mysql://localhost:3306/mydb"user = "dbuser"password = "dbpassword"}
}

可以看到,HOCON 的语法和 Nginx 的配置语法有很大的不同。

因此,Nginx 的配置文件并不是 HOCON 格式的,它有自己专门的配置格式。

Q2: 可以把你给的 nginx 配置例子,改成 hocon 格式的吗

将 Nginx 配置文件转换为 HOCON 格式涉及到将 Nginx 的指令和块转换为 HOCON 支持的键值对和嵌套结构。

以下是如何将上面示例的 Nginx 配置文件转换为类似 HOCON 的格式,但请注意,这只是一个结构上的转换,实际上 Nginx 并不支持 HOCON 格式的配置文件。

nginx {worker_processes = 1events {worker_connections = 1024}http {include = "mime.types"default_type = "application/octet-stream"sendfile = "on"keepalive_timeout = 65server {listen = 80server_name = "localhost"location_root {root = "html"index = ["index.html", "index.htm"]}error_page {code = [500, 502, 503, 504]page = "/50x.html"location {root = "html"}}}}
}

在这个示例中:

  1. 使用嵌套结构来表示 Nginx 配置中的块,例如 eventshttp
  2. 将指令转换为键值对,例如 worker_processes = 1
  3. 将数组值表示为 HOCON 数组,例如 index = ["index.html", "index.htm"]
  4. 为了示例的完整性,error_page 里面的 codepage 分开写,表示多个错误代码使用相同的错误页面。

请记住,这只是一个理论上的转换,实际使用中,Nginx 不支持 HOCON 格式的配置文件,因此这个 HOCON 配置文件不能直接用于配置 Nginx 服务器。

这个示例仅用于展示如何将配置内容结构化为 HOCON 格式。

Q3: 我们自己设计文件格式,应该使用什么格式

老马这里,首先对配置文件做了统一的 java 抽象:

/*** 用户配置** @since 0.12.0* @author 老马啸西风*/
public class NginxUserConfig {// 全局配置private String httpPid;/*** 全部的 server 配置列表** @since 0.12.0*/private List<NginxUserServerConfig> serverConfigList;/*** 服务器端口*/private Set<Integer> serverPortSet;/*** 当前的服务端口*/private Integer currentServerPort;/*** 当前的 server 配置 map*/private Map<String, List<NginxUserServerConfig>> currentServerConfigMap;/*** 默认的服务配置* @since 0.14.0*/private NginxUserServerConfig defaultUserServerConfig;// 示意图...}

定义配置解析的接口:

public interface INginxUserConfigLoader {/*** 加载* @return 结果** */NginxUserConfig load();}

然后默认实现了 nginx.conf 标准格式的解析处理类:

public  class NginxUserConfigLoaderConfigFile extends AbstractNginxUserConfigLoader {private final String filePath;public NginxUserConfigLoaderConfigFile(String filePath) {this.filePath = filePath;}// 其他省略实现...@Overrideprotected NginxUserConfig doLoad() {NgxConfig conf = null;try {NginxUserConfigBs configBs = NginxUserConfigBs.newInstance();conf = NgxConfig.read(filePath);//1. basicfillBasicInfo(configBs, conf);//2. server 信息fillServerInfo(configBs, conf);// 返回return configBs.build();} catch (IOException e) {throw new RuntimeException(e);}}}

小结

这篇文章我们一起讨论了如何为 nginx 设计一套配置实现。

开始老马以为 nginx.conf 比较接近 hocon 的文件格式,后来发现并不是。

所以还是决定抽象为标准的 pojo,这样一者便于使用,再者后续用户可以根据自己的需要拓展为 yaml 等其他格式的配置。

我是老马,期待与你的下次重逢。

开源地址

为了便于大家学习,已经将 nginx 开源

https://github.com/houbb/nginx4j

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot开启跨域配置

Spring boot开启跨域配置 背景 跨域&#xff08;Cross-Origin&#xff09;是指在互联网上的一个域下的文档或脚本尝试请求另一个域下的资源时&#xff0c;域名、协议或端口不同的这种情况。具体来说&#xff0c;如果一个网页试图通过脚本&#xff08;如JavaScript&#xff09…

人月神话纪念珍藏版系列文章一:焦油坑

前言: 在史前文明,没有什么场景比巨兽们在焦油坑中垂死挣扎的场景更让人震撼。恐龙、猛犸象在焦油坑中挣扎。他们挣扎的越猛烈,焦油就缠绕的越紧,没有那种猛兽足够强壮或者具有足够的技巧,能够挣脱出来,它们最后都淹没在坑中。 最近几十年的大型系统编程就犹如这样的一个…

百度高级项目经理洪刘生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 百度在线网络技术&#xff08;北京&#xff09;有限公司IDG智能驾驶业务部高级项目经理洪刘生先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“互联网PMO赋能战略项目集管理实战分享”。大会将于6月29-30日在北京举办…

clickHouse实现表自增ID的代码及相关逻辑

一、介绍 clickHourse表自增ID主要时两种方式&#xff1a; insert数据时&#xff0c;手动维护一个全局ID给表设置uuid字段&#xff0c;使用 generateUUIDv4()函数赋予默认值。 这里的话推荐手动维护一个全局的自增ID&#xff0c;不推荐使用UUID的方式&#xff0c;主要原因有…

python数据分析-ZET财务数据分析

一、公司背景 中兴通讯股份有限公司是一家总部位于中国深圳的跨国公司&#xff0c;致力于为全球客户提供通信设备和解决方案。公司成立于1985年&#xff0c;自成立以来一直致力于为客户提供创新的通信技术和服务。中兴通讯的业务涵盖多个领域&#xff0c;包括但不限于高端路由…

【Java面试】十七、并发篇(上)

文章目录 1、synchronized关键字的底层原理&#xff1a;Monitor2、synchronized相关2.1 为什么说synchronized是重量级锁2.2 synchronized锁升级之偏向锁2.3 synchronized锁升级之轻量级锁 3、Java内存模型JMM4、CAS4.1 CAS流程4.2 CAS底层实现 5、volatile关键字的理解5.1 可见…

idea打开hierarchy面板

hierarchy&#xff1a;查看类层级关系图 不同版本的IDEA的快捷键不一样&#xff0c;同时如果修改了IDEA快捷键&#xff0c;也可能会不一样&#xff0c;具体查看可通过IDEA上方的Navigate来查看navigate--Type Hierarchy&#xff0c;就可以看见其快捷键了&#xff0c;我的快捷键…

(四)React组件、useState

1. 组件 1.1 组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以相互嵌套&#xff0c;也可以复用多次。 组件化开发可以让开发者像搭积木一样构建一个完整的庞大应用 1.2 React组件 在React中&#xf…

less---20-28

less-20 这关登陆成功会显示cookie,所以抓包在cookie处注入 less-21 这关登陆成功会显示cookie,所以抓包在cookie处注入&#xff0c;发现不成功&#xff0c;查看代码发现被编码 先对注入语句进行base64编码再注入 less-22 闭合字符",同21关 less-23 这关查看代码发现…

Java现在还适合入门吗?

计算机技术在当今的社会&#xff0c;已经变得越来越热&#xff0c;充斥着我们生活的方方面面。人们的工作或是休闲&#xff0c;离不开互联网和电脑&#xff0c;这既受益于各类软件的诞生&#xff0c;也与时下的技术息息相关。Java作为编程界赫赫有名的语言&#xff0c;在最近几…

八爪鱼现金流-018,持续打磨

八爪鱼,被动收入,财务自由,现金流,现金流游戏,各银行利率,money,资产负债表,财务自由,资产管理,个人理财,管理个人资产,理财,打造被动收入,躺着赚钱,让钱为我打工

力扣2444.统计定界子数组的数目

力扣2444.统计定界子数组的数目 观察到不满足条件的数 可以作为天然的分割线 因此在枚举右端点的过程中 预处理minK&#xff0c;maxK和分割线上一次出现的下标 res min(min_i,max_i) - i0; 但是因为可能在到下个区段时 min_i和max_i尚未更新 导致结果为负数 所以要跟0再取一…

LabVIEW在高校中的应用

LabVIEW 作为一款功能强大的图形化编程工具&#xff0c;在高校中有广泛的应用。它不仅用于教学实验&#xff0c;还广泛应用于科研项目和工程训练。本文将从教学、科研、实验室管理和学生技能培养等多个角度&#xff0c;详细分析LabVIEW在高校中的应用。 教学应用 课程设计 自动…

完全二叉树的节点个数-力扣

完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层&#xff0c;则该层包含 1~ 2h 个节点。 因此&#xff0c;…

深入Llama2:掌握未来语言模型的秘密

Llama2是一个基于Transformer架构的大型语言模型&#xff0c;它旨在处理和理解大规模的文本数据。作为技术人员&#xff0c;了解Llama2的工作原理、模型结构和训练方法对于有效利用该模型至关重要。本文将详细介绍Llama2的基本概念、主要作用、使用方法及注意事项。 一、简介 …

多模态vlm综述:An Introduction to Vision-Language Modeling 论文解读

目录 1、基于对比学习的VLMs 1.1 CLIP 2、基于mask的VLMs 2.1 FLAVA 2.2 MaskVLM 2.3 关于VLM目标的信息理论视角 3、基于生成的VLM 3.1 学习文本生成器的例子: 3.2 多模态生成模型的示例: 3.3 使用生成的文本到图像模型进行下游视觉语言任务 4、 基于预训练主干网…

Python | C++ | MATLAB | Julia | R 市场流动性数学预期评估量

&#x1f3af;要点 &#x1f3af;市场流动性策略代码应用&#xff1a;&#x1f3af;动量策略&#xff1a;滚动窗口均值策略、简单移动平均线策略、指数加权移动平均线策略、相对强弱指数、移动平均线收敛散度交叉策略、三重指数平均策略、威廉姆斯 %R 策略 | &#x1f3af;均值…

LLVM Cpu0 新后端7 第二部分 窥孔优化

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

170.二叉树:平衡二叉树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…

第103天: 权限提升-Linux 系统辅助项目脏牛Dirty内核漏洞SUIDGUID

项目下载地址 综合类探针&#xff1a; https://github.com/liamg/traitor 自动化提权&#xff1a; https://github.com/AlessandroZ/BeRoot 信息收集&#xff1a; https://github.com/rebootuser/LinEnum https://github.com/sleventyeleven/linuxprivchecker 漏洞探针&#xf…