楼层: 首页/ 软件技术/ Rust 后端技术栈/ 部署与生产:Docker、Nginx、安全
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,二进制又小又快。