经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
15. 从零开始编写一个类nginx工具, 如果将nginx.conf转成yaml,toml,json会怎么样
来源:cnblogs  作者:问蒙服务框架  时间:2023/10/20 8:45:11  对本文有异议

wmproxy

wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法

项目 ++wmproxy++

gite: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

了解三种格式

Json

  • JSON是一种轻量级的数据交换格式,被广泛使用在Web应用程序之间传输数据。
  • JSON使用大括号{}来表示数据结构,使用冒号:来连接键和值。
  • JSON支持字符串、数字、布尔值、null、数组和对象等多种数据类型。
  • JSON文件通常用于数据交换、存储等场景,也可以用作配置文件。
    JSON简单易读存储通用,但JSON原生不支持注释用来做配置文件比较硬伤。

它流行度极高,基本上每个程序员都和他打过交道。
多层级时,对齐和缩进不好控制,容易出错

Yaml

  • YAML被设计为一种可读性极强的数据序列化标准,可以用来表达层次化数据。
  • YAML使用空格缩进来表示数据层次结构。
  • YAML支持浮点数、布尔值、字符串、数组、映射等多种数据类型。
  • YAML文件通常用于配置文件、数据交换等场景。

与JSON及TOML相比,结构比较紧凑
但相对用空格缩近,编写及拷贝时出错的机率比JSON及TOML高许多

Toml

TOML 旨在成为一个语义明显且易于阅读的最小化配置文件格式。
TOML 应该能很容易地被解析成各种语言中的数据结构。

  • TOML是一种简洁明了的键值对格式,被设计成可以很容易地映射为哈希表。
  • TOML使用等号(=)来连接键和值,使用缩进来表示数据层次结构。
  • TOML支持整数、浮点数、字符串、布尔值、数组、字典等多种数据类型。
  • TOML文件通常用于配置文件、数据交换等场景。

易于阅读和编写语法灵活
与JSON配置相比,TOML在简洁性方面远远胜出;
与YAML配置相比,TOML在简洁性以及语法灵活性方面远远胜出。

三种格式测试数据的对比

我们用Rust的项目配置文件来做对比,为了展示所有的类型,格式有所变更。它以Toml来做配置文件,我们首先先展示toml的格式

内容包含创建者,创建时间,项目名称,项目依赖等信息,如果我们将其转化成可配置的JSON格式时

toml

  1. create="tickbh"
  2. create_time=2023-09-08T10:30:00Z
  3. [project]
  4. # 项目名称
  5. name="wmproxy"
  6. version="1.1"
  7. editor=2022
  8. # 项目依赖
  9. [project.dependencies]
  10. wenmeng={version = "0.1.21", default-features = false, features = ["std", "tokio"]}
  11. webparse={version = "0.1", default-features = false}

行数12行,注释两行,全部顶格开头,原生支持时间格式

json

  1. {
  2. "create": "tickbh",
  3. "create_time": "2023-09-08T10:30:00.000Z",
  4. "project": {
  5. "name": "wmproxy",
  6. "version": "1.1",
  7. "editor": 2022,
  8. "dependencies": {
  9. "wenmeng": {
  10. "version": "0.1.21",
  11. "default-features": false,
  12. "features": [
  13. "std",
  14. "tokio"
  15. ]
  16. },
  17. "webparse": {
  18. "version": "0.1",
  19. "default-features": false
  20. }
  21. }
  22. }
  23. }

行数23行,层次的递进比较多,不容易对齐,无法注释,不支持时间格式

yaml

  1. create: tickbh
  2. create_time: 2023-09-08T10:30:00.000Z
  3. project:
  4. # 项目名称
  5. name: wmproxy
  6. version: "1.1"
  7. editor: 2022
  8. # 项目依赖
  9. dependencies:
  10. wenmeng:
  11. version: 0.1.21
  12. default-features: false
  13. features:
  14. - std
  15. - tokio
  16. webparse:
  17. version: "0.1"
  18. default-features: false

行数18行,注释两行,原生支持时间格式,到features这级行,深度相对较高,但是一眼看上去比json清晰

相对来说JSON比较不适合做比较复杂的配置文件,但VSCODE使用的拓展的JSON以支持注释功能。

接下来尝试将nginx.conf格式做转换

以下尝试的将

  1. http {
  2. gzip on;
  3. server {
  4. listen 80; #监听80的服务端口
  5. server_name wm-proxy.com; #监听的域名
  6. location /products {
  7. proxy_pass http://127.0.0.1:8090/proxy;
  8. add_header 'Access-Control-Allow-Credentials' 'true';
  9. add_header 'Access-Control-Allow-Origin' '*';
  10. }
  11. location / {
  12. root wmproxy;
  13. index index.html index.htm;
  14. }
  15. }
  16. }

