受Nginx、与BFE 启发,基于测试web服务支持并发的比较结果,想开发一款基于rust 编程语言的HTTP 服务器代理器,用来测试rust 在web方向的极限
比较常见的编程语言和web服务器,rust 的hyper表现的太过卓越!go 已有了BFE。
rust 可以build 为一个可执行文件,这就很方便了。如果嵌入一个内置的rust web server 理论上就可以实现一个类 nginx 的web服务
开发期间,不会考虑内存等性能问题。
自我怀疑,使用nginx 作为比较是不是走弯路了??
- 如何实现类似
nginx worker呢? 支持更多的worker,并发拉满? - 集群模式下,如何与其他机子绑定?
panic!?- 到底是构建一个
rust语言体系的配置文件好还是拖个nginx.conf过来也可以用呢?(2020年6月24日14:38:48)- 前期的工作其实是为了实现
rustic而非nginx - 后期再增加平滑过渡的读取
nginx.config功能,并实现nginx功能
- 前期的工作其实是为了实现
要求
| feature | 描述 |
|---|---|
hot-load |
热加载 |
Cache |
缓存 |
keep-alive |
|
proxy |
|
gzip |
|
log |
|
protocol |
|
plugins |
|
load banlans |
百度BFE |
- TODO 支持调整logs目录和文件
- TODO 支持调整默认服务错误页目录和文件
- TODO 网络七层网络
- TODO config worker_processes
- TODO keepalive_timeout
- TODO rewrite server_name
- TODO 原生支持
nginx.conf配置文件,放在后期(现在缺少必要的conf文件解析器)
- http
- https
- spdy
- http/2
- websocket
- tls
- gRpc
- http/3
- 热重载配置文件
- 配置文件,config.yaml
root: "绝对路径"
load-balance: ""
http: http
http2: http2
rewrite: /world/anywhere/
proxy:
/aa/: /bb/
/cc/: /dd/
log:
path: /usr/xx.log- 测试的方法不当可能影响会结果,以下为个人的测试结果,仅供参考,测试代码用例见
/benchmark: - 基于
autocannon测试
- 期待未来补充 java、php
| rank | language | web 服务 | Req/Sec 每秒平均请求(avg) | 5s总请求数据(total in 5s) |
|---|---|---|---|---|
| 1 | go | iris | 68784 | 344k requests in 5.63 |
| 2 | Rust | hyper | 67644 | 338k requests in 5.4s |
| 3 | Rust | nickel | 44892 | 224k requests in 5.17s |
| 4 | node(js) | fastify(fast mode) | 42441 | 212k requests in 5.1s |
| 5 | node(js) | fastify(normal) | 40995 | 205k requests in 5.11s |
| 6 | node(js) | express | 22103 | 125k requests in 5.08s |
| 7 | deno(ts) | oak | 20481 | 102k requests in 5.09s |
| 8 | nginx(c) | 11098 | 55k requests in 5.05s | |
| 9 | python | aiohttp | 5015 | 25k requests in 5.07s |
rustic config=xxx.toml 文件
-
默认同目录下的 config.toml 或者yaml、json文件
-
configconfig.toml -
port80 -
test测试配置文件 -
? -
help -
key -
cert -
version -
v -
ver -
author -
start
-
restart
-
stop
-
exit
cargo run
# or : rustic- 此模式下等同于:rustic config=config.toml
- 起 80 端口
- 执行文件所在目录的查找config.toml
- 如果没有config.toml 则调用内置config
[root]
root="./html" # 执行文件的当前目录下./html,生成默认的`index.html`、`400.html`、`500.html`
[http]
port="80"rustic config=config.toml
调用用户自定义的config.toml 文件
- 默认:80
rustic port=80