部署上线 #
本节将介绍如何将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