我们也模仿类似的结构,但是对于toml,yaml,json来说,都没有一个key两个值的,要么我们只能用对应的数组,此时我来先来初步重构类似的结构。以下我们以toml结构为例,我们分析table的级数有三级,最外层为http,中间层为server为数组,最内层为location也为数组,headers我们用之前提到过的mappings,用proxy开头来表示重写Reqeust,其它的来表示重写Response,文件系统我们用上节提到的file_server
我们先定义http的table,他只有一个属性gzip为on

  1. [http]
  2. gzip="on"

其次server为一个数组,那么我们可以如下定义,有绑定地址和server_name

  1. [[http.server]]
  2. bind_addr="127.0.0.1:80"
  3. server_name="wm-proxy.com"

再然后location也为一个数组,定义如下

  1. [[http.server.location]]
  2. rule = "/products"
  3. reverse_proxy = "http://127.0.0.1:8090/proxy"
  4. headers = [
  5. ["+", "Access-Control-Allow-Credentials", "true"],
  6. ["+", "Access-Control-Allow-Origin", "*"]
  7. ]
  8. [[http.server.location]]
  9. rule = "/"
  10. file_server = { root="wmproxy", browse = true, index=["index.html", "index.htm"] }

那么,最终的结构为如下:

  1. [http]
  2. gzip="on"
  3. [[http.server]]
  4. bind_addr="127.0.0.1:80"
  5. server_name="wm-proxy.com"
  6. [[http.server.location]]
  7. rule = "/products"
  8. reverse_proxy = "http://127.0.0.1:8090/proxy"
  9. headers = [
  10. ["+", "Access-Control-Allow-Credentials", "true"],
  11. ["+", "Access-Control-Allow-Origin", "*"]
  12. ]
  13. [[http.server.location]]
  14. rule = "/"
  15. file_server = { root="wmproxy", browse = true, index=["index.html", "index.htm"] }

而yaml的格式结构如下:

  1. http:
  2. gzip: on
  3. server:
  4. - bind_addr: 127.0.0.1:80
  5. server_name: wm-proxy.com
  6. location:
  7. - rule: /products
  8. reverse_proxy: http://127.0.0.1:8090/proxy
  9. headers:
  10. - - +
  11. - Access-Control-Allow-Credentials
  12. - "true"
  13. - - +
  14. - Access-Control-Allow-Origin
  15. - "*"
  16. - rule: /
  17. file_server:
  18. root: wmproxy
  19. browse: true
  20. index:
  21. - index.html
  22. - index.htm

而json的格式结构如下:

  1. {
  2. "http": {
  3. "gzip": "on",
  4. "server": [
  5. {
  6. "bind_addr": "127.0.0.1:80",
  7. "server_name": "wm-proxy.com",
  8. "location": [
  9. {
  10. "rule": "/products",
  11. "reverse_proxy": "http://127.0.0.1:8090/proxy",
  12. "headers": [
  13. [
  14. "+",
  15. "Access-Control-Allow-Credentials",
  16. "true"
  17. ],
  18. [
  19. "+",
  20. "Access-Control-Allow-Origin",
  21. "*"
  22. ]
  23. ]
  24. },
  25. {
  26. "rule": "/",
  27. "file_server": {
  28. "root": "wmproxy",
  29. "browse": true,
  30. "index": [
  31. "index.html",
  32. "index.htm"
  33. ]
  34. }
  35. }
  36. ]
  37. }
  38. ]
  39. }
  40. }
  • 自建的好处是比较清晰,可以自定义自己合适的结构,但是编写者需要重新开始学习,而用能用的配置文件需要遵循它的格式定义
  • 像toml文件,如果层级很深,他的key值配置会很长,因为他一旦定义一个table,就是从最顶级来解析,但是编写者只要熟悉过这配置文件很快就能写出满意的配置文件
  • 而yaml的层级结构相对会需要去看对齐与否,编写的时候需要额外注意,因为弄错了缩进,层级就会发生错误
  • 而json最后结尾的会有相当多的花括号,相对比较容易弄错。JSON总体来说不太适合做比较复杂的配置文件

结语

在不考虑自建格式的情况下,如nginx的nginx.conf,如caddy的Caddyfile,将会同时兼容tomlyaml格式的配置文件。

原文链接:https://www.cnblogs.com/luojiawaf/p/17776168.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号