部署上线 #

本节将介绍如何将Rocket应用部署到生产环境,包括Docker容器化、云平台部署和监控配置。

编译优化 #

Cargo.toml配置 #

toml
[profile.release]
opt-level = 3
lto = true
codegen-units = 1
panic = "abort"
strip = true

编译发布版本 #

bash
cargo build --release

Docker部署 #

Dockerfile #

dockerfile
FROM rust:1.75 as builder

WORKDIR /app

COPY Cargo.toml Cargo.lock ./
COPY src ./src

RUN cargo build --release

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY --from=builder /app/target/release/my_app /app/my_app
COPY Rocket.toml ./
COPY templates ./templates
COPY static ./static

ENV ROCKET_ENV=release

EXPOSE 8000

CMD ["./my_app"]

docker-compose.yml #

yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - ROCKET_DATABASES={my_db={url=postgres://user:pass@db:5432/mydb}}
    depends_on:
      - db
      - redis
  
  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  redis:
    image: redis:7
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

构建和运行 #

bash
docker-compose build
docker-compose up -d

系统服务 #

systemd服务 #

创建 /etc/systemd/system/rocket_app.service:

ini
[Unit]
Description=Rocket Web Application
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/rocket_app
ExecStart=/opt/rocket_app/my_app
Restart=always
RestartSec=5
Environment=ROCKET_ENV=release
Environment=ROCKET_ADDRESS=127.0.0.1
Environment=ROCKET_PORT=8000

[Install]
WantedBy=multi-user.target

启动服务 #

bash
sudo systemctl daemon-reload
sudo systemctl enable rocket_app
sudo systemctl start rocket_app
sudo systemctl status rocket_app

Nginx反向代理 #

Nginx配置 #

nginx
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /static/ {
        alias /opt/rocket_app/static/;
        expires 30d;
    }
}

HTTPS配置 #

nginx
server {
    listen 443 ssl http2;
    server_name example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

环境变量 #

生产环境配置 #

bash
export ROCKET_ENV=release
export ROCKET_ADDRESS=0.0.0.0
export ROCKET_PORT=8000
export ROCKET_SECRET_KEY="your-production-secret-key"
export DATABASE_URL="postgres://user:pass@localhost/mydb"
export JWT_SECRET="your-jwt-secret"

使用.env文件 #

env
ROCKET_ENV=release
ROCKET_ADDRESS=0.0.0.0
ROCKET_PORT=8000
ROCKET_SECRET_KEY=your-secret-key
DATABASE_URL=postgres://user:pass@localhost/mydb

日志管理 #

配置日志 #

toml
[release]
log_level = "critical"

日志轮转 #

创建 /etc/logrotate.d/rocket_app:

text
/var/log/rocket_app/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload rocket_app > /dev/null
    endscript
}

健康检查 #

健康检查端点 #

rust
#[get("/health")]
fn health() -> &'static str {
    "OK"
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/", routes![health])
}

Docker健康检查 #

dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

监控 #

Prometheus指标 #

rust
use rocket::fairing::{Fairing, Info, Kind};
use rocket::{Request, Response};
use std::sync::atomic::{AtomicU64, Ordering};

pub struct Metrics {
    pub requests_total: AtomicU64,
    pub requests_active: AtomicU64,
}

impl Metrics {
    pub fn new() -> Self {
        Self {
            requests_total: AtomicU64::new(0),
            requests_active: AtomicU64::new(0),
        }
    }
}

#[rocket::async_trait]
impl Fairing for Metrics {
    fn info(&self) -> Info {
        Info {
            name: "Metrics",
            kind: Kind::Request | Kind::Response,
        }
    }

    async fn on_request(&self, _request: &mut Request<'_>, _data: &mut rocket::Data<'_>) {
        self.requests_total.fetch_add(1, Ordering::Relaxed);
        self.requests_active.fetch_add(1, Ordering::Relaxed);
    }

    async fn on_response<'r>(&self, _request: &'r Request<'_>, _response: &mut Response<'r>) {
        self.requests_active.fetch_sub(1, Ordering::Relaxed);
    }
}

部署检查清单 #

部署前 #

  • [ ] 设置生产环境配置
  • [ ] 配置数据库连接
  • [ ] 设置安全密钥
  • [ ] 配置HTTPS
  • [ ] 设置日志级别

部署后 #

  • [ ] 验证健康检查
  • [ ] 测试API端点
  • [ ] 检查日志输出
  • [ ] 配置监控告警
  • [ ] 设置备份策略

完整部署脚本 #

bash
#!/bin/bash

set -e

echo "Building release..."
cargo build --release

echo "Stopping service..."
sudo systemctl stop rocket_app || true

echo "Deploying..."
sudo cp target/release/my_app /opt/rocket_app/
sudo cp -r templates /opt/rocket_app/
sudo cp -r static /opt/rocket_app/
sudo cp Rocket.toml /opt/rocket_app/

echo "Starting service..."
sudo systemctl start rocket_app

echo "Checking status..."
sudo systemctl status rocket_app

echo "Deployment complete!"

恭喜完成! #

你已经完成了Rocket Web框架的完整学习之旅。从基础入门到高级特性,再到实战项目,你现在具备了使用Rocket构建生产级Web应用的能力。

继续学习和实践:

  • 阅读官方文档
  • 参与社区讨论
  • 贡献开源项目
  • 构建更多项目
最后更新:2026-03-28