我帮不少人排查过VPS问题,发现大多数故障都不是工具本身的bug,而是部署环节漏掉了几个关键步骤。有些错误当时不会立刻出问题,但早晚会在最不该出问题的时候爆发。下面这5个是我见过最频繁的。
错误一:不做安全配置就直接暴露在公网
这是最普遍的问题。服务器买来,装好工具,直接开放端口让外网访问,防火墙没配,SSH还在用默认的22端口和弱密码。
我见过有人的服务器在部署完6小时内就被扫描器发现,SSH被暴力破解,服务器沦为矿机。公网上的扫描是持续不断的,不是"万一",是"一定会发生"。
一步修正:
# 安装并配置UFW防火墙
ufw allow 2222/tcp # 改掉默认SSH端口
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
# 修改SSH端口
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
systemctl restart sshd
# 安装Fail2ban自动封禁暴力破解
apt install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban
禁止root密码登录,改用SSH密钥:
# 在本地生成密钥对
ssh-keygen -t ed25519
# 把公钥上传到服务器
ssh-copy-id -p 2222 root@你的服务器IP
# 禁止密码登录
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
错误二:用低配VPS硬跑高负载工具
1核1GB的机器装上n8n、OpenClaw或者带数据库的应用,跑起来之后内存直接打满,系统开始疯狂用Swap,响应越来越慢,最后OOM killer把进程强制杀掉。
我自己第一次部署n8n的时候就踩了这个坑,1GB内存的机器跑了两个工作流就开始卡,以为是配置问题折腾了半天,后来加了内存才发现根本原因是资源不够。
常见工具的最低内存需求参考:
| 工具 | 最低内存 | 推荐内存 |
|---|---|---|
| OpenClaw | 1GB | 2GB |
| n8n | 1GB | 2-4GB |
| Flowise | 512MB | 1-2GB |
| Dify | 2GB | 4GB |
| Ollama(7B模型) | 8GB | 16GB |
一步修正:
配置不够先加Swap顶着,同时考虑升级套餐:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
查看当前内存使用情况:
free -h
htop
Swap只是缓解措施,不是根本解决方案。如果内存长期跑在80%以上,该升配置就升,省下来的时间成本比VPS差价值钱得多。
错误三:不设置备份,数据一崩全没
这个错误的特点是:出问题之前完全感受不到它的存在,出问题之后追悔莫及。
服务商的磁盘故障、误操作删除文件、系统被入侵后数据被清除、VPS套餐到期忘续费——这些情况都会让你的数据消失。我见过有人运营了几个月的自动化流程配置,因为没备份一次性全没了,重新配置花了好几天。
一步修正:
用crontab设置自动备份,每天定时把关键数据压缩上传到远端:
# 安装备份工具
apt install rclone -y
# 配置rclone连接到S3、Backblaze B2或其他对象存储
rclone config
# 创建备份脚本
cat > /root/backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/root/backups"
mkdir -p $BACKUP_DIR
# 备份应用数据目录(按实际路径修改)
tar -czf $BACKUP_DIR/app-$DATE.tar.gz /root/your-app-data
# 上传到远端存储
rclone copy $BACKUP_DIR/app-$DATE.tar.gz remote:backup-bucket/
# 删除7天前的本地备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
EOF
chmod +x /root/backup.sh
# 设置每天凌晨3点自动运行
(crontab -l 2>/dev/null; echo "0 3 * * * /root/backup.sh") | crontab -
最少做到3-2-1原则:3份副本、2种介质、1份异地存储。
错误四:域名反代和SSL配置错误导致无法访问
这个问题的症状通常是:直接访问IP:端口没问题,绑定域名之后就报502、504或者SSL证书错误。
问题根源有几种:Nginx反代配置里的端口写错了、SSL证书没申请成功但Nginx已经强制跳转HTTPS、Cloudflare的SSL模式设置和服务器不匹配。
我遇到过最经典的情况是Cloudflare设置成了Full(Strict)模式,但服务器上没有有效证书,结果访问一直报526错误,排查了半小时才发现。
一步修正:
标准的Nginx反代配置:
server {
listen 80;
server_name 你的域名;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
location / {
proxy_pass http://localhost:你的应用端口;
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;
}
}
申请Let's Encrypt证书:
apt install certbot python3-certbot-nginx -y
certbot --nginx -d 你的域名
用Cloudflare的话,SSL/TLS模式选Full(服务器有证书)或Flexible(服务器没证书),不要在证书没配好之前就选Full(Strict)。
错误五:后台进程不守护,重启后全部失效
用nohup或者&把进程扔到后台,以为没问题了。结果服务器重启一次,所有服务全部消失,还要重新手动启动。更糟糕的情况是进程崩溃了没人知道,服务已经停了好几个小时。
这个错误我自己也犯过,当时用nohup跑着一个定时任务,VPS因为内核更新自动重启了一次,任务停了整整两天我才发现。
一步修正:
用systemd管理所有需要持续运行的服务:
# 创建服务文件(以OpenClaw为例)
cat > /etc/systemd/system/openclaw.service << 'EOF'
[Unit]
Description=OpenClaw Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root
ExecStart=/usr/bin/openclaw gateway
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动服务
systemctl daemon-reload
systemctl enable openclaw
systemctl start openclaw
# 查看状态
systemctl status openclaw
Docker部署的服务加上--restart always参数:
docker run -d --restart always --name your-app your-image
确认服务开机自启是否生效:
systemctl is-enabled openclaw # 应该显示 enabled
部署前检查清单
对照这个列表确认一遍,能避开大多数问题:
□ SSH端口已修改,默认22端口已关闭
□ SSH密钥登录已启用,密码登录已禁用
□ UFW防火墙已启用,只开放必要端口
□ Fail2ban已安装并运行
□ 服务器内存满足工具最低需求(建议留30%余量)
□ Swap已配置(至少1到2GB)
□ 自动备份已设置并测试过恢复流程
□ Nginx反代配置已验证,SSL证书有效
□ 所有服务已配置systemd自启或Docker restart always
□ 监控告警已配置(推荐Uptime Kuma)
部署完之后手动重启一次服务器,确认所有服务自动恢复正常,这一步很多人跳过,但这是验证第五个错误是否真正修复的唯一方法。