关于 Angie#

Angie /andʒi/ 是一个高效、强大且可扩展的 Web 服务器, 从 nginx 分支而来:

  • 由原始团队的前开发人员构思, 旨在超越早期愿景, 作为 直接替代品, 无需对模块设置或配置进行重大更改。

  • 包含 nginx 1.31.2 的大部分功能 以及许多 新特性

我们为多种 系统和架构 构建二进制包, 以及 Docker 镜像。 源代码在我们的 公共仓库 中开放, 采用 类 BSD 许可证

此外,具有 附加功能 的商业版本以 Angie PRO 的名义销售。

可选择现成的 Angie 软件包、 Docker 镜像和源代码构建选项。

启动和运行时控制; 配置、模块、指令和变量。

解决 Angie 的技术问题, 可用的反馈渠道。

为想要为项目做出贡献的 开发人员提供的信息。

当前版本#

Angie 1.12.1Angie PRO 1.12.12026 年 7 月 17 日 发布。 新版本每季度发布一次; 在此期间,我们会发布紧急修复和重要更新。

另请参阅 AngieAngie PRO 的完整版本历史。

Angie 相对于 nginx 的优势#

Angie 的免费开源版本中即可获得的核心优势:

可观测性与监控

  • 通过 RESTful API 接口以 JSON 格式,公开有关 Web 服务器、 其 配置,以及代理服务器、客户端连接、 共享内存区域、TLS 证书等的 指标 的基本信息。

  • 使用 Metric 模块实时收集 HTTPstream 流量的任意 自定义指标,支持可配置的聚合方式(计数器、 直方图、移动平均等);指标按任意键分组,并通过统计 API 公开。

  • Prometheus 格式导出统计信息, 支持 可自定义模板

  • 通过 error_log 指令增强错误日志功能:使用 filter= 参数过滤日志消息,使用 format= 参数将日志消息 格式切换为 JSON,使用 rate= 参数限制错误日志记录速率,并可 通过 error_log_user_tag 指令添加自定义标签。

  • 通过 Console Light 可视化监控工具 在浏览器中监控服务器。 查看在线演示:https://console.angie.software/

TLS 与安全

  • Angie 一同发布、已在我们的软件包和镜像中启用、无需另行安装独立 模块的 ACME 客户端:自动获取和续订 TLS 证书,支持 HTTP、DNS 和 TLS-ALPN 域名验证。DNS 验证使通配符证书 成为可能,ACME 在 stream 模块中同样可用, 而 acme_hook 指令允许由自定义处理程序完成上述任一验证方式。

  • stream 模块中支持 TLS 1.3 早期数据(0-RTT)。

  • 使用 TongSuo TLS 库时的 NTLS 服务器客户端 支持, 在 构建时 启用。

代理与负载均衡

  • 基于 Docker 容器 (或类似工具如 Podman)的事件和标签 动态更新上游组,无需 服务器重载。

  • 真正按 响应时间 进行的负载均衡:请求被发送到实测 响应时间最短的服务器,该时间以指数加权移动平均进行跟踪,其 平滑因子 可配置,从惰性平均到对突发流量 的快速反应。

  • 使用 server 指令的 slow_start 选项, 在故障后平滑地重新启用上游服务器,此功能同时适用于 HTTP 和 stream 上游。

  • stream 模块协议(TCP/UDP)的 会话绑定: 同一会话内的所有连接都定向到同一代理服务器。

  • stream 模块中使用 server 指令的 drain 选项优雅地下线代理服务器:该服务器将停止接受新连接, 但仍继续为已绑定到它的会话提供服务。

协议与流量

  • 面向客户端连接和 代理服务器 连接的生产级 HTTP/3 支持,两端可独立选择不同的协议版本 (HTTP/1.x、HTTP/2、HTTP/3)。相比之下,nginx 的 HTTP/3 仅限服务器端, 仍处于实验阶段,并在重载后 出现性能退化现象。

  • 内置的 DoH 服务器(DNS over HTTPS,RFC 8484): 可通过 HTTP/HTTPS 接受 DNS 查询,并将其代理到 UDP 或 TCP 上的 DNS 服务器组。

  • stream 模块中向代理服务器传递 PROXY Protocol v2,并可通过 proxy_protocol_tlv 指令设置任意 TLV 值。

  • 使用 image_filter 指令的 convert 参数在不同格式之间 转换图像,包括转换为 HEIC 和 AVIF 格式。

  • 通过 stream 下的 mqtt_preread 指令 扩展 MQTT 协议的授权和均衡功能。

  • 通过 stream 下的 rdp_preread 指令 使用 RDP 协议的会话 cookie 为均衡决策提供信息。

  • 按比特率成比例地 限制 MP4 文件传输速率, 从而减少带宽负载。

  • 邮件代理支持 XOAUTH2 和 OAUTHBEARER 认证方法

简化配置与运维

  • 自动从 /etc/resolv.conf 配置 DNS 解析器: 该文件在发生更改时会被重新读取,无需手动指定 DNS 服务器地址。

  • 单条 location 指令中可一次定义的多个匹配表达式: 具有共享设置的块由此可以 组合

  • rewrite 模块中的 goto 指令,可在不修改 URI 的情况下 内部重定向到命名 location,可替代基于 try_fileserror_page 的变通方法。

  • proxy_cache_path 中共享内存区域向磁盘的刷新:缓存索引内容 因此得以在重启和更新之间保留,从而消除缓存加载延迟, 并使服务器更快上线。

  • time_format 指令,用于定义具有自定义时间格式的 变量,支持类似 strftime() 的说明符,以及用于表示毫秒的 %L

  • 为许多流行的第三方模块预构建的 二进制包

Angie PRO 附加特性#

商业 Angie PRO开源版本 功能的基础上增加了以下内容:

动态配置与管理

  • 通过 RESTful 动态配置 API 管理代理服务器: 无需重载工作进程即可将服务器加入或移出均衡,并实时修改其权重和其他参数。 可视化监控控制台 Console Light 也可用于在浏览器中管理服务器。

  • 使用 server_tokens 指令,将错误页面和 Server 头字段中的服务器签名覆盖为任意值。

高级均衡与容错

  • 基于反馈 的负载均衡, 根据变量值选择对等节点; 假设该值来自对等节点本身, 报告其 CPU 负载或其他指标。

  • 请求等待队列,使用 upstream 块中的 queue 指令 配置:如果第一次尝试未能为请求选出服务器,例如在负载突增时, 请求会进入队列,而不是立即被拒绝。

  • 通过发送定期 探测请求 主动检查代理服务器的 状态:故障服务器会在客户端请求到达之前被移出均衡,而不是之后。

  • stream 模块 upstream 块中的 no_port 指令,解除端口与组内服务器的绑定:端口在 proxy_pass 指令中指定, 因此同一个组可以用于代理到不同端口,而无需重复服务器列表。

  • upstream 块中的 backup_switch 指令: 备份服务器可以在主服务器再次可访问时继续处理请求。

会话、连接与缓存

  • 将会话存储在外部会话存储中的 sticky learn 模式, 从而允许在集群中加入多个均衡器。

  • 条件性地 将客户端连接绑定 到代理服务器连接,这也支持代理 NTLM。

  • proxy_bind 指令,在每次选择代理服务器后重新求值变量: 出站地址可以取决于所选的服务器,例如通过 $upstream_current_addr 变量。

  • 代理模块中的缓存分片,支持根据响应的属性 在 不同磁盘 之间分配缓存。