从零部署 Debian 服务器:Nginx 静态站点、自动备份与安全加固实战源码分享
Debian 实战案例分享|附源码
在服务器运维、开发环境搭建、自动化部署以及私有化服务建设中,Debian 一直是非常受欢迎的 Linux 发行版。它以稳定、安全、软件仓库丰富著称,尤其适合作为生产服务器系统使用。相比一些追求新版本软件的发行版,Debian 更强调长期稳定性,这对于企业应用、个人服务器、NAS、内网服务等场景来说非常重要。
本文将通过一个完整的 Debian 实战案例,分享如何在 Debian 系统上完成一个“轻量级 Web 服务部署 + 自动化备份 + 系统安全加固”的实践过程。文章会包含实际命令、配置思路以及可直接使用的源码脚本,适合正在学习 Linux 运维、Debian 服务器部署或希望搭建个人服务的读者参考。
一、案例背景
假设我们有一台云服务器或本地虚拟机,系统安装的是 Debian 12,目标是部署一个简单的 Web 服务,并完成以下任务:
- 更新 Debian 系统环境;
- 安装 Nginx 作为 Web 服务器;
- 部署一个静态网站;
- 配置防火墙;
- 创建自动化备份脚本;
- 使用 Cron 定时执行备份;
- 编写一键初始化脚本,提高部署效率;
- 对系统进行基础安全加固。
这个案例虽然简单,但涵盖了日常服务器运维中非常常见的操作。掌握这些内容之后,可以进一步扩展到 Node.js、Python Flask、Django、PHP、Docker 等实际生产环境。
二、实验环境说明
本文使用的环境如下:
| 项目 | 内容 |
|---|---|
| 操作系统 | Debian 12 |
| Web 服务 | Nginx |
| 备份工具 | tar、gzip |
| 防火墙 | ufw |
| Shell | Bash |
| 用户权限 | sudo 或 root |
如果你使用的是 Debian 11,大部分命令同样适用。若是 Ubuntu,也可以参考,因为 Ubuntu 本身基于 Debian。
三、系统初始化与软件更新
服务器安装完成后,第一件事通常不是马上部署服务,而是更新软件包索引和系统软件。这样可以避免使用旧版本软件带来的安全风险。
sudo apt update
sudo apt upgrade -y
如果系统中有不再需要的软件包,可以执行:
sudo apt autoremove -y
为了方便后续操作,还可以安装一些常用工具:
sudo apt install -y vim curl wget git unzip tar htop net-tools ufw
这些工具的作用如下:
| 工具 | 作用 |
|---|---|
| vim | 编辑配置文件 |
| curl/wget | 下载文件、测试接口 |
| git | 拉取源码 |
| unzip/tar | 解压缩文件 |
| htop | 查看系统资源 |
| net-tools | 使用 netstat 等网络工具 |
| ufw | 简化防火墙管理 |
四、安装并配置 Nginx
Nginx 是一款高性能 Web 服务器,在静态资源服务、反向代理、负载均衡等场景中非常常见。
安装 Nginx:
sudo apt install -y nginx
安装完成后启动服务:
sudo systemctl start nginx
设置开机自启:
sudo systemctl enable nginx
查看运行状态:
sudo systemctl status nginx
如果状态中显示 active running,说明 Nginx 已经正常运行。
此时可以在浏览器中访问服务器 IP,例如:
http://你的服务器IP
如果看到 Debian 或 Nginx 默认欢迎页面,就说明服务已经部署成功。
五、部署一个静态网站
接下来我们创建一个简单的网站目录:
sudo mkdir -p /var/www/debian-demo
创建首页文件:
sudo vim /var/www/debian-demo/index.html
写入以下内容:
Debian 实战案例
Debian 实战案例分享
这是一个运行在 Debian + Nginx 环境下的静态网站。
当前服务目录:/var/www/debian-demo
如果你能看到这个页面,说明部署成功。
接着创建 Nginx 站点配置文件:
sudo vim /etc/nginx/sites-available/debian-demo
写入以下配置:
server {
listen 80;
server_name _;
root /var/www/debian-demo;
index index.html index.htm;
access_log /var/log/nginx/debian-demo.access.log;
error_log /var/log/nginx/debian-demo.error.log;
location / {
try_files $uri $uri/ =404;
}
}
启用该站点:
sudo ln -s /etc/nginx/sites-available/debian-demo /etc/nginx/sites-enabled/debian-demo
如果不需要默认站点,可以删除默认配置软链接:
sudo rm -f /etc/nginx/sites-enabled/default
检查 Nginx 配置是否正确:
sudo nginx -t
如果输出类似:
syntax is ok
test is successful
说明配置没有问题。重新加载 Nginx:
sudo systemctl reload nginx
再次访问服务器 IP,就可以看到我们刚刚创建的静态页面。
六、配置防火墙 UFW
服务器暴露在公网时,防火墙配置非常重要。Debian 默认可能没有启用防火墙,我们可以使用 UFW 简化管理。
允许 SSH 连接:
sudo ufw allow OpenSSH
允许 HTTP 服务:
sudo ufw allow 'Nginx HTTP'
如果后续配置 HTTPS,也可以允许:
sudo ufw allow 'Nginx HTTPS'
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status verbose
输出可能类似:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
这里要特别注意:启用防火墙之前一定要先允许 SSH,否则可能会把自己挡在服务器外面。
七、自动化备份需求分析
静态网站虽然简单,但仍然需要备份。我们至少应该备份以下内容:
- 网站目录:
/var/www/debian-demo - Nginx 站点配置:
/etc/nginx/sites-available/debian-demo - 可选:日志文件或系统配置
为了避免备份文件无限增长,我们还需要设置自动清理策略,例如只保留最近 7 天的备份。
备份目录可以设置为:
/backup/debian-demo
备份文件命名格式可以是:
debian-demo-20250101-120000.tar.gz
这样通过文件名就能判断备份时间。
八、备份脚本源码
下面是一个可以直接使用的 Bash 备份脚本。
创建脚本文件:
sudo mkdir -p /opt/scripts
sudo vim /opt/scripts/backup_debian_demo.sh
写入以下源码:
#!/bin/bash
# =========================================================
# Debian Demo 网站自动备份脚本
# 功能:
# 1. 备份网站目录
# 2. 备份 Nginx 配置
# 3. 自动生成压缩包
# 4. 自动清理过期备份
# =========================================================
set -e
APP_NAME="debian-demo"
WEB_DIR="/var/www/debian-demo"
NGINX_CONF="/etc/nginx/sites-available/debian-demo"
BACKUP_ROOT="/backup/${APP_NAME}"
LOG_FILE="${BACKUP_ROOT}/backup.log"
RETENTION_DAYS=7
DATE_TIME=$(date +"%Y%m%d-%H%M%S")
BACKUP_FILE="${BACKUP_ROOT}/${APP_NAME}-${DATE_TIME}.tar.gz"
TMP_DIR="/tmp/${APP_NAME}-backup-${DATE_TIME}"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
check_path() {
if [ ! -e "$1" ]; then
log "错误:路径不存在:$1"
exit 1
fi
}
main() {
mkdir -p "${BACKUP_ROOT}"
mkdir -p "${TMP_DIR}"
log "开始备份 ${APP_NAME}"
check_path "${WEB_DIR}"
check_path "${NGINX_CONF}"
mkdir -p "${TMP_DIR}/www"
mkdir -p "${TMP_DIR}/nginx"
cp -a "${WEB_DIR}" "${TMP_DIR}/www/"
cp -a "${NGINX_CONF}" "${TMP_DIR}/nginx/"
tar -czf "${BACKUP_FILE}" -C "${TMP_DIR}" .
rm -rf "${TMP_DIR}"
log "备份完成:${BACKUP_FILE}"
log "开始清理 ${RETENTION_DAYS} 天前的备份文件"
find "${BACKUP_ROOT}" -name "${APP_NAME}-*.tar.gz" -type f -mtime +${RETENTION_DAYS} -delete
log "清理完成"
}
main
保存后赋予执行权限:
sudo chmod +x /opt/scripts/backup_debian_demo.sh
手动执行一次测试:
sudo /opt/scripts/backup_debian_demo.sh
查看备份结果:
ls -lh /backup/debian-demo
查看日志:
cat /backup/debian-demo/backup.log
如果能看到 .tar.gz 文件,说明备份脚本运行成功。
九、配置 Cron 定时备份
手动备份不可靠,最佳方式是使用 Cron 定时执行。例如每天凌晨 2 点自动备份一次。
编辑 root 用户的定时任务:
sudo crontab -e
添加以下内容:
0 2 * * * /opt/scripts/backup_debian_demo.sh >/dev/null 2>&1
含义如下:
| 字段 | 含义 |
|---|---|
| 0 | 第 0 分钟 |
| 2 | 凌晨 2 点 |
| * | 每天 |
| * | 每月 |
| * | 每周任意一天 |
查看定时任务:
sudo crontab -l
为了验证 Cron 是否正常执行,也可以临时设置为每分钟执行一次:
* * * * * /opt/scripts/backup_debian_demo.sh >/dev/null 2>&1
确认没有问题后,再恢复为每天凌晨执行。
十、一键初始化脚本源码
为了提高部署效率,我们可以编写一个一键初始化脚本。它会自动完成软件安装、网站目录创建、Nginx 配置生成、防火墙配置和备份脚本安装。
创建文件:
vim init_debian_demo.sh
源码如下:
#!/bin/bash
set -e
APP_NAME="debian-demo"
WEB_DIR="/var/www/${APP_NAME}"
NGINX_CONF="/etc/nginx/sites-available/${APP_NAME}"
NGINX_LINK="/etc/nginx/sites-enabled/${APP_NAME}"
SCRIPT_DIR="/opt/scripts"
BACKUP_SCRIPT="${SCRIPT_DIR}/backup_${APP_NAME}.sh"
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 root 用户执行该脚本,或使用 sudo 执行。"
exit 1
fi
echo "==> 更新系统软件包"
apt update
apt upgrade -y
echo "==> 安装必要软件"
apt install -y nginx ufw curl wget vim tar gzip
echo "==> 创建网站目录"
mkdir -p "${WEB_DIR}"
cat > "${WEB_DIR}/index.html" <<'EOF'
Debian Demo
Debian Demo 部署成功
这是通过一键初始化脚本部署的 Nginx 静态网站。
系统:Debian
服务:Nginx
EOF
echo "==> 写入 Nginx 配置"
cat > "${NGINX_CONF}" < 启用站点"
ln -sf "${NGINX_CONF}" "${NGINX_LINK}"
rm -f /etc/nginx/sites-enabled/default
echo "==> 检查 Nginx 配置"
nginx -t
echo "==> 启动并设置 Nginx 开机自启"
systemctl enable nginx
systemctl restart nginx
echo "==> 配置防火墙"
ufw allow OpenSSH
ufw allow 'Nginx HTTP'
ufw --force enable
echo "==> 创建备份脚本"
mkdir -p "${SCRIPT_DIR}"
cat > "${BACKUP_SCRIPT}" <<'EOF'
#!/bin/bash
set -e
APP_NAME="debian-demo"
WEB_DIR="/var/www/debian-demo"
NGINX_CONF="/etc/nginx/sites-available/debian-demo"
BACKUP_ROOT="/backup/${APP_NAME}"
LOG_FILE="${BACKUP_ROOT}/backup.log"
RETENTION_DAYS=7
DATE_TIME=$(date +"%Y%m%d-%H%M%S")
BACKUP_FILE="${BACKUP_ROOT}/${APP_NAME}-${DATE_TIME}.tar.gz"
TMP_DIR="/tmp/${APP_NAME}-backup-${DATE_TIME}"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
check_path() {
if [ ! -e "$1" ]; then
log "错误:路径不存在:$1"
exit 1
fi
}
main() {
mkdir -p "${BACKUP_ROOT}"
mkdir -p "${TMP_DIR}"
log "开始备份 ${APP_NAME}"
check_path "${WEB_DIR}"
check_path "${NGINX_CONF}"
mkdir -p "${TMP_DIR}/www"
mkdir -p "${TMP_DIR}/nginx"
cp -a "${WEB_DIR}" "${TMP_DIR}/www/"
cp -a "${NGINX_CONF}" "${TMP_DIR}/nginx/"
tar -czf "${BACKUP_FILE}" -C "${TMP_DIR}" .
rm -rf "${TMP_DIR}"
log "备份完成:${BACKUP_FILE}"
find "${BACKUP_ROOT}" -name "${APP_NAME}-*.tar.gz" -type f -mtime +${RETENTION_DAYS} -delete
log "过期备份清理完成"
}
main
EOF
chmod +x "${BACKUP_SCRIPT}"
echo "==> 添加 Cron 定时任务"
CRON_JOB="0 2 * * * ${BACKUP_SCRIPT} >/dev/null 2>&1"
if crontab -l 2>/dev/null | grep -Fq "${BACKUP_SCRIPT}"; then
echo "Cron 任务已存在,跳过添加"
else
(crontab -l 2>/dev/null; echo "${CRON_JOB}") | crontab -
fi
echo "==> 执行一次备份测试"
"${BACKUP_SCRIPT}"
echo "==> 部署完成"
echo "请访问:http://服务器IP"
赋予执行权限:
chmod +x init_debian_demo.sh
执行脚本:
sudo ./init_debian_demo.sh
执行完成后,整个静态网站、Nginx、备份脚本和防火墙都会配置好。
十一、系统安全加固建议
完成基础服务部署后,还应进行必要的安全加固。
1. 禁止 root 远程登录
编辑 SSH 配置:
sudo vim /etc/ssh/sshd_config
找到或添加:
PermitRootLogin no
重启 SSH:
sudo systemctl restart ssh
在禁用 root 登录之前,一定要确认已经创建了普通用户,并且该用户可以使用 sudo。
创建普通用户示例:
sudo adduser deploy
sudo usermod -aG sudo deploy
2. 修改 SSH 默认端口
默认的 22 端口经常被扫描,可以改成其他端口,例如 2222:
Port 2222
修改后需要先放行新端口:
sudo ufw allow 2222/tcp
然后重启 SSH:
sudo systemctl restart ssh
确认新端口可以正常登录后,再删除旧规则:
sudo ufw delete allow OpenSSH
3. 使用 fail2ban 防暴力破解
安装 fail2ban:
sudo apt install -y fail2ban
启动并设置开机自启:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
查看状态:
sudo systemctl status fail2ban
fail2ban 可以根据日志自动封禁频繁尝试登录的 IP,对公网服务器非常实用。
4. 定期更新系统
可以定期执行:
sudo apt update
sudo apt upgrade -y
如果希望自动安装安全更新,可以安装:
sudo apt install -y unattended-upgrades
启用配置:
sudo dpkg-reconfigure unattended-upgrades
十二、常见问题排查
1. Nginx 启动失败
可以先检查配置:
sudo nginx -t
查看错误日志:
sudo journalctl -u nginx
常见原因包括:
- 配置文件语法错误;
- 端口 80 被其他程序占用;
- 网站目录不存在;
- 文件权限不正确。
查看端口占用:
sudo ss -tunlp | grep :80
2. 浏览器无法访问网站
排查顺序如下:
- Nginx 是否运行:
sudo systemctl status nginx
- 防火墙是否放行:
sudo ufw status
- 云服务器安全组是否放行 80 端口;
- 本地是否能访问:
curl http://127.0.0.1
如果本地可以访问,但公网不能访问,多半是云安全组或防火墙问题。
3. Cron 没有执行备份
检查定时任务:
sudo crontab -l
查看系统日志:
sudo grep CRON /var/log/syslog
确认脚本具有执行权限:
ls -l /opt/scripts/backup_debian_demo.sh
也可以在 Cron 中使用绝对路径,这是一个非常好的习惯。
十三、案例总结
通过本文的 Debian 实战案例,我们完成了从系统初始化到 Web 服务部署,再到自动化备份和基础安全加固的一整套流程。这个案例看似只是部署了一个简单的静态网站,但实际上已经包含了服务器管理中的多个核心环节。
本文重点包括:
- Debian 软件包管理;
- Nginx 安装与站点配置;
- 静态网站部署;
- UFW 防火墙配置;
- Bash 自动化备份脚本;
- Cron 定时任务;
- 一键初始化部署脚本;
- SSH 与系统安全加固;
- 常见故障排查方法。
在真实生产环境中,可以在此基础上继续扩展。例如,给 Nginx 配置 HTTPS 证书、使用 Docker 部署应用、通过 Git 自动拉取代码、使用 rsync 远程备份、接入 Prometheus 监控、使用 Ansible 批量管理服务器等。
Debian 的优势不只在于稳定,更在于它适合构建可维护、可复制、可自动化的服务器环境。只要掌握了系统初始化、服务配置、日志排查、备份恢复和安全加固这些基础能力,就可以应对大多数中小型服务器运维场景。