Hacker News Best

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

5.0内容质量
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
#Web服务器#ARM64#汇编
打开原文

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") | | | | 查看所有文件 |

仓库文件导航

图片 1
图片 1

_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/ymawkywww/ 一起存在。有关修改默认文件和文档根目录的详细信息,请参阅配置

运行

[](https://github.com/imtomt/ymawky#running)

  • ./ymawky127.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 Forbidden
  • GET /ohwell...txt -> 200 OK
  • GET /../src/ymawky.S -> 403 Forbidden
  • GET /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.1HTTP/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 OK
  • 201 Created
  • 204 No Content
  • 206 Partial Content
  • 400 Bad Request
  • 403 Forbidden
  • 404 Not Found
  • 408 Request Timeout
  • 409 Conflict
  • 411 Length Required
  • 413 Content Too Large
  • 414 URI Too Long
  • 416 Range Not Satisfiable
  • 418 I'm a teapot
  • 431 Request Header Fields Too Large
  • 500 Internal Server Error
  • 501 Not Implemented
  • 503 Service Unavailable
  • 505 HTTP Version Not Supported
  • 507 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.htmlerr/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 响应

GPL-3.0 许可证

哎呀!

加载时出现了一个错误。请重新加载此页面

动态

活动

星标

**160** 颗星

关注者

**0** 人关注

分叉

**2** 个分叉

报告仓库

[发布](https://github.com/imtomt/ymawky/releases)

未发布任何版本

[包 0](https://github.com/users/imtomt/packages?repo_name=ymawky)

哎呀!

加载时出现了一个错误。请重新加载此页面

[贡献者](https://github.com/imtomt/ymawky/graphs/contributors)

* * *

哎呀!

加载时出现了一个错误。请重新加载此页面

语言

页脚

[](https://github.com/) © 2026 GitHub, Inc.

页脚导航

您目前无法执行此操作。