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_TIMEOUT和PUT_GRACE_SECS用于控制连接持久性。
构建要求
要编译 ymawky,系统必须已安装 gcc 和 binutils。项目提供 make 命令用于生成已剥离的二进制文件,make debug 用于生成带调试符号的二进制文件。