作者: admin

  • 了解 Caddy 的分布式 HTTP 缓存模块

    Caddy 是一款功能强大的网络服务器,而 caddyserver/cache-handler 模块为其提供了强大的分布式 HTTP 缓存功能。本文将带你了解这个模块的特点、基本配置以及一些高级用法。

    模块简介

    caddyserver/cache-handler 是一个基于 Souin 缓存的分布式 HTTP 缓存模块。它具备以下主要特点:

    • 遵循 RFC 7234 标准的 HTTP 缓存。
    • 设置 Cache-Status HTTP 响应头。
    • 提供 REST API 来清除缓存和列出存储的资源。
    • 支持 ESI 标签处理(使用 go-esi 包)。
    • 内置分布式缓存支持。

    基本配置

    使用最小配置,响应会被缓存 120 秒。以下是一个简单的例子:

    {
        cache
    }
    
    example.com {
        cache
        reverse_proxy your-app:8080
    }

    这个配置中,只需添加 cache 指令,所有请求的响应将被缓存 120 秒。

    全局选项语法

    全局选项允许你更细粒度地控制缓存行为。以下是一些常用的配置选项:

    {
        log {
            level debug
        }
        cache {
            allowed_http_verbs GET POST PATCH
            api {
                basepath /some-basepath
                prometheus
                souin {
                    basepath /souin-changed-endpoint-path
                }
            }
            badger {
                path the_path_to_a_file.json
            }
            cache_keys {
                .*\.css {
                    disable_body
                    disable_host
                    disable_method
                    disable_query
                    headers X-Token Authorization
                    hide
                }
            }
            cache_name Another
            cdn {
                api_key XXXX
                dynamic
                email darkweak@protonmail.com
                hostname domain.com
                network your_network
                provider fastly
                strategy soft
                service_id 123456_id
                zone_id anywhere_zone
            }
            etcd {
                configuration {
                    # Your etcd configuration here
                }
            }
            key {
                disable_body
                disable_host
                disable_method
                headers Content-Type Authorization
            }
            log_level debug
            mode bypass
            nuts {
                path /path/to/the/storage
            }
            olric {
                url url_to_your_cluster:3320
                path the_path_to_a_file.yaml
                configuration {
                    # Your olric configuration here
                }
            }
            regex {
                exclude /test2.*
            }
            stale 200s
            ttl 1000s
            default_cache_control no-store
        }
    }
    
    :4443
    respond "Hello World!"

    指令选项

    缓存指令允许你在更具体的请求路径上应用缓存策略。例如:

    @match path /path
    
    handle @match {
        cache {
            cache_name ChangeName
            cache_keys {
                (host1|host2).*\.css {
                    disable_body
                    disable_host
                    disable_method
                    disable_query
                    headers X-Token Authorization
                }
            }
            cdn {
                api_key XXXX
                dynamic
                email darkweak@protonmail.com
                hostname domain.com
                network your_network
                provider fastly
                strategy soft
                service_id 123456_id
                zone_id anywhere_zone
            }
            key {
                disable_body
                disable_host
                disable_method
                disable_query
                headers Content-Type Authorization
            }
            log_level debug
            regex {
                exclude /test2.*
            }
            stale 200s
            ttl 1000s
            default_cache_control no-store
        }
    }

    缓存提供者配置

    caddyserver/cache-handler 支持多种缓存提供者,包括 Badger、Etcd、NutsDB、Olric 和 Redis。以下是一些示例配置:

    Badger

    badger-path.com {
        cache {
            badger {
                path /tmp/badger/first-match
            }
        }
    }

    Redis

    redis-url.com {
        cache {
            redis {
                url 127.0.0.1:6379
            }
        }
    }

    结论

    caddyserver/cache-handler 模块为 Caddy 提供了强大的分布式 HTTP 缓存能力。通过灵活的配置选项和多种缓存提供者的支持,你可以根据具体需求优化网站性能。如果你正在寻找一种高效的缓存解决方案,这个模块无疑是一个值得尝试的选择。

    参考文献:GitHub – caddyserver/cache-handler: Distributed HTTP caching module for Caddy

  • Adobe RTMP 规范:实时消息传递协议详解

    Adobe 的实时消息传递协议(RTMP),是一种应用层协议,旨在通过适当的传输协议(如 TCP)多路复用和打包多媒体传输流(如音频、视频和交互内容)。以下是对 RTMP 规范的详细解析。

    文档概述

    文件状态

    本文档是 2012 年 12 月 21 日发布的 “Adobe 的实时消息传递协议” 规范的机器可读版本。自 2012 年 PDF 版本以来,规范内容并未发生实质性变化,仅在格式和文字编辑上有所调整。

    引言

    RTMP 提供了在可靠的流传输(如 TCP)上的双向消息多路复用服务,旨在携带视频、音频和数据消息的并行流,并附带相关的时间信息。实现通常会为不同类别的消息分配不同的优先级,这会影响在传输容量受限时消息入队到底层流传输的顺序。

    术语

    • MUST: 必须
    • REQUIRED: 必需
    • SHALL: 应该
    • SHOULD: 建议
    • MAY: 可以

    贡献者

    • Rajesh Mallipeddi:原 Adobe Systems 编辑,提供了大部分原始文本。
    • Mohit Srivastava:Adobe Systems 贡献者。

    定义

    • Payload: 包含在数据包中的数据,如音频样本或压缩视频数据。
    • Packet: 由固定头和负载数据组成的数据包。
    • Port: 传输协议用来区分主机内多个目的地的抽象。
    • Transport address: 用于识别传输层端点的网络地址和端口的组合。

    字节顺序、对齐和时间格式

    • 所有整数字段按网络字节顺序(大端序)传输。
    • 时间戳以毫秒为单位,相对于一个未指定的纪元。

    RTMP 块流

    消息格式

    消息格式应包含以下必要字段:

    • Timestamp: 消息的时间戳(4 字节)。
    • Length: 消息负载的长度(3 字节)。
    • Type ID: 消息类型 ID(1 字节)。
    • Message Stream ID: 消息流 ID(4 字节,小端序)。

    握手

    RTMP 连接从握手开始,客户端和服务器各发送相同的三个块(C0、C1、C2 和 S0、S1、S2)。

    块化

    在握手后,连接多路复用一个或多个块流。每个块流携带一种类型的消息。每个块都有唯一的块流 ID。块的传输顺序必须完整发送。接收端根据块流 ID 重新组装消息。

    块格式

    每个块由一个头和数据组成。头有三个部分:

    • Basic Header: 编码块流 ID 和块类型(1-3 字节)。
    • Message Header: 编码关于消息的信息(0、3、7 或 11 字节)。
    • Extended Timestamp: 编码完整的 32 位时间戳(0 或 4 字节)。

    RTMP 消息格式

    消息头

    消息头包含以下字段:

    • Message Type: 消息类型(1 字节)。
    • Length: 负载大小(3 字节)。
    • Timestamp: 消息的时间戳(4 字节)。
    • Message Stream ID: 消息流 ID(3 字节)。

    用户控制消息

    RTMP 使用消息类型 ID 4 进行用户控制消息。这些消息包含 RTMP 流层使用的信息。

    RTMP 消息类型

    命令消息

    携带客户端和服务器之间的 AMF 编码命令。命令消息有两个类型值:20 表示 AMF0 编码,17 表示 AMF3 编码。

    数据消息

    用于发送元数据或用户数据。类型值为 18(AMF0)和 15(AMF3)。

    共享对象消息

    用于管理多个客户端和服务器之间的分布式数据。类型值为 19(AMF0)和 16(AMF3)。

    音频消息

    用于发送音频数据,类型值为 8。

    视频消息

    用于发送视频数据,类型值为 9。

    聚合消息

    包含一系列RTMP 子消息的单一消息。类型值为 22。

    消息交换示例

    发布录制视频

    此示例说明发布者如何发布流并将视频流发送到服务器。其他客户端可以订阅此发布的流并播放视频。

    +--------------------+                     +-----------+
    |  Publisher Client  |        |            |   Server  |
    +----------+---------+        |            +-----+-----+
              |           Handshaking Done           |
              |                  |                  |
              |                  |                  |
    ---+---- |----- Command Message(connect) ----->|
       |     |                                     |
       |     |<----- Window Acknowledge Size ------|
    Connect |     |                                     |
       |     |<------ Set Peer BandWidth ----------|
       |     |                                     |
       |     |------ Window Acknowledge Size ----->|
       |     |                                     |
       |     |<----- User Control(StreamBegin) ----|
       |     |                                     |
    ---+---- |<-------- Command Message -----------|
              |   (_result- connect response)       |
              |                                     |
    ---+---- |--- Command Message(createStream) -->|
    Create |     |                                     |
    Stream |     |                                     |
    ---+---- |<------- Command Message ------------|
              | (_result- createStream response)    |
              |                                     |
    ---+---- |---- Command Message(publish) ------>|
       |     |                                     |
       |     |<----- User Control(StreamBegin) ----|
       |     |                                     |
       |     |---- Data Message (Metadata) ------->|
    Publishing|     |                                     |
    Content   |     |------------ Audio Data ------------>|
       |     |                                     |
       |     |------------ SetChunkSize ---------->|
       |     |                                     |
       |     |<--------- Command Message ----------|
       |     |      (_result- publish result)      |
       |     |                                     |
       |     |------------- Video Data ----------->|
       |     |                  |                  |
       |     |                  |                  |
              |    Until the stream is complete     |
              |                  |                  |

    广播共享对象消息

    此示例说明在创建和更改共享对象期间交换的消息。它还说明了共享对象消息广播的过程。

    +----------+                       +----------+
    |  Client  |           |           |  Server  |
    +-----+----+           |           +-----+----+
           |   Handshaking and Application    |
           |          connect done            |
           |                |                 |
           |                |                 |
           |                |                 |
           |                |                 |
    Create and ---+---- |---- Shared Object Event(Use)---->|
    connect       |     |                                  |
    Shared Object |     |                                  |
    ---+---- |<---- Shared Object Event --------|
           |       (UseSuccess,Clear)         |
           |                                  |
    ---+---- |------ Shared Object Event ------>|
    Shared object |     |         (RequestChange)          |
    Set Property  |     |                                  |
    ---+---- |<------ Shared Object Event ------|
           |            (Success)             |
           |                                  |
    ---+---- |------- Shared Object Event ----->|
    Shared object|     |           (SendMessage)          |
    Message      |     |                                  |
    Broadcast ---+---- |<------- Shared Object Event -----|
           |           (SendMessage)          |
                              |                 |
                              |                 |

    从录制流发布元数据

    此示例描述了发布元数据的消息交换。

    +------------------+                       +---------+
    | Publisher Client |         |             |   FMS   |
    +---------+--------+         |             +----+----+
           |     Handshaking and Application     |
           |            connect done             |
           |                  |                  |
           |                  |                  |
    ---+--- |-- Command Messsage (createStream) ->|
    Create |    |                                     |
    Stream |    |                                     |
    ---+--- |<-------- Command Message -----------|
           |   (_result - command response)      |
           |                                     |
    ---+--- |---- Command Message (publish) ----->|
    Publishing |    |                                     |
    metadata |    |<----- UserControl (StreamBegin) ----|
    from file |    |                                     |
              |    |---- Data Message (Metadata) ------->|
           |                                     |

    参考文献

    • RFC0791: Postel, J., “Internet Protocol”, STD 5, RFC 791, September 1981.
    • RFC0793: Postel, J., “Transmission Control Protocol”, STD 7, RFC 793, September 1981.
    • RFC1982: Elz, R. and R. Bush, “Serial Number Arithmetic”, RFC 1982, August 199
人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 沪ICP备2024052574号-1