从零手写实现 nginx-13-nginx.conf 配置例子解释 + nginx 配置文件要如何解析?

前言

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

我们为 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

一个 nginx.conf 的例子

# nginx.conf# 定义运行Nginx的用户和组
user nginx;# 主进程的PID文件存放位置
pid /var/run/nginx.pid;# 事件模块配置
events {worker_connections 1024;  # 每个工作进程的最大连接数
}# HTTP模块配置
http {include /etc/nginx/mime.types;  # MIME类型配置文件default_type application/octet-stream;  # 默认的MIME类型# 访问日志配置access_log /var/log/nginx/access.log;  # 访问日志文件路径# 错误日志配置error_log /var/log/nginx/error.log;  # 错误日志文件路径# 文件传输设置sendfile on;  # 开启高效文件传输tcp_nopush on;  # 防止网络拥塞# Keepalive超时设置keepalive_timeout 65;# 定义服务器块server {listen 80;  # 监听80端口server_name example.com;  # 服务器域名# 静态文件的根目录root /usr/share/nginx/html;  # 静态文件存放的根目录index index.html index.htm;  # 默认首页# 定义location块,处理对根目录的请求location / {try_files $uri $uri/ =404;  # 尝试提供请求的文件,如果不存在则404}}server {listen 443 ssl;server_name  secure-example.com;ssl_certificate     /etc/nginx/ssl/secure-example.com.crt;ssl_certificate_key /etc/nginx/ssl/secure-example.com.key;location / {root   /var/www/secure-example.com;index  index.html index.htm;}}}

自己解析

思路

我们可以自己写一堆代码,然后解析这个配置文件。

伪代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class NginxConfigParser {public static void main(String[] args) {Map<String, String> configMap = parseNginxConfig("/path/to/nginx.conf");System.out.println("Nginx configuration settings:");for (Map.Entry<String, String> entry : configMap.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}}public static Map<String, String> parseNginxConfig(String filePath) {Map<String, String> configMap = new HashMap<>();try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {String line;String currentBlock = "";Pattern pattern = Pattern.compile("^\\s*([^#\\s][^\\s]*)\\s*([^#]+)?");while ((line = reader.readLine()) != null) {Matcher matcher = pattern.matcher(line);if (matcher.find()) {String directive = matcher.group(1);String value = matcher.group(2);if (value != null) {value = value.trim();if (value.endsWith(";")) {value = value.substring(0, value.length() - 1).trim();}}if (directive.equals("server")) {currentBlock = "server";} else if (directive.equals("location")) {currentBlock = "location";}if (!directive.isEmpty()) {configMap.put(currentBlock + "." + directive, value);}}}} catch (IOException e) {e.printStackTrace();}return configMap;}
}

实际效果

上面的内容,如果用这个方法解析,实际上并不太准确。

Nginx configuration settings:
.events = {
location.} = null
server.listen = 80
.error_log = /var/log/nginx/error.log
server.server = {
location.try_files = $uri $uri/ =404
.include = /etc/nginx/mime.types
.keepalive_timeout = 65
.user = nginx
.tcp_nopush = on
.pid = /var/run/nginx.pid
server.server_name = example.com
.} = null
.http = {
.default_type = application/octet-stream
.worker_connections = 1024
location.location = / {
server.root = /usr/share/nginx/html
server.index = index.html index.htm
.access_log = /var/log/nginx/access.log
.sendfile = on

优缺点

自己实现,可控性相对比较强。

但是缺点是比较麻烦,可能还会引入一堆问题。

三方库解析

第二种是利用三方库。

比如 https://github.com/odiszapc/nginx-java-parser

Nginx配置Java解析器

这个库帮助分析Nginx Web服务器配置文件,查找指定的参数、块、正则表达式或注释。

然后AST可以被修改并转换回纯文本文件。

maven 依赖

<dependency><groupId>com.github.odiszapc</groupId><artifactId>nginxparser</artifactId><version>0.9.3</version>
</dependency>

解析例子

package com.github.houbb.nginx4j.config;import com.github.odiszapc.nginxparser.NgxBlock;
import com.github.odiszapc.nginxparser.NgxConfig;
import com.github.odiszapc.nginxparser.NgxEntry;
import com.github.odiszapc.nginxparser.NgxParam;import java.io.IOException;
import java.util.List;public class NginxConfigParserTest {public static void main(String[] args) throws IOException {NgxConfig conf = NgxConfig.read("D:\\github\\nginx4j\\src\\test\\resources\\nginx-demo.conf");// 基本信息NgxParam pidParam = conf.findParam("pid");System.out.println(pidParam.getValue());;NgxParam worker_connectionsParam = conf.findParam("events", "worker_connections");System.out.println(worker_connectionsParam.getValue());// 模块下多级NgxParam listen = conf.findParam("http", "server", "listen"); // 示例2System.out.println(listen.getValue()); // "8889"// 首先获取 blockList<NgxEntry> servers = conf.findAll(NgxConfig.BLOCK, "http", "server"); // 示例3for (NgxEntry entry : servers) {NgxBlock ngxBlock = (NgxBlock) entry;String name = ngxBlock.getName();// valueString value = ngxBlock.findParam("listen").getValue(); // 第一次迭代返回"on",第二次迭代返回"off"System.out.println(name + "---" + value);}}}

测试日志

/var/run/nginx.pid
1024
80
server---80
server---443 ssl

转储器

NgxConfig conf = NgxConfig.read("/etc/nginx/nginx.conf");
// ...
NgxDumper dumper = new NgxDumper(conf);
return dumper.dump(System.out);

自定义的解析类

思路

我们首先进行一层封装,方便后续的接口替换。

目前底层使用 nginxparser 来统一实现。

效果

/var/run/nginx.pid
1024
80
server---80
server---443 ssl

小结

本文介绍了 nginx 配置文件的例子,和自己解析的思路。

不过还是推荐使用三方标准库来处理,这样很多情况解决的比较充分。

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

开源地址

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

https://github.com/houbb/nginx4j

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

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

相关文章

Java心跳检测机制

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 心跳检测的定义 心跳检测是一种监控机制&#xff0c;在Java编程和分布式系统中具有广泛的应用。心跳检测&#xff0c;顾名思义&#xff0c;就像心跳一样&#xff0c;是一种…

【JS】理解闭包及其应用

历史小剧场 明朝灭亡&#xff0c;并非是简单的政治问题&#xff0c;事实上&#xff0c;这是世界经济史上的一个重要案例。 所谓没钱&#xff0c;就是没有白银。----《明朝那些事儿》 什么是闭包&#xff1f; 闭包就是指有权访问另一个函数作用域中变量的函数 闭包变量存储位置&…

Lidar3607.2 雷达点云数据处理软件新增功能介绍

新特性:预处理航带平差新增livox激光器镜面误差改正,新增多源航带平差&#xff0c;提升点云和影像匹配精度优化配准功能流程&#xff0c;ICP功能支持点云与模型配准安置检校新增轨迹自动裁剪轨迹解算时投影坐标增加Z值记录数据管理新增点云色彩亮度和对比度调节新增多段线平滑工…

Python中报错提示:TypeError: Student() takes no arguments

Python中报错提示&#xff1a;TypeError: Student() takes no arguments 在Python编程中&#xff0c;类是创建对象的蓝图。每个类都可能包含一个特殊的方法__init__&#xff0c;我们称之为构造函数&#xff0c;它在创建新实例时被调用。如果你在尝试创建一个类的实例时遇到了Ty…

端午节赛龙舟,我们的新队员---AI大模型

赛龙舟的比赛通常在一个湖泊或河流上进行&#xff0c;参赛队伍会驾驭着长形的龙舟&#xff0c;每艘船上有一名鼓手和多名桨手。比赛开始时&#xff0c;鼓手会击鼓来指挥桨手的划桨节奏&#xff0c;而桨手们则要协同合作&#xff0c;以最快的速度将龙舟划向终点。 赛龙舟不仅仅是…

【SpringCloud学习笔记】Docker(中篇)

Docker 1. 自定义镜像 前面我们都是使用docker pull拉取仓库中现成的镜像&#xff0c;但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢&#xff1f;这个时候我们就需要自定义镜像了 **镜像&#xff1a;**本质上就是一堆文件的集合&#xff0c;包含了应用程…

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

临床应用的深度学习在视网膜疾病的诊断和转诊中的应用| 文献速递-视觉通用模型与疾病诊断

Title 题目 Clinically applicable deep learning for diagnosis and referral in retinal disease 临床应用的深度学习在视网膜疾病的诊断和转诊中的应用 01 文献速递介绍 诊断成像的数量和复杂性正在以比人类专家可用性更快的速度增加。人工智能在分类一些常见疾病的二…

归并排序-成绩输出-c++

注&#xff1a;摘自hetaobc-L13-4 【任务目标】 按学号从小到大依次输入n个人的成绩&#xff0c;按成绩从大到小输出每个人的学号&#xff0c;成绩相同时学号小的优先输出。 【输入】 输入第一行为一个整数&#xff0c;n&#xff0c;表示人数。&#xff08;1 ≤ n ≤ 100000…

【Node.js快速部署opencv项目】图像分类与目标检测

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

高考之后第一张大流量卡应该怎么选?

高考之后第一张大流量卡应该怎么选&#xff1f; 高考结束后&#xff0c;选择一张合适的大流量卡对于准大学生来说非常重要&#xff0c;因为假期期间流量的使用可能会暴增。需要综合考虑多个因素&#xff0c;以确保选到最适合自己需求、性价比较高且稳定的套餐。以下是一些建议…

BM算法举例

BM算法概述 Boyer-Moore算法(BM算法)是一种高效的字符串匹配算法。它通过在匹配过程中尽可能多地跳过不必要的字符比较来加速搜索过程。BM算法主要利用两个启发规则:坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule)。 以下是Boyer-Moore算法的Python实现…

【Python机器学习】非负矩阵分解(NMF)

非负矩阵分解&#xff08;NMF&#xff09;也是一种无监督算法&#xff0c;其目的在于提取有用的特征。它的工作原理类似于PCA&#xff0c;也可以用于降维。与PCA相同&#xff0c;我们试图将每个数据点写成一些分量的加权求和。但在PCA中&#xff0c;我们想要的是正交分量&#…

Linux——PXE整体流程

1.自己安装一个CentOS 8的服务器 1&#xff09;手动安装 虚拟硬件配置&#xff1a;2核CPU&#xff0c;4G内存&#xff0c;100G硬盘 2个网卡&#xff08;一个通外网&#xff0c;一个内部使用&#xff09; 软件安装&#xff1a;Server GUI 磁盘分区&#xff1a;使用逻辑卷&#…

小黑狗AI:新媒体AI创作的得力助手

在当前内容创作爆炸的时代,如何高效、优质地输出内容备受重视。小黑狗AI凭借强大的AI技术,专注于为新媒体内容创作者提供智能化的辅助工具,旨在成为创作者们最听话、最贴心的AI助手。 专注新媒体AI创作&#xff0c;争做最听话的AI工具&#xff1a;小黑狗AI 功能一览 小黑狗A…

Django API开发实战:前后端分离、Restful风格与DRF序列化器详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

中心极限定理的MATLAB例

独立同分布的中心极限定理&#xff1a; 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​ 是独立同分布的随机变量序列&#xff0c;且 E ( X i ) μ E(X_i) \mu E(Xi​)μ&#xff0c; D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi​)σ2>0&a…

《C++ Primer Plus》第十三章复习题和编程练习

目录 一、复习题**二、编程练习 一、复习题** 1. 派生类从基类那里继承了什么&#xff1f; 答&#xff1a;在类的继承和派生中&#xff0c;C中的派生类能够继承基类的所有数据成员和大部分成员函数。但是基类中不同访问控制权限的成员在派生中的访问权限也不相同。公有成员直…

【GIT】git submodule add 命令的使用技巧,亲测可行

在Git中&#xff0c;git submodule add 命令用于将一个外部的Git仓库作为子模块添加到当前的Git仓库中。子模块允许你将一个Git仓库作为另一个Git仓库的子目录。这在你需要将一个项目的一部分作为另一个项目的依赖时非常有用。 使用 git submodule add 命令的基本语法如下&…

快速将字符串转换为python数据类型

可以使用 python 中的 eval() 函数&#xff0c;举例如下&#xff0c;我需要将大模型输出字符串转换为 numpy 数据类型 import numpy as np import ast# 原始字符串 s "[(-0.014,0.009),(0.005,-0.027),(-0.008,0.006),(-0.014,0.014)]"# 安全地解析字符串中的表达式…