RR 在大型应用中的配置策略、核心用法和性能调优技巧,帮助你构建一个既稳定又高效的系统。
一、RoadRunner 核心架构与优势
1. 架构对比
| 传统 FPM 模式 | RoadRunner 模式 |
|---|---|
| Nginx → PHP-FPM → 临时 PHP 进程 | Nginx → RoadRunner → 常驻 PHP Worker 进程池 |
| 每次请求创建新进程 | 预创建 Worker 进程复用 |
| 内存占用高,启动慢 | 内存复用,启动快 10 倍 |
| 并发受限于进程数 | 单进程处理数千并发连接 |
2. 性能优势
- 吞吐量提升 10-15 倍:官方基准测试显示,相同硬件下 RR 处理请求能力远超 FPM
- 内存占用减少 60%:常驻进程避免重复加载框架
- 支持 HTTP/2、WebSocket:内置企业级功能插件
二、生产环境配置详解
1. 基础配置文件(.rr.yaml)
version: "3"
rpc:
listen: tcp://0.0.0.0:6001 # RPC 服务地址,用于服务发现
http:
address: "0.0.0.0:8080" # HTTP 监听端口
middleware: ["gzip", "static", "headers"]
server:
command: "php worker.php" # PHP Worker 启动命令
relay: "pipes" # 通信方式:pipes(性能最优)
num_workers: 4 # Worker 数量(建议 CPU 核心数)
env:
- APP_ENV: "production"
logs:
level: "error" # 生产环境日志级别
2. 关键参数优化
| 参数 | 说明 | 建议值 |
|---|---|---|
num_workers | Worker 进程数 | CPU 核心数(CPU 密集型)或更高(IO 密集型) |
max_jobs | 每个 Worker 处理请求数 | 1000-5000(防内存泄漏) |
idle_ttl | 空闲超时时间 | 60s(高并发可调至 10s) |
relay_timeout | 通信超时 | 60s(网络不稳定时增大) |
三、核心功能配置实践
1. 服务发现与 RPC 通信
rpc:
listen: tcp://0.0.0.0:6001
registry: "tcp://主节点IP:6001" # 指向服务注册中心
PHP 调用示例:
use Spiral\Goridge\RPC\RPC;
$rpc = RPC::create('tcp://主节点IP:6001');
$nodes = $rpc->call('informer.Workers'); // 获取节点列表
2. 队列系统(异步任务)
queues:
emails:
driver: rabbitmq
config:
addr: amqp://guest:guest@localhost:5672/
queue: emails_queue
notifications:
driver: kafka
config:
brokers: localhost:9092
topic: notifications
任务处理流程:
- 任务分发 → 2. 队列存储 → 3. Worker 消费
3. 静态文件服务
http:
middleware: ["static"]
static:
dir: "public" # 静态文件目录
allow: [".js", ".css", ".png"] # 允许的文件类型
calculate_etag: true # 启用 ETag 缓存
四、性能调优策略
1. Worker 数量优化
- CPU 密集型任务:
num_workers = CPU 核心数 - IO 密集型任务:根据内存扩容(每个 Worker 约 26MB RSS)
2. 连接池与超时
server:
pool:
num_workers: 8
max_jobs: 1000
allocate_timeout: 60s
3. 压缩与缓存
http:
middleware: ["gzip"]
gzip:
level: 6 # 压缩级别(1-9)
min_length: 1024 # 最小压缩大小
五、高级配置技巧
1. 多环境配置管理
# 合并配置文件
rr serve -c base.yaml -c production.yaml
base.yaml(通用配置):
version: "3"
server:
command: "php worker.php"
production.yaml(生产覆盖):
http:
address: "0.0.0.0:443"
ssl:
cert: "/etc/ssl/certs/server.crt"
2. 健康检查与监控
server:
healthcheck:
interval: 10s
timeout: 5s
path: /health
metrics:
address: "0.0.0.0:2112" # Prometheus 监控端点
六、常见问题排查
| 问题现象 | 解决方案 |
|---|---|
| RPC 连接超时 | 检查防火墙规则,验证 IP 和端口 |
| 服务注册失败 | 使用 JSON Schema 验证配置文件 |
| 节点通信不稳定 | 增加 relay_timeout 至 60s |
七、Docker 部署示例
# Dockerfile
FROM ghcr.io/roadrunner-server/roadrunner:2023 AS roadrunner
FROM php:8.2-cli
COPY --from=roadrunner /usr/bin/rr /usr/local/bin/rr
COPY . /app
WORKDIR /app
CMD ["rr", "serve"]
# docker-compose.yml
version: '3'
services:
roadrunner:
build: .
ports:
- "8080:8080"
environment:
- SERVICE_REGISTRY=tcp://registry:6001
总结:大型应用最佳实践
- 配置管理
- 使用 YAML 模块化配置
- 环境变量注入敏感信息
- 性能优化
- Worker 数量匹配业务类型(CPU/IO 密集型)
- 启用 Gzip 压缩和静态文件缓存
- 高可用
- 集成 etcd 实现动态服务发现
- 配置健康检查自动剔除异常节点
- 监控体系
- Prometheus + Grafana 可视化监控
- 日志分级输出(生产环境 error 级别)