Systemd 服务部署¶
此目录包含在 Linux 系统上部署 Shortener 服务器的 systemd 服务配置。
快速开始¶
安装¶
# 首先构建发布版本
cd ../..
cargo build --release -p shortener-server
# 安装服务(需要 root 权限)
cd deploy/systemd
sudo ./install.sh
配置¶
编辑配置文件:
启动服务¶
# 启动服务
sudo systemctl start shortener-server
# 启用开机自启动
sudo systemctl enable shortener-server
# 检查状态
sudo systemctl status shortener-server
服务管理¶
启动/停止/重启¶
# 启动
sudo systemctl start shortener-server
# 停止
sudo systemctl stop shortener-server
# 重启
sudo systemctl restart shortener-server
# 重新加载配置(如果支持)
sudo systemctl reload shortener-server
启用/禁用自动启动¶
# 启用开机自启动
sudo systemctl enable shortener-server
# 禁用自动启动
sudo systemctl disable shortener-server
# 检查是否已启用
systemctl is-enabled shortener-server
查看状态¶
# 详细状态
sudo systemctl status shortener-server
# 检查是否运行
systemctl is-active shortener-server
# 检查是否失败
systemctl is-failed shortener-server
日志¶
查看日志¶
# 查看最近的日志
sudo journalctl -u shortener-server
# 实时跟踪日志
sudo journalctl -u shortener-server -f
# 查看自启动以来的日志
sudo journalctl -u shortener-server -b
# 查看最近一小时的日志
sudo journalctl -u shortener-server --since "1 hour ago"
# 查看特定优先级的日志
sudo journalctl -u shortener-server -p err
# 导出日志到文件
sudo journalctl -u shortener-server > shortener.log
日志轮转¶
Systemd 通过 journald 自动处理日志轮转。在 /etc/systemd/journald.conf 中配置:
文件位置¶
二进制文件¶
/usr/local/bin/shortener-server- 主可执行文件
配置¶
/etc/shortener/config.toml- 主配置文件
数据¶
/var/lib/shortener/- 数据目录shortener.db- SQLite 数据库(如果使用 SQLite)ip2region.xdb- GeoIP 数据库
日志¶
/var/log/shortener/- 日志目录(如果启用文件日志)journalctl -u shortener-server- Systemd 日志
服务¶
/etc/systemd/system/shortener-server.service- 服务单元文件
服务配置¶
服务文件包括:
安全特性¶
- NoNewPrivileges:防止权限提升
- PrivateTmp:隔离的 /tmp 目录
- ProtectSystem:只读系统目录
- ProtectHome:无法访问家目录
- ProtectKernelTunables:受保护的内核参数
- RestrictRealtime:无实时调度
- MemoryDenyWriteExecute:W^X 内存保护
资源限制¶
- LimitNOFILE:65536 个打开文件
- LimitNPROC:512 个进程
重启策略¶
- Restart:失败时重启
- RestartSec:5 秒
- StartLimitInterval:60 秒
- StartLimitBurst:3 次尝试
自定义¶
编辑服务文件¶
# 编辑服务文件
sudo systemctl edit --full shortener-server
# 或直接编辑
sudo vim /etc/systemd/system/shortener-server.service
# 更改后重新加载
sudo systemctl daemon-reload
sudo systemctl restart shortener-server
环境变量¶
在服务文件中添加环境变量:
[Service]
Environment="RUST_LOG=debug"
Environment="DATABASE_TYPE=postgres"
Environment="DATABASE_HOST=localhost"
或使用环境文件:
创建 /etc/shortener/environment:
故障排除¶
服务无法启动¶
# 检查状态
sudo systemctl status shortener-server
# 查看详细日志
sudo journalctl -u shortener-server -n 50 --no-pager
# 检查配置
sudo /usr/local/bin/shortener-server --version
# 测试配置
sudo -u shortener /usr/local/bin/shortener-server
权限问题¶
# 检查文件所有权
ls -la /usr/local/bin/shortener-server
ls -la /etc/shortener/config.toml
ls -la /var/lib/shortener/
# 修复所有权
sudo chown shortener:shortener /var/lib/shortener/
sudo chown shortener:shortener /var/log/shortener/
端口已被占用¶
# 检查什么在使用端口 8080
sudo lsof -i :8080
sudo netstat -tulpn | grep 8080
# 在配置中更改端口
sudo vim /etc/shortener/config.toml
服务立即崩溃¶
# 检查错误
sudo journalctl -u shortener-server -n 100 --no-pager
# 手动运行以查看错误
sudo -u shortener /usr/local/bin/shortener-server
# 检查依赖项
ldd /usr/local/bin/shortener-server
卸载¶
# 运行卸载脚本
cd deploy/systemd
sudo ./uninstall.sh
# 手动删除所有文件(可选)
sudo rm -rf /usr/local/bin/shortener-server
sudo rm -rf /etc/shortener
sudo rm -rf /var/lib/shortener
sudo rm -rf /var/log/shortener
sudo userdel shortener
与其他服务集成¶
Nginx 反向代理¶
创建 /etc/nginx/sites-available/shortener:
server {
listen 80;
server_name short.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
启用并重启:
sudo ln -s /etc/nginx/sites-available/shortener /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
PostgreSQL 数据库¶
确保 PostgreSQL 在服务之前启动:
[Unit]
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service
Redis 缓存¶
确保 Redis 在服务之前启动:
监控¶
Systemd 状态¶
# 监视状态
watch -n 1 'systemctl status shortener-server'
# 检查重启次数
systemctl show shortener-server -p NRestarts
资源使用¶
最佳实践¶
- 始终测试配置,然后再在生产环境中重启
- 使用环境文件存储敏感数据
- 启用自动启动用于生产服务
- 定期监控日志
- 设置资源限制以防止资源耗尽
- 使用 systemd 提供的安全特性
- 保留配置和数据的备份
- 记录服务配置的更改