ymawky:Linux 上的纯 ARM64 汇编 Web 服务器

ymawky:Linux 上的纯 ARM64 汇编 Web 服务器

ymawky 是一次高性能的极简系统编程实验

ymawky 是一个完全使用 ARM64 汇编编写的 Web 服务器,旨在通过仅依赖系统调用而不使用 C 标准库(无 libc)来运行。最初为 macOS 开发,现已移植到 Linux,采用每个连接 fork 的模型,能够处理静态内容以及通过通用网关接口(CGI)脚本提供的动态内容。

核心技术架构

仅使用系统调用的执行方式

nymawky 完全绕过高级库,直接通过 ARM64 汇编与 Linux 内核交互。这种方式消除了 libc 的开销,并提供了一个观察 Web 服务器如何与网络套接字和文件系统交互的原始视角。

连接处理

服务器采用每个连接 fork 的模型。为防止 PID 耗尽,服务器实现了 MAX_PROCS 限制(默认 256),当达到上限时返回 503 Service Unavailable 响应。

请求处理与 HTTP 支持

nymawky 实现了 HTTP/1.0 和 HTTP/1.1 的重要子集,包括:

  • 支持的方法:GET、PUT、DELETE、OPTIONS、HEAD,以及通过 CGI 的 POST。
  • 范围请求:完整支持 Range: bytes=(包括后缀和开放式范围),可实现视频拖动等功能。
  • 原子上传PUT 请求先写入临时文件 (www/.ymawky_tmp_<pid>) ,仅在成功完成后才重命名,确保并发上传不会留下损坏的文件。
  • MIME 检测:根据覆盖网页资源、图像、字体、文档、视频、音频和归档等文件扩展名的完整列表,自动分配 Content-Type

通过 CGI 实现动态内容

CGI 实现

nymawky 支持位于可配置目录(默认 cgi-bin/)中的 CGI 脚本。服务器通过设置 QUERY_STRING 环境变量来执行这些脚本,并将脚本的输出以及 Status: 头部返回给客户端。

CGI 限制与安全性

CGI 支持目前仍属实验性。服务器不支持 PATH_INFO,所有路径均视为字面文件路径。由于 CGI 脚本是独立的可执行文件,它们需要自行处理输入解析和错误处理。作者指出,CGI 脚本缺少对其他请求施加的严格超时设置,可能导致进程挂起。

安全与安全措施

尽管是手写汇编项目,ymawky 仍内置了多项防护,以减轻常见的 Web 漏洞风险:

  • 路径遍历防护:服务器阻止尝试跳出文档根目录的 .. 序列,同时仍允许文件名中出现多个点(例如 ohwell...txt 是被允许的)。
  • DoS 缓解:为防止 Slowloris 类攻击,服务器在读取之间强制 RECV_TIMEOUT(10 秒)以及对整个头部接收设置 HEADER_REQ_TIMEOUT_SECS(10 秒)。
  • 文件系统约束:服务器拒绝超过 PATH_MAX(4096 字节)的路径,拒绝前 16 字节内没有路径的请求,并使用 O_NOFOLLOW_ANY 拒绝包含符号链接的路径。
  • 上传约束PUT 请求受 MAX_BODY_SIZE(默认 1 GiB)限制,并设有最小字节/秒阈值 (PUT_MIN_BPS) 以防止过慢的上传占用资源。

配置与部署

配置通过汇编时的 config.S 完成。可配置的关键参数包括:

  • DOCROOT:静态文件目录(默认 www/)。
  • CGI_DIR:可执行 CGI 脚本目录(默认 cgi-bin/)。
  • ERR_DIR:自定义 HTML 错误页面目录(默认 err/)。
  • 超时设置:可调的 RECV_TIMEOUTPUT_GRACE_SECS 用于控制连接持久性。

构建要求

要编译 ymawky,系统必须已安装 gccbinutils。项目提供 make 命令用于生成已剥离的二进制文件,make debug 用于生成带调试符号的二进制文件。

Sources