Rust 语言凭借其卓越的性能、内存安全保证和现代化的工具链,已成为构建高性能网络服务的理想选择,将一个 Rust 应用程序部署到服务器上,使其能够稳定、持续地运行,是每个开发者从开发走向生产的关键一步,本文将详细介绍如何从零开始,在 Linux 服务器上设置并运行一个 Rust 应用,涵盖环境准备、应用构建、服务化部署以及通过反向代理和 HTTPS 进行加固的全过程。

准备工作
在开始之前,你需要准备以下几项:
- 一台云服务器:可以选择任何主流的云服务提供商,如 AWS、Vultr、DigitalOcean 或阿里云等,推荐使用 Ubuntu 20.04 或 22.04 LTS 版本,因为它拥有广泛的社区支持和丰富的文档。
- 一个域名(可选但推荐):如果你希望通过域名而不是 IP 地址访问你的服务,并计划启用 HTTPS,那么一个域名是必需的。
- 本地开发环境:确保你的本地机器上已安装 Rust 和 Cargo。
第一步:准备服务器环境
通过 SSH 连接到你的服务器,为了安全起见,不建议直接使用 root 用户进行操作。
-
更新系统软件包: 登录后,首先更新系统的包列表和已安装的软件包到最新版本。
sudo apt update sudo apt upgrade -y
-
创建非 root 用户: 创建一个新用户并赋予其
sudo权限,这是标准的安全实践,将your_user替换为你想要的用户名。adduser your_user usermod -aG sudo your_user
完成后,使用
exit命令退出当前root会话,然后以新用户身份重新登录。 -
配置防火墙: 使用
ufw(Uncomplicated Firewall)来设置基本的防火墙规则,只允许必要的流量通过。sudo ufw allow OpenSSH # 允许 SSH 连接,防止自己被锁在门外 sudo ufw allow 'Nginx Full' # 稍后会安装 Nginx,提前放行 HTTP 和 HTTPS sudo ufw enable
当提示时,输入
y确认启用防火墙。
第二步:安装 Rust 工具链
在服务器上,我们需要安装 Rust 来编译项目(虽然你也可以在本地交叉编译,但直接在目标服务器上编译通常更简单),推荐使用官方的 rustup 安装脚本。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装过程中,会提示你选择安装选项,直接按回车键选择默认安装即可,安装完成后,根据提示重新加载环境变量,或者直接注销并重新登录。
source ~/.cargo/env
你可以通过运行 rustc --version 来验证 Rust 是否已成功安装。
第三步:构建与传输应用
我们需要在本地将你的 Rust 项目编译为优化的发布版本,然后将其传输到服务器上。
-
本地构建: 在你的本地项目目录中,运行以下命令。
--release标志会启用所有优化,使你的应用运行得更快。cargo build --release
编译完成后,可执行文件将位于
target/release/目录下,假设你的项目名为my_rust_app,那么文件就是target/release/my_rust_app。
-
传输到服务器: 使用
scp(Secure Copy)命令将编译好的二进制文件从本地复制到服务器,将your_server_ip和your_user替换为你的实际信息。scp target/release/my_rust_app your_user@your_server_ip:/home/your_user/
为了保持服务器整洁,最好为你的应用创建一个专门的目录。
# 在服务器上执行 mkdir /home/your_user/my_rust_app_service mv /home/your_user/my_rust_app /home/your_user/my_rust_app_service/
第四步:使用 Systemd 管理服务
仅仅在终端中运行 ./my_rust_app 是不够的,因为一旦你关闭 SSH 连接,进程就会终止,我们需要一个进程管理器来确保应用在后台持续运行,并在服务器重启后自动启动。systemd 是现代 Linux 发行版的标准选择。
-
创建 Service 文件: 使用
nano或vim等编辑器创建一个systemd服务文件。sudo nano /etc/systemd/system/my_rust_app.service
-
编写服务配置: 将以下内容粘贴到文件中,请务必根据你的实际情况修改
User、WorkingDirectory和ExecStart路径。[Unit] Description=My Rust Web Application After=network.target [Service] Type=simple User=your_user WorkingDirectory=/home/your_user/my_rust_app_service ExecStart=/home/your_user/my_rust_app_service/my_rust_app Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal SyslogIdentifier=my_rust_app [Install] WantedBy=multi-user.target
[Unit]部分定义了服务的元数据和依赖关系。[Service]部分是核心,指定了运行服务的用户、工作目录、可执行文件路径,以及失败时自动重启的策略。[Install]部分定义了如何启用服务。
-
启动并启用服务: 保存并关闭文件后,执行以下命令来重新加载
systemd配置、启动你的应用,并设置其开机自启。sudo systemctl daemon-reload sudo systemctl start my_rust_app sudo systemctl enable my_rust_app
-
检查服务状态: 你可以使用以下命令来检查服务是否正在正常运行。
sudo systemctl status my_rust_app
如果看到
active (running)的绿色字样,恭喜你,你的 Rust 应用已经成功在服务器上运行了!
第五步:配置 Nginx 反向代理
直接让用户通过 IP 和端口(如 http://your_server_ip:8080)访问应用并不友好,使用 Nginx 作为反向代理,可以让你通过域名(如 http://your_domain.com)的 80 或 443 端口访问,同时还能处理负载均衡、SSL 终止和静态文件服务。
-
安装 Nginx:
sudo apt install nginx -y
-
创建 Nginx 配置文件: 为你的站点创建一个新的配置文件。
sudo nano /etc/nginx/sites-available/my_rust_app
-
编写 Nginx 配置: 假设你的 Rust 应用监听在
0.0.1:8080,将以下内容粘贴进去,记得替换your_domain.com。server { listen 80; server_name your_domain.com; location / { proxy_pass http://127.0.0.1:8080; 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; proxy_cache_bypass $http_upgrade; } } -
启用配置: 通过创建符号链接来启用这个站点配置,并测试 Nginx 配置是否有语法错误。

sudo ln -s /etc/nginx/sites-available/my_rust_app /etc/nginx/sites-enabled/ sudo nginx -t
如果测试成功,重启 Nginx 以应用更改。
sudo systemctl restart nginx
你应该可以通过浏览器访问
http://your_domain.com来看到你的 Rust 应用了。
第六步:启用 HTTPS (SSL/TLS)
为了保护用户数据的安全,启用 HTTPS 是必不可少的,我们可以使用 Let's Encrypt 提供的免费 SSL 证书。
-
安装 Certbot: Certbot 是一个可以自动获取和续期 Let's Encrypt 证书的工具。
sudo apt install certbot python3-certbot-nginx -y
-
获取并安装证书: Certbot 会自动检测你的 Nginx 配置并为你处理证书的安装和配置,只需运行以下命令并按照提示操作。
sudo certbot --nginx -d your_domain.com
Certbot 会询问你是否希望将 HTTP 流量重定向到 HTTPS,建议选择
2(Redirect)。
至此,你已经拥有一个通过 HTTPS 安全访问、由 systemd 管理的、在 Nginx 反向代理后运行的 Rust 服务器应用,Certbot 还会自动设置一个定时任务来续期你的证书,无需你手动干预。
相关问答 (FAQs)
问题 1:我更新了代码,如何将新版本部署到服务器上?
解答:部署流程非常简单,在你的本地环境中再次运行 cargo build --release 来生成新的二进制文件,使用 scp 命令将新文件覆盖到服务器上的相同位置:
scp target/release/my_rust_app your_user@your_server_ip:/home/your_user/my_rust_app_service/
文件传输完成后,只需重启 systemd 服务即可让新版本生效:
sudo systemctl restart my_rust_app
整个过程通常只需要几秒钟,可以实现快速迭代和零停机更新(如果你的应用支持优雅重启的话)。
问题 2:我的服务启动失败了,我该如何排查问题?
解答:当 systemd 服务启动失败时,首先应该查看它的日志来获取详细的错误信息,使用以下命令可以查看服务的实时日志和历史日志:
sudo journalctl -u my_rust_app.service -f
-f 参数会实时跟踪日志输出,不加 -f 则会查看所有历史记录,常见的失败原因包括:
- 路径错误:
ExecStart中的可执行文件路径不正确。 - 权限问题:运行服务的用户(
User)没有执行二进制文件或读写相关目录/文件的权限。 - 端口占用:你的 Rust 应用尝试监听的端口已被其他进程占用。
- 环境变量缺失:应用依赖某些环境变量,但在
systemd配置文件中未设置(可以通过Environment="VAR_NAME=value"来添加)。 通过仔细阅读日志,通常都能快速定位并解决问题。