GENERAL-PURPOSE GATEWAY · RUST

一个进程,
接管全部入口。

ONRouter 是用 Rust 从零实现的通用网关。TLS、反向代理、响应缓存、Lua 与 WASM 脚本、TCP/UDP 转发——不拼装中间件,不依赖外部运行时,一个二进制跑起来。

  • HTTP/1.1 · HTTP/2 · HTTP/3
  • Lua 5.4 · WASM
  • MIT License
请求在 ONRouter 内的路径 CLIENT h1 · h2 · h3 ONROUTER ONE PROCESS TLS ROUTE CACHE SCRIPT L7 + L4 HTTP upstream pool TCP sni preread UDP sessions
REQUEST PATH / SINGLE PROCESS
LINUX x86_64 · aarch64 · armv7 · riscv64 MACOS Intel · Apple Silicon WINDOWS x86_64 · arm64 SHA256SUMS

01 / RUNTIME

请求只走一跳。

从 TLS 终止到上游连接,全部在同一个进程里完成。没有反向代理链,没有跨进程队列,也没有需要单独部署的脚本运行时。

协议在入口终止

HTTP/1.1、HTTP/2(TLS 与 h2c)、HTTP/3 over QUIC、WebSocket Upgrade,同一个端口按 ALPN 分流;L4 另有 SNI 预读、TCP 隧道和 UDP 会话。

代理与负载均衡

加权轮询、least_conn、ip_hash;被动健康检查、懒重连、熔断、keepalive 连接池,以及 TLS / mTLS 上游。

缓存有冷热两层

命名缓存区、可选的磁盘冷层与 TinyLFU 学习准入、ETag / Last-Modified 复验证、请求合并、过期兜底;每个响应都能看到命中状态。

02 / SCRIPTING

脚本不是外挂。

Lua 5.4 在每个请求阶段可用:access、rewrite、content、header_filter、body_filter。共享字典、定时器、cosocket、子请求和 resty.* 模块都是内建的;需要强隔离的第三方逻辑放进 WASM,燃料和内存都有上限。

  • ngx.* 请求、响应、变量与日志
  • shared dict、semaphore、light thread
  • WASM access / header / body 过滤器
# 在 access 阶段做鉴权,失败直接结束请求
access_by_lua_block {
    local auth = ngx.var.http_authorization
    if auth ~= "Bearer demo" then
        return ngx.exit(401)
    end
}

# content 阶段读写共享字典
location = /count {
    content_by_lua_block {
        local cache = ngx.shared.hits
        local n = cache:incr("n", 1, 0)
        ngx.say("hits=", n)
    }
}
LUA 5.4 / NGX API

03 / CONFIG

声明式,不改代码。

配置沿用 nginx 风格的语法,现有习惯可以直接迁移。上游、缓存区、路由、限流和脚本都在同一个文件里;改完先跑 -t,再热重载。

运行中的进程支持 SIGHUP 换路由、Lua 和证书,新连接不受影响;只有新增监听端口需要重启。

proxy_cache_path /var/cache/onrouter
    keys_zone=api:32m;

upstream app_pool {
    least_conn;
    server 10.0.0.11:8080;
    server 10.0.0.12:8080;
}

server {
    listen 443 ssl;
    http2 on;
    server_name example.com;

    location /api/ {
        proxy_pass http://app_pool/;
        proxy_cache api;
        proxy_set_header Host $host;
    }

    location / {
        root /srv/www;
        index index.html;
    }
}
ONROUTER.CONF / MINIMAL

04 / LEARNING

冷热不用猜,
它自己学。

一层可选的在线学习:TinyLFU 草图决定谁值得留在缓存里,每个 key 的已完成突发决定它能排多深,客户端信誉只从限流器已有的裁决里累积。默认关闭;打开后三张表共用一份可配置的字节账本。

  • proxy_cache_learning:一次性 URL 的扫描,挤不掉热点对象
  • limit_req_learning:深度在 [depth_min, depth] 里按突发形状伸缩
  • vip_learning:信誉只换排队与驻留,不换速率,也不跳过准入

没有外部模型、后台训练线程或跨进程状态;老化跟着写入与沉默走,热重载不会重启模型,配置没变时学到的状态原地保留。默认预算 1 MiB,实际占用在指标里能对上字节数。

学习层只改准入、排队与驻留;TTL、复验证和速率上限仍按配置执行。

learning on;
learning_memory_budget 1m;

# 热度赢过最老的 8 个条目,才允许占位
proxy_cache_learning api sketch=64k;

# 每个 key 的突发形状,决定它能排多深
limit_req_queue api depth=32 depth_min=4;
limit_req_learning api table=16k;

# 信誉只来自限流器已经看到的裁决
vip_learning table=16k min=10 decay=30s;
ONROUTER.CONF / LEARNING

05 / OPERATIONS

上线之后,少一件事。

没有要跟着升级的运行时,没有要拼接的模块。部署是一个二进制,观测、重载和停机都在进程内完成。

配置先验证

-t 检查监听、证书、缓存区和指令引用,把被忽略的写法逐条列出来;退出码不代替告警。

热重载

SIGHUP 替换路由、脚本与证书;reload 2s; 还能盯住配置文件变化,自动完成同一件事。

指标是内建的

Prometheus 指标覆盖进程、上游、缓存、限流与 TLS;访问日志带 upstream 地址、状态和分段耗时。

06 / DOCS

文档,
跟着代码走。

使用教程、运维手册、Lua API、能力矩阵、可运行示例和安全模型都和源码放在同一个仓库,按版本一起更新。下面每一条都指向仓库里的原文,不另存一份会过期的副本。

浏览完整文档目录 →

ONRouter logo

07 / DOWNLOAD

下载 ONRouter

最新构建发布在 GitHub Releases:Linux、macOS、Windows 共 8 个平台,每个版本附带 SHA256SUMS.txt。

前往 GitHub Releases

版本历史见 Releases,从 使用教程 开始配置。