07
部署与生产:Docker、Nginx、安全
Docker, Nginx, Security, CI/CD
Rust 最大的部署优势就是单文件二进制。配合 musl 静态链接,你的服务可以跑在 scratch 镜像上——整个镜像就 5MB,比一个 Node 项目的 node_modules 还小。这一章把上线流水线讲完。
多阶段 Dockerfile
# ---- 构建阶段 ----
FROM rust:1.82 AS builder
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
COPY src ./src
RUN cargo build --release
# ---- 运行阶段:scratch 镜像,几乎为零 ----
FROM debian:bookworm-slim
COPY --from=builder /app/target/release/rust-todo-api /usr/local/bin/
EXPOSE 3000
CMD ["rust-todo-api"]
想更小,用 x86_64-unknown-linux-musl target 静态链接,运行镜像换成 scratch——整个镜像就一个二进制文件。
反向代理 Nginx
Rust 服务前面一定要放 Nginx:它负责终止 HTTPS、服务静态文件、做负载均衡、限流。Rust 专心跑业务逻辑。这和 Java 项目 Nginx + Tomcat 是一个套路。
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
安全红线
密码哈希 → argon2 / bcrypt
永远不要存明文密码,用
argon2 crate 做哈希校验。彩虹表和撞库是 2026 年的常态,明文 = 泄密事故。
SQL 注入 → 参数化查询
SQLx 的
.bind() 天然参数化,别自己拼字符串。Rust 类型系统 + 参数化 = 注入风险趋近于零。
JWT 认证 → jsonwebtoken
登录发 token,Axum 中间件校验 token,把 user_id 注入请求上下文。
无状态认证,适合微服务。
依赖审计 → cargo audit / cargo deny
cargo audit 扫已知漏洞,cargo deny 查许可证和禁止 crates。放进 CI,有漏洞直接阻断合并。
Release 性能调优
# Cargo.toml 末尾
[profile.release]
opt-level = 3 # 最高优化
lto = true # 链接时优化,跨 crate 内联
codegen-units = 1 # 单 codegen unit,优化更彻底但编译更慢
panic = "abort" # 不展开栈,二进制更小
strip = true # 去掉符号表
CI/CD:GitHub Actions
# .github/workflows/ci.yml
name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2 # 缓存 target/,省几分钟
- run: cargo fmt -- --check
- run: cargo clippy -- -D warnings
- run: cargo test
- run: cargo build --release
交叉编译与监控指标
从 Mac 上编译 Linux 二进制,用 cross(Docker 里跑构建)省心;从 Linux 编译 Windows/ARM 同理。监控用 metrics crate 打点,Prometheus 抓取。
# 交叉编译到 Linux x86_64(在 Mac 上)
cargo install cross
cross build --release --target x86_64-unknown-linux-musl
# 监控指标:/metrics 给 Prometheus
use metrics::{counter, histogram};
use metrics_exporter_prometheus::PrometheusBuilder;
PrometheusBuilder::new().install().unwrap();
// handler 里打点
counter!("http_requests_total", "route" => "/todos").increment();
histogram!("request_duration_ms").record(duration_ms as f64);
性能分析:火焰图定位瓶颈
"慢"不能靠猜。Rust 后端有两条路:微基准测函数级,火焰图找全局热点。先量再优化,别上来就瞎改。
# 1. 微基准:criterion,自动跑多次取统计
# Cargo.toml [dev-dependencies] criterion = "0.5", benches/ 目录写
cargo bench
# 2. 火焰图:samply 跨平台(Mac/Linux 都行),一条命令出图
cargo install samply
samply record ./target/release/my-server # 跑一会再 Ctrl+C
# 自动打开浏览器,火焰图里越宽的柱子越费 CPU
# Linux 上也可以 perf + flamegraph
cargo install flamegraph
cargo flamegraph --bin my-server
| 工具 | 查什么 |
|---|---|
| criterion | 单个函数的微基准,配统计检验,看改动有没有真的变快 |
| samply / flamegraph | 抽样 profiling,一眼看出哪个函数占 CPU 最多 |
| tracing span | 业务层"哪段慢":在关键函数加 span,看哪个 span 耗时最长 |
| sqlx / pg_stat | 慢 SQL:打开 SQL 日志,或看数据库侧的慢查询 |
| metrics+Prometheus | 生产实时:P99 延迟、QPS、错误率,按接口分桶 |
排查顺序:先用 Prometheus/tracing 定位"是哪个接口、哪一步慢",再用火焰图钻进去看是哪个函数,最后才动代码。别一上来就怀疑 GC——Rust 没有 GC,慢通常在锁等待、慢 SQL 或串行点。
记
本章小结
① 部署三件套:多阶段 Dockerfile + Nginx 反代 + systemd。
② 安全红线:argon2 哈希、SQLx 参数化、JWT、cargo audit。
③ 性能配置:opt-level=3 + lto=true + codegen-units=1,二进制又小又快。