引言
\n\n您用Rust编写了一个很棒的应用程序。它快速、安全且不会崩溃。但如何让它24/7在远程服务器上运行并对用户可用呢?在VPS(虚拟专用服务器)上部署Rust应用是一个过程,包括编译二进制文件、配置环境、作为系统服务启动,以及通常设置反向代理。
\n\n在本文中,我们将从零开始,完整地走一遍在运行Ubuntu的VPS上部署Rust应用的整个过程。您将学习如何准备服务器、构建项目、配置自动启动以及确保安全。本指南适用于Web服务器(Actix-web、Axum、Rocket)以及任何其他基于Rust的守护进程。
\n\n让我们开始吧。
\n\n1. 服务器和环境准备
\n\n在部署代码之前,需要先打好基础。我们将使用Ubuntu 22.04 LTS,但这些说明也适用于Debian。
\n\n连接到服务器并进行基本配置
\n\n通过SSH连接到您的VPS:
\n\nssh root@您的服务器IP\n\n更新软件包并创建一个用户(以root身份操作是不好的做法):
\n\napt update && apt upgrade -y\nadduser deployer\nusermod -aG sudo deployer\n\n为新用户配置SSH密钥,这样就不必每次都输入密码了。
\n\n在服务器上安装Rust
\n\n最可靠的方法是使用官方脚本rustup。切换到deployer用户并执行:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\n安装后,重新加载shell或执行:
\n\nsource $HOME/.cargo/env\n\n检查版本:
\n\nrustc --version\n\n对于生产构建,我们需要静态链接(以便二进制文件能在任何Linux上运行,无需额外的库)。安装musl-tools:
\n\nsudo apt install musl-tools -y\nrustup target add x86_64-unknown-linux-musl\n\n2. 编译并将二进制文件传输到服务器
\n\n最好在本地机器(或CI/CD中)编译应用程序,然后将准备好的二进制文件复制到服务器。这样更快,也不会给VPS带来负担。
\n\n编译生产版本
\n\n在您的本地计算机上,在项目文件夹中执行:
\n\ncargo build --release --target x86_64-unknown-linux-musl\n\n这将创建一个静态链接的二进制文件,不依赖于glibc。文件大小会更大,但它可以在任何Linux上运行。
\n\n一个用于测试的简单Actix-web Web服务器示例(文件src/main.rs):
use actix_web::{web, App, HttpServer, Responder};\n\nasync fn hello() -> impl Responder {\n "Hello from Rust on VPS!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new().route("/", web::get().to(hello))\n })\n .bind("0.0.0.0:8080")?\n .run()\n .await\n}\n\n复制到服务器
\n\n使用scp进行安全复制:
scp ./target/x86_64-unknown-linux-musl/release/您的项目 deployer@您的服务器IP:/home/deployer/\n\n在服务器上,将二进制文件移动到/usr/local/bin:
sudo mv /home/deployer/您的项目 /usr/local/bin/my-rust-app\nsudo chmod +x /usr/local/bin/my-rust-app\n\n3. 配置systemd以实现自动启动
\n\n为了让应用程序在系统启动时运行、崩溃后重启并在后台运行,我们将创建一个systemd服务。
\n\n创建服务文件:
\n\nsudo nano /etc/systemd/system/rust-app.service\n\n粘贴以下配置(将deployer替换为您的用户名):
[Unit]\nDescription=Rust Application\nAfter=network.target\n\n[Service]\nType=simple\nUse