跳转到内容

H2O 服务器:极致性能的下一代 Web 服务器

H2O 是一个由日本程序员 Kazuho Oku 开发的开源 HTTP 服务器,于 2014 年首次发布。它以极致的性能、对 HTTP/2 的优化以及现代化的安全特性而闻名,是首批原生支持 HTTP/2 的 Web 服务器之一。

核心特点

  • 极致性能:优化的内存管理和事件驱动架构
  • HTTP/2 优先:专为 HTTP/2 优化,支持服务器推送
  • HTTP/3 支持:实验性支持 QUIC 和 HTTP/3
  • TLS 1.3:早期采用最新 TLS 协议
  • 灵活配置:支持 YAML 和命令行配置
  • MrubyHandler:内置脚本支持,类似 Nginx 的 Lua

H2O 在多个基准测试中表现出色,特别是在 HTTP/2 场景下:

  • 内存效率:优化的内存池管理,降低内存占用
  • 零拷贝:减少数据复制,提升吞吐量
  • 事件驱动:基于 libev/libuv 的高效 I/O 处理
  • 连接复用:HTTP/2 连接复用显著降低延迟

H2O 是为 HTTP/2 而生的服务器,提供了多项优化:

# 启用 HTTP/2 服务器推送
hosts:
"example.com":
paths:
"/":
file.dir: /var/www/html
http2-push: ON
http2-push-preload: ON

HTTP/2 特性

  • 服务器推送:主动推送关键资源
  • 优先级控制:精细的流优先级管理
  • 头部压缩:HPACK 压缩优化
  • 多路复用:单连接处理多个请求

H2O 是首批支持 HTTP/3(基于 QUIC)的服务器之一:

listen:
port: 443
ssl:
key-file: /path/to/key.pem
certificate-file: /path/to/cert.pem
type: quic

H2O 提供了多项 TLS 优化:

  • TLS 1.3 支持:更快的握手速度
  • Session Resumption:会话复用减少握手
  • OCSP Stapling:改善证书验证性能
  • 0-RTT:零往返时间恢复
Terminal window
# Ubuntu/Debian
sudo apt install h2o
# macOS
brew install h2o
# 从源码编译
git clone https://github.com/h2o/h2o.git
cd h2o
cmake -DWITH_MRUBY=on .
make
sudo make install

H2O 使用 YAML 格式配置,简洁直观:

静态网站托管

/etc/h2o/h2o.conf
hosts:
"example.com":
listen:
port: 443
ssl:
key-file: /path/to/key.pem
certificate-file: /path/to/cert.pem
paths:
"/":
file.dir: /var/www/html
file.index: ['index.html']
"example.com:80":
listen:
port: 80
paths:
"/":
redirect:
status: 301
url: https://example.com/

反向代理

hosts:
"api.example.com":
listen:
port: 443
ssl:
key-file: /path/to/key.pem
certificate-file: /path/to/cert.pem
paths:
"/":
proxy.reverse.url: http://localhost:8080

负载均衡

hosts:
"app.example.com":
paths:
"/":
proxy.reverse.url:
- http://backend1:8080
- http://backend2:8080
- http://backend3:8080
proxy.preserve-host: ON
Terminal window
h2o -c /etc/h2o/h2o.conf # 启动服务
h2o -c /etc/h2o/h2o.conf -t # 测试配置
sudo systemctl reload h2o # 重载配置
sudo systemctl status h2o # 查看状态

H2O 内置了 Mruby 支持,可以编写 Ruby 脚本处理请求:

paths:
"/api":
mruby.handler: |
Proc.new do |env|
[200, {"content-type" => "application/json"},
['{"status": "ok", "time": "' + Time.now.to_s + '"}']]
end

常见用途

  • 动态路由规则
  • 请求/响应修改
  • 认证和授权
  • A/B 测试
  • 流量控制
access-log:
path: /var/log/h2o/access.log
format: "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\""
compress: ON # 启用 gzip 压缩
file.send-compressed: ON # 优先发送预压缩文件
header.set: "Strict-Transport-Security: max-age=31536000"
header.set: "X-Frame-Options: DENY"
header.set: "X-Content-Type-Options: nosniff"

在 HTTP/2 高并发场景下的表现(1000 并发连接):

服务器RPS (请求/秒)延迟(P99)内存占用
H2O125,00012ms45MB
Nginx98,00018ms68MB
Caddy85,00022ms82MB

:实际性能受硬件、配置、应用场景影响。

