Show HN: Building a web server in assembly to give my life (a lack of) meaning

TL;DR · AI 摘要
文章介绍了一个完全用ARM64汇编语言编写的MacOS Web服务器项目,但缺乏深度和实用价值。
核心要点
- 项目完全用ARM64汇编编写
- 缺乏深入的技术细节
- 对工程实践帮助有限
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- MacOS Web Server in ARM64 Assembly
GitHub - imtomt/ymawky: 使用ARM64汇编编写的MacOS Web服务器 · GitHub
导航菜单
切换导航
[](https://github.com/)
外观设置
* 平台
* 人工智能代码生成
* 开发者工作流
* 应用程序安全
* 探索
* 解决方案
* 按公司规模
* 按使用场景
* 按行业
* 资源
* 按主题探索
* 按类型探索
* 支持与服务
* 开源
* 社区
* 项目
* 仓库
* 企业
* 企业解决方案
* 可用插件
搜索或跳转...
搜索代码、仓库、用户、问题、拉取请求...
搜索
清除
提供反馈
我们阅读每一条反馈,并非常重视您的意见。
- [x] 包括我的电子邮件地址以便联系我
取消 提交反馈
保存的搜索
使用保存的搜索更快地筛选结果
名称
查询
查看所有可用的限定符,请参阅我们的文档。
取消 创建已保存搜索
外观设置
重置焦点
您已在另一个标签页或窗口中登录。重新加载以刷新您的会话。您已在另一个标签页或窗口中注销。重新加载以刷新您的会话。您已在另一个标签页或窗口中切换了帐户。重新加载以刷新您的会话。忽略警报
{{ message }}
imtomt/[ymawky](https://github.com/imtomt/ymawky)公开
其他导航选项
[](https://github.com/imtomt/ymawky)
imtomt/ymawky
主分支
[](https://github.com/imtomt/ymawky/branches)[](https://github.com/imtomt/ymawky/tags)
转到文件
代码
打开更多操作菜单
文件夹和文件
| 名称 | 名称 | 最近提交消息 | 最近提交日期 | | --- | --- | --- | --- | | ## 最新提交 ## 历史记录 95 次提交 [](https://github.com/imtomt/ymawky/commits/main/)95 次提交 | | [docs](https://github.com/imtomt/ymawky/tree/main/docs "docs") | [docs](https://github.com/imtomt/ymawky/tree/main/docs "docs") | | | | [err](https://github.com/imtomt/ymawky/tree/main/err "err") | [err](https://github.com/imtomt/ymawky/tree/main/err "err") | | | | [src](https://github.com/imtomt/ymawky/tree/main/src "src") | [src](https://github.com/imtomt/ymawky/tree/main/src "src") | | | | [www](https://github.com/imtomt/ymawky/tree/main/www "www") | [www](https://github.com/imtomt/ymawky/tree/main/www "www") | | | | [.gitignore](https://github.com/imtomt/ymawky/blob/main/.gitignore ".gitignore") | [.gitignore](https://github.com/imtomt/ymawky/blob/main/.gitignore ".gitignore") | | | | [COPYING](https://github.com/imtomt/ymawky/blob/main/COPYING "COPYING") | [COPYING](https://github.com/imtomt/ymawky/blob/main/COPYING "COPYING") | | | | [Makefile](https://github.com/imtomt/ymawky/blob/main/Makefile "Makefile") | [Makefile](https://github.com/imtomt/ymawky/blob/main/Makefile "Makefile") | | | | [README.md](https://github.com/imtomt/ymawky/blob/main/README.md "README.md") | [README.md](https://github.com/imtomt/ymawky/blob/main/README.md "README.md") | | | | [build_err_pages.sh](https://github.com/imtomt/ymawky/blob/main/build_err_pages.sh "build_err_pages.sh") | [build_err_pages.sh](https://github.com/imtomt/ymawky/blob/main/build_err_pages.sh "build_err_pages.sh") | | | | 查看所有文件 |
仓库文件导航

_ymawky_ -- 在ARM汇编中的Web服务器
[](https://github.com/imtomt/ymawky#ymawky----web-server-in-arm-assembly)
这是 _ymawky_(yuh maw kee),一个完全用ARM64汇编写成的Web服务器。ymawky是一个仅使用系统调用、没有libc、每个连接都fork一次的手写Web服务器。虽然它是在MacOS上开发的,但我尽量使其尽可能通用——然而,您可能仍然需要对Linux/其他Unix系统进行一些重大调整才能运行此程序。有关详细信息,请参阅实现笔记。
构建
[](https://github.com/imtomt/ymawky#building)
需要Xcode命令行工具。使用 xcode-select --install 安装。ymawky只能在苹果硅(arm64)上运行。
运行 make 进行构建。
确保 ymawky 可执行文件旁边有一个 www/ 目录。那是 _ymawky_ 搜索文件的文档根目录。GET 带有空文件名(GET /)将搜索 www/index.html,因此您可能希望确保有一个 index.html。
当客户端请求导致错误时,_ymawky_ 将尝试提供静态错误页面,例如404。它会在 err/(code).html 中查找这些页面,因此请确保 err/ 与 ymawky 和 www/ 一起存在。有关修改默认文件和文档根目录的详细信息,请参阅配置。
运行
[](https://github.com/imtomt/ymawky#running)
./ymawky在127.0.0.1:8080上启动 Web 服务器。./ymawky [port]在127.0.0.1:[port]上启动 Web 服务器。./ymawky [literally-any-character-other-than-0-9]以调试模式在127.0.0.1:8080上启动 Web 服务器。调试模式禁用分叉,并使 ymawky 仅处理一个请求。(我需要这样做是因为lldb不允许我调试子进程,哎呀。)
不幸的是,虽然支持自定义端口,但不支持自定义地址。目前,ymawky 只能在 127.0.0.1 上运行。这只是因为我还没有实现它——但如果有人认为这是一项安全功能,那么这可能是有意为之的。
要查看 ymawky 的运行情况,请使用 ./ymawky [port] 启动 ymawky。然后打开您选择的网络浏览器(或使用 curl),访问 127.0.0.1:8080/ 或 127.0.0.1:8080/pretty/index.html。沉浸在汇编语言的温暖中。
它能做什么?
[](https://github.com/imtomt/ymawky#what-can-it-do)
ymawky 是一个静态文件 Web 服务器。它不支持服务器端代码动态生成内容,也不支持更高级的 URL 解析,例如 /search?query=term。但这并不意味着它无法正常工作。
- 支持的 HTTP 方法:
- GET
- PUT
- DELETE
- OPTIONS
- HEAD
- 基本防止慢速连接型拒绝服务攻击
- 解码
%十六进制编码,例如,%20在文件名中解码为空格,%61解码为a - 智能路径遍历检测和预防。阻止
..遍历路径,但在文件名中允许多个点: GET /../../../etc/passwd->403 ForbiddenGET /ohwell...txt->200 OKGET /../src/ymawky.S->403 ForbiddenGET /hehe..txt->200 OK
- 自动在请求的文件前添加
www/。GET /index.html将检索www/index.html - 空的
GET /请求默认为GET www/index.html PUT请求支持高达 1GiB 的上传,但可以通过配置支持更大的文件- 由于写入临时文件然后重命名,
PUT请求是原子性的,允许并发的PUT请求而不留下部分写入的文件 - 在
PUT请求中解析和验证Content-Length:头 - MIME 类型检测,在响应头中提供相应的 MIME 类型
Content-Type - 接受
Range: bytes=范围的GET请求,支持完整的范围bytes=X-N,后缀范围bytes=-N和开放范围bytes=X-。视频拖动功能得到良好支持 - 基本的 HTTP 版本解析。请求需要指定
HTTP/1.1或HTTP/1.0,如果请求HTTP/1.1,则需要在头部包含Host:字段。目前,ymawky 对Host没有做任何处理,但根据 RFC 9112 第 3.2 节,必须发送该头部 - 为错误代码(如 404 或 500)提供自定义 HTML 页面。请参阅
err/目录中的示例 - 如果请求的资源是一个目录,则列出目录中的所有文件和子目录。请注意,这排除了
www/(或您的文档根目录):GET /总是搜索index.html,如果没有给定文件。
“安全性”
[](https://github.com/imtomt/ymawky#safety)
这是一个完全由手写 ARM64 汇编写成的 Web 服务器项目。它可能有很多我没有意识到的漏洞。然而,我尽我所能使其更安全。以下是 ymawky 采取的一些安全措施。
- 拒绝长度大于等于 PATH_MAX(4096 字节)的路径
- 拒绝包含路径遍历的任何路径 ——
/../.. - 拒绝任何请求,这些请求不包含长度小于 16 字节的路径
- 限制在
www/目录内。任何请求的路径都会在前面加上www/ - 拒绝包含符号链接的任何路径,使用
O_NOFOLLOW_ANY PUT写入临时文件www/.ymawky_tmp_<pid>。成功接收整个文件后,这个临时文件会被重命名为请求的文件名。这可以防止部分或损坏的PUT请求覆盖现有文件- 拒绝任何路径以
www/.ymawky_tmp_开头的请求。这可以防止有人从GET临时文件,也可以防止有人发送PUT /.ymawky_tmp_4533或类似请求 - 必须在 10 秒内接收数据。如果超过时间,连接将关闭。如果在总共 10 秒内没有接收到整个头部,连接将被关闭。这是为了防止慢速连接型攻击
HTTP 状态码
[](https://github.com/imtomt/ymawky#http-status-codes)
ymawky 当前支持并可以回复以下状态码:
200 OK201 Created204 No Content206 Partial Content400 Bad Request403 Forbidden404 Not Found408 Request Timeout409 Conflict411 Length Required413 Content Too Large414 URI Too Long416 Range Not Satisfiable418 I'm a teapot431 Request Header Fields Too Large500 Internal Server Error501 Not Implemented503 Service Unavailable505 HTTP Version Not Supported507 Insufficient Storage
自定义 HTML 页面将与错误代码(400+)一起提供。这些 HTML 文件位于 err/(code).html。您可以使用 build_err_pages.sh 创建每个代码的页面,并根据需要修改文本。编辑 build_err_pages.sh 的源代码以按页修改文本,并修改 err/template.html 以修改基础模板。在 err/template.html 中:
{{CODE}}- HTTP 代码:例如,404{{TITLE}}- 标题文本:例如,“未找到”{{MSG}}- 自定义消息:例如,“老鼠吃掉了这个页面”
MIME 类型
[](https://github.com/imtomt/ymawky#mime-types)
通过分析文件扩展名来检测 MIME 类型。以下 MIME 类型被识别。
与 Web 相关的文件:
.html->text/html; charset=utf-8.htm->text/html; charset=utf-8.css->text/css; charset=utf-8.csv->text/csv; charset=utf-8.xml->text/xml; charset=utf-8.js->text/javascript; charset=utf-8.json->application/json.wasm->application/wasm.mjs->text/javascript; charset=utf-8.map->application/json
图片文件:
.png->image/png.jpg->image/jpeg.jpeg->image/jpeg.gif->image/gif.svg->image/svg+xml.ico->image/x-icon.webp->image/webp.avif->image/avif.bmp->image/bmp.tiff->image/tiff.apng->image/apng
字体文件:
.woff->font/woff.woff2->font/woff2.ttf->font/ttf.otf->font/otf
文档文件:
.txt->text/plain; charset=utf-8.pdf->application/pdf.doc->application/msword.docx->application/vnd.openxmlformats-officedocument.wordprocessingml.document.epub->application/epub+zip.rtf->application/rtf
视频文件:
.mp4->video/mp4.webm->video/webm.mkv->video/x-matroska.avi->video/x-msvideo.mov->video/quicktime
音频文件:
.mp3->audio/mpeg.ogg->audio/ogg.wav->audio/wav.flac->audio/flac.aac->audio/aac.m4a->audio/mp4.opus->audio/opus
归档文件:
.zip->application/zip.gz->application/gzip.tar->application/x-tar.7z->application/x-7z-compressed.bz2->application/x-bzip2.rar->application/vnd.rar
配置
[](https://github.com/imtomt/ymawky#configuration)
您可以使用 config.S 文件配置 ymawky。选项在这里有文档说明。
#define DEFAULT_DIR "www/"-- 这是文档根目录。将其更改为相对于 ymawky 的 HTML 文件的位置,或使用绝对路径:#define DEFAULT_DIR "www/"#define DEFAULT_DIR "/Library/WebServer/Documents"#define DEFAULT_DIR "./"
#default ERR_DIR "err/"-- 这是在其中 ymawky 将搜索自定义错误 HTML 页面的目录,例如err/404.html或err/500.html#define DEFAULT_FILE "index.html"-- 当 ymawky 收到空的GET / HTTP/1.1请求时,这是它将提供的默认文件.equ RECV_TIMEOUT, 10-- ymawky 在关闭连接前等待接收数据的秒数。如果两次read()之间的间隔超过RECV_TIMEOUT秒,ymawky 将以408 Request Timed Out关闭连接.equ HEADER_REQ_TIMEOUT_SECS, 10-- ymawky 在超时之前等待接收完整头部的最大秒数。如果接收头部的时间超过此时间,ymawky 将以408 Request Timed Out关闭连接.equ PUT_GRACE_SECS, 5-- ymawky 动态计算基于Content-Length的最大上传时间。最大时间定义为PUT_GRACE_SECS + Content-Length / PUT_MIN_BPS。如果计算出文件应该在不到一秒内上传,则这是允许的最短宽限期.equ PUT_MIN_BPS, 1024 * 16-- 每秒最小字节数。如果您想更严格,请设置得更高;如果您想更宽松,请设置得更低。由于使用了.equ指令,支持算术运算,1024 * 16在汇编时计算为16384或 16KB.equ MAX_BODY_SIZE, 1024 * 1024 * 1024-- PUT 允许的最大Content-Length字节数。默认为 1GB(1024 * 1024 * 1024 = 1073741824 字节)。如果Content-Length大于此值,文件将被拒绝并返回413 Content Too Large.equ MAX_PROCS, 256-- ymawky 允许同时运行的最大进程数。由于 ymawky 是一个每连接一个进程的服务器,您需要确保 ymawky 不会耗尽您的 PID 空间。ymawky 将以503 Service Unavailable响应
哎呀!
加载时出现了一个错误。请重新加载此页面。
动态
星标
关注者
分叉
[发布](https://github.com/imtomt/ymawky/releases)
未发布任何版本
[包 0](https://github.com/users/imtomt/packages?repo_name=ymawky)
哎呀!
加载时出现了一个错误。请重新加载此页面。
[贡献者](https://github.com/imtomt/ymawky/graphs/contributors)
* * *
哎呀!
加载时出现了一个错误。请重新加载此页面。
语言
- 汇编 87.0%
- HTML 10.7%
- 其他 2.3%
页脚
[](https://github.com/) © 2026 GitHub, Inc.
页脚导航
您目前无法执行此操作。