适合场景

  • HTTP/2 为主的现代应用
  • 高并发静态内容服务
  • CDN 边缘节点
  • 实时通信(WebSocket over HTTP/2)

不适合场景

  • 复杂的重写规则(Nginx 更灵活)
  • 需要丰富生态的第三方模块
  • 团队不熟悉 YAML 配置

H2O 的高性能和 HTTP/2 优化使其非常适合 CDN 场景:

hosts:
"cdn.example.com":
paths:
"/":
file.dir: /var/cache/cdn
expires: 1 day
http2-push-preload: ON
compress: ON

配合 MrubyHandler 实现轻量级 API 网关:

paths:
"/api/v1":
mruby.handler: |
Proc.new do |env|
# 认证检查
token = env["HTTP_AUTHORIZATION"]
if valid_token?(token)
env["rack.proxy.backend"] = "http://backend:8080"
else
[401, {}, ["Unauthorized"]]
end
end
proxy.reverse.url: http://backend:8080

高效的 HTTP/2 连接复用提升 WebSocket 性能:

paths:
"/ws":
proxy.reverse.url: http://websocket-server:9000
proxy.websocket: ON
proxy.timeout.io: 600000 # 10 分钟超时

轻量级 Docker 镜像:

FROM alpine:latest
RUN apk add --no-cache h2o
COPY h2o.conf /etc/h2o/h2o.conf
EXPOSE 80 443
CMD ["h2o", "-c", "/etc/h2o/h2o.conf"]

实现相同的 HTTPS 反向代理功能:

H2O(中等):

hosts:
"example.com":
listen:
port: 443
ssl:
key-file: /path/to/key.pem
certificate-file: /path/to/cert.pem
paths:
"/":
proxy.reverse.url: http://localhost:3000

Nginx(较复杂):

server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
}
}

Caddy(最简单):

example.com {
reverse_proxy localhost:3000
}

选择 H2O

  • HTTP/2 性能至关重要
  • CDN 或高并发静态内容服务
  • 需要嵌入式脚本能力(Mruby)
  • 追求极致性能和低资源占用

选择 Nginx

  • 需要成熟的生态系统和大量第三方模块
  • 复杂的 URL 重写和路由规则
  • 团队已有 Nginx 经验
  • 需要广泛的社区支持

选择 Caddy

  • 自动 HTTPS 和零配置优先
  • 快速原型开发
  • 中小型应用
  • 容器化环境

最大化性能

# 工作进程数(等于 CPU 核心数)
num-threads: 8
# 连接限制
max-connections: 100000
# 文件描述符缓存
file.custom-handler:
extension: .html
fastcgi.connect:
port: /var/run/fcgi.sock
type: unix

安全加固

hosts:
"example.com":
listen:
port: 443
ssl:
key-file: /path/to/key.pem
certificate-file: /path/to/cert.pem
# 仅支持 TLS 1.2+
min-version: TLSv1.2
# 强加密套件
cipher-suite: "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384"
# OCSP Stapling
ocsp-stapling: ON
# 会话票据
session-ticket: OFF
header.set: "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload"

监控和日志

access-log:
path: /var/log/h2o/access.log
format: "%h %l %u %t \"%r\" %s %b %{duration}x %{header-size}x %{body-size}x"
error-log: /var/log/h2o/error.log

常用调试命令

Terminal window
# 详细日志模式启动
h2o -c h2o.conf -m daemon
# 检查配置语法
h2o -c h2o.conf -t
# 查看连接统计
netstat -an | grep :443 | wc -l
# 监控性能
htop -p $(pgrep h2o)

Fastly(由 H2O 作者参与创建的 CDN 公司)在其边缘服务器中广泛使用 H2O,处理每秒数百万请求。

日本游戏公司 DeNA 使用 H2O 为其手游提供高性能 API 服务,支持千万级 DAU。

H2O 是一个专注于性能和现代协议的 Web 服务器,特别适合 HTTP/2 密集型应用和高并发场景。

核心优势

  • 极致的 HTTP/2 性能
  • 低内存占用和高吞吐量
  • 早期 HTTP/3 支持
  • 灵活的 Mruby 脚本能力
  • 优秀的 TLS 性能

适合场景:CDN 边缘节点、高并发 API 服务、性能敏感的生产环境

不适合场景:需要丰富第三方模块、复杂重写规则、团队缺乏运维经验

如果你的应用以 HTTP/2 为主,追求极致性能,且愿意投入时间学习和优化,H2O 是值得深入探索的选择。