从零接手一台 Debian 服务器:初始化、安全加固到 Flask 上线实战指南
Debian 实战案例分享|附源码
本文以“真实服务器运维场景”为主线,分享几个在 Debian 系统上常见且实用的实战案例,包括:系统初始化、安全加固、部署 Nginx、部署 Python Web 服务、配置 Systemd 守护进程、日志轮转、自动备份脚本以及防火墙配置。文中附带可直接参考和改造的源码,适合 Linux 运维、后端开发、DevOps 初学者到进阶用户阅读。
一、为什么选择 Debian?
Debian 是一款非常经典、稳定、自由的 Linux 发行版,广泛应用于服务器、嵌入式设备、云计算平台以及个人开发环境中。
相比一些偏“新”的发行版,Debian 的最大特点是:
- 稳定性强:软件包经过充分测试,适合长期运行的服务器环境;
- 软件生态完善:APT 包管理器成熟,软件仓库丰富;
- 社区活跃:文档、教程、问题解答资源非常多;
- 适合服务器部署:很多云服务器厂商都提供 Debian 镜像;
- 资源占用低:适合小型 VPS、边缘节点、低配置机器。
在实际生产环境中,Debian 常用于:
- Web 服务部署;
- 数据库服务器;
- 反向代理服务器;
- 文件存储服务器;
- 自动化脚本运行环境;
- Docker 容器宿主机;
- 内网工具平台。
本文将通过几个案例,模拟一台新 Debian 服务器从初始化到部署服务,再到安全加固和自动备份的完整过程。
二、案例背景
假设我们购买了一台云服务器,系统为:
Debian 12 Bookworm
服务器配置如下:
| 项目 | 配置 |
|---|---|
| CPU | 2 核 |
| 内存 | 2GB |
| 磁盘 | 40GB |
| 系统 | Debian 12 |
| 公网 IP | 你的服务器 IP |
| 用途 | 部署一个 Python Web 服务 |
| Web 服务器 | Nginx |
| 后端服务 | Flask |
| 进程管理 | systemd |
| 防火墙 | UFW |
| 备份方式 | Shell 脚本定时备份 |
目标是完成以下任务:
- 初始化 Debian 系统;
- 创建普通用户并配置 SSH;
- 安装基础软件;
- 配置防火墙;
- 部署 Nginx;
- 部署 Flask 示例服务;
- 使用 systemd 管理后端服务;
- 配置日志轮转;
- 编写自动备份脚本;
- 使用 crontab 定时执行备份。
三、案例一:Debian 系统初始化
刚拿到一台新服务器时,通常需要先更新系统软件包。
1. 更新软件源与系统
apt update
apt upgrade -y
如果你希望同时清理无用软件包,可以执行:
apt autoremove -y
apt autoclean
2. 安装基础工具
生产环境中常用工具包括 curl、wget、vim、git、htop、net-tools、ufw 等。
apt install -y \
curl \
wget \
vim \
git \
htop \
net-tools \
unzip \
tar \
lsof \
ufw \
sudo
3. 查看系统信息
cat /etc/os-release
uname -a
df -h
free -m
示例输出:
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
这些命令可以帮助我们快速确认服务器运行状态。
四、案例二:创建普通用户并配置 SSH 安全登录
在生产环境中,不建议长期使用 root 用户直接登录服务器。更合理的做法是创建一个普通用户,并赋予其 sudo 权限。
1. 创建用户
假设创建用户 deploy:
adduser deploy
然后将用户加入 sudo 组:
usermod -aG sudo deploy
切换到该用户:
su - deploy
测试 sudo 权限:
sudo whoami
如果输出:
root
说明配置成功。
2. 配置 SSH 公钥登录
在本地电脑生成密钥:
ssh-keygen -t ed25519 -C "deploy@example"
将公钥复制到服务器:
ssh-copy-id deploy@你的服务器IP
如果没有 ssh-copy-id,可以手动将本地 ~/.ssh/id_ed25519.pub 内容追加到服务器:
mkdir -p ~/.ssh
vim ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. 修改 SSH 配置
编辑 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
建议修改以下配置:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 22
如果你希望进一步提高安全性,可以修改默认端口,例如:
Port 2222
重启 SSH 服务:
sudo systemctl restart ssh
注意:修改 SSH 配置前,建议保留一个当前登录窗口,不要马上关闭。新开一个终端测试能否正常登录,确认无误后再关闭旧连接,避免把自己锁在服务器外。
五、案例三:配置 UFW 防火墙
UFW 是 Debian/Ubuntu 系统中非常常用的防火墙管理工具,简单易用。
1. 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
表示拒绝所有入站连接,允许所有出站连接。
2. 放行 SSH
如果 SSH 使用默认 22 端口:
sudo ufw allow 22/tcp
如果你修改为 2222 端口:
sudo ufw allow 2222/tcp
3. 放行 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
4. 启用防火墙
sudo ufw enable
查看状态:
sudo ufw status verbose
示例输出:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
六、案例四:部署 Nginx Web 服务
Nginx 是高性能 Web 服务器,也是常见的反向代理服务器。
1. 安装 Nginx
sudo apt install -y nginx
启动服务:
sudo systemctl start nginx
sudo systemctl enable nginx
查看状态:
sudo systemctl status nginx
浏览器访问:
http://你的服务器IP
如果看到默认欢迎页,说明安装成功。
2. Nginx 常用目录说明
| 路径 | 说明 |
|---|---|
/etc/nginx/nginx.conf |
主配置文件 |
/etc/nginx/sites-available/ |
可用站点配置 |
/etc/nginx/sites-enabled/ |
已启用站点配置 |
/var/www/html/ |
默认网站根目录 |
/var/log/nginx/access.log |
访问日志 |
/var/log/nginx/error.log |
错误日志 |
3. 创建静态站点
创建目录:
sudo mkdir -p /var/www/demo
sudo chown -R deploy:deploy /var/www/demo
创建页面:
vim /var/www/demo/index.html
源码如下:
Debian Nginx Demo
Debian Nginx 部署成功
这是一个运行在 Debian 服务器上的 Nginx 静态站点。
当前目录:/var/www/demo
创建 Nginx 配置:
sudo vim /etc/nginx/sites-available/demo
内容如下:
server {
listen 80;
server_name _;
root /var/www/demo;
index index.html;
access_log /var/log/nginx/demo_access.log;
error_log /var/log/nginx/demo_error.log;
location / {
try_files $uri $uri/ =404;
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo
删除默认配置:
sudo rm -f /etc/nginx/sites-enabled/default
测试配置:
sudo nginx -t
重载 Nginx:
sudo systemctl reload nginx
至此,一个简单静态站点已经部署完成。
七、案例五:部署 Python Flask 后端服务
接下来,我们部署一个简单的 Flask 应用,并使用 Nginx 作为反向代理。
1. 安装 Python 环境
sudo apt install -y python3 python3-pip python3-venv
创建项目目录:
sudo mkdir -p /opt/apps/flask-demo
sudo chown -R deploy:deploy /opt/apps/flask-demo
cd /opt/apps/flask-demo
创建虚拟环境:
python3 -m venv venv
source venv/bin/activate
安装依赖:
pip install flask gunicorn
2. 编写 Flask 应用源码
创建文件:
vim app.py
源码如下:
from flask import Flask, jsonify, request
from datetime import datetime
import socket
import os
app = Flask(__name__)
@app.route("/")
def index():
return jsonify({
"message": "Hello Debian!",
"service": "flask-demo",
"hostname": socket.gethostname(),
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
})
@app.route("/health")
def health():
return jsonify({
"status": "ok",
"pid": os.getpid()
})
@app.route("/echo", methods=["POST"])
def echo():
data = request.get_json(silent=True) or {}
return jsonify({
"you_sent": data
})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)
本地测试:
python app.py
另开终端访问:
curl http://127.0.0.1:8000/
如果返回 JSON,说明 Flask 程序正常。
3. 使用 Gunicorn 启动服务
Flask 自带的开发服务器不适合生产环境,因此我们使用 Gunicorn:
gunicorn -w 2 -b 127.0.0.1:8000 app:app
参数说明:
| 参数 | 含义 |
|---|---|
-w 2 |
启动 2 个 worker 进程 |
-b 127.0.0.1:8000 |
绑定本地地址和端口 |
app:app |
前一个 app 是文件名,后一个 app 是 Flask 实例名 |
八、案例六:使用 systemd 管理 Flask 服务
如果手动执行 Gunicorn,一旦终端关闭,服务就会停止。生产环境应使用 systemd 管理服务。
1. 创建 systemd 服务文件
sudo vim /etc/systemd/system/flask-demo.service
内容如下:
[Unit]
Description=Flask Demo Service on Debian
After=network.target
[Service]
User=deploy
Group=deploy
WorkingDirectory=/opt/apps/flask-demo
Environment="PATH=/opt/apps/flask-demo/venv/bin"
ExecStart=/opt/apps/flask-demo/venv/bin/gunicorn -w 2 -b 127.0.0.1:8000 app:app
Restart=always
RestartSec=5
StandardOutput=append:/var/log/flask-demo/output.log
StandardError=append:/var/log/flask-demo/error.log
[Install]
WantedBy=multi-user.target
创建日志目录:
sudo mkdir -p /var/log/flask-demo
sudo chown -R deploy:deploy /var/log/flask-demo
重新加载 systemd:
sudo systemctl daemon-reload
启动服务:
sudo systemctl start flask-demo
sudo systemctl enable flask-demo
查看状态:
sudo systemctl status flask-demo
查看日志:
tail -f /var/log/flask-demo/output.log
tail -f /var/log/flask-demo/error.log
九、案例七:配置 Nginx 反向代理 Flask
现在 Flask 服务监听在本机 127.0.0.1:8000,我们需要让外部用户通过 Nginx 访问。
编辑 Nginx 配置:
sudo vim /etc/nginx/sites-available/flask-demo
内容如下:
server {
listen 80;
server_name your-domain.com;
access_log /var/log/nginx/flask_demo_access.log;
error_log /var/log/nginx/flask_demo_error.log;
location / {
proxy_pass http://127.0.0.1:8000;
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_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}
如果没有域名,可以临时使用:
server_name _;
启用配置:
sudo ln -s /etc/nginx/sites-available/flask-demo /etc/nginx/sites-enabled/flask-demo
如果之前启用了 demo 静态站点,可以根据需要删除:
sudo rm -f /etc/nginx/sites-enabled/demo
测试 Nginx:
sudo nginx -t
重载:
sudo systemctl reload nginx
访问:
curl http://你的服务器IP/
你应该能看到类似结果:
{
"hostname": "debian-server",
"message": "Hello Debian!",
"service": "flask-demo",
"time": "2025-01-01 12:00:00"
}
十、案例八:配置日志轮转
服务运行一段时间后,日志文件会越来越大。如果不处理,可能占满磁盘。因此需要使用 logrotate 做日志轮转。
Debian 一般默认已安装 logrotate,如没有可安装:
sudo apt install -y logrotate
创建配置文件:
sudo vim /etc/logrotate.d/flask-demo
内容如下:
/var/log/flask-demo/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
参数说明:
| 参数 | 说明 |
|---|---|
daily |
每天轮转一次 |
rotate 7 |
保留 7 份历史日志 |
missingok |
日志不存在也不报错 |
notifempty |
空日志不轮转 |
compress |
压缩旧日志 |
delaycompress |
延迟一天压缩 |
copytruncate |
复制后截断原文件,适合进程持续写日志 |
测试配置:
sudo logrotate -d /etc/logrotate.d/flask-demo
强制执行一次:
sudo logrotate -f /etc/logrotate.d/flask-demo
十一、案例九:编写自动备份脚本
生产环境中,备份非常重要。下面编写一个 Shell 脚本,用于备份项目目录和 Nginx 配置。
1. 创建备份目录
sudo mkdir -p /backup
sudo chown -R deploy:deploy /backup
2. 编写备份脚本
创建脚本:
vim /opt/apps/backup_flask_demo.sh
源码如下:
#!/usr/bin/env bash
set -euo pipefail
APP_NAME="flask-demo"
DATE="$(date +'%Y%m%d_%H%M%S')"
BACKUP_ROOT="/backup"
APP_DIR="/opt/apps/flask-demo"
NGINX_CONF="/etc/nginx/sites-available/flask-demo"
LOG_FILE="${BACKUP_ROOT}/backup.log"
BACKUP_FILE="${BACKUP_ROOT}/${APP_NAME}_${DATE}.tar.gz"
echo "[$(date +'%F %T')] Start backup ${APP_NAME}" >> "${LOG_FILE}"
if [ ! -d "${APP_DIR}" ]; then
echo "[$(date +'%F %T')] ERROR: app dir not found: ${APP_DIR}" >> "${LOG_FILE}"
exit 1
fi
tar -czf "${BACKUP_FILE}" \
"${APP_DIR}" \
"${NGINX_CONF}" \
/etc/systemd/system/flask-demo.service
echo "[$(date +'%F %T')] Backup created: ${BACKUP_FILE}" >> "${LOG_FILE}"
# 删除 7 天前的备份文件
find "${BACKUP_ROOT}" -name "${APP_NAME}_*.tar.gz" -type f -mtime +7 -delete
echo "[$(date +'%F %T')] Old backups cleaned" >> "${LOG_FILE}"
echo "[$(date +'%F %T')] Backup finished" >> "${LOG_FILE}"
添加执行权限:
chmod +x /opt/apps/backup_flask_demo.sh
手动测试:
/opt/apps/backup_flask_demo.sh
查看备份文件:
ls -lh /backup
查看日志:
cat /backup/backup.log
3. 配置 crontab 定时执行
编辑计划任务:
crontab -e
添加以下内容:
0 2 * * * /opt/apps/backup_flask_demo.sh
表示每天凌晨 2 点执行备份。
查看当前计划任务:
crontab -l
十二、案例十:一键初始化脚本源码
如果我们经常创建 Debian 服务器,可以写一个一键初始化脚本,减少重复操作。
创建脚本:
vim debian_init.sh
源码如下:
#!/usr/bin/env bash
set -euo pipefail
USERNAME="deploy"
SSH_PORT="22"
echo "==> Updating system..."
apt update
apt upgrade -y
echo "==> Installing packages..."
apt install -y \
sudo \
curl \
wget \
vim \
git \
htop \
net-tools \
unzip \
tar \
lsof \
ufw \
nginx \
python3 \
python3-pip \
python3-venv \
logrotate
echo "==> Creating user: ${USERNAME}"
if id "${USERNAME}" >/dev/null 2>&1; then
echo "User ${USERNAME} already exists."
else
adduser --disabled-password --gecos "" "${USERNAME}"
usermod -aG sudo "${USERNAME}"
fi
echo "==> Configuring UFW..."
ufw default deny incoming
ufw default allow outgoing
ufw allow "${SSH_PORT}/tcp"
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable
echo "==> Enabling nginx..."
systemctl enable nginx
systemctl start nginx
echo "==> Done."
echo "Please configure SSH key login manually for user: ${USERNAME}"
执行:
chmod +x debian_init.sh
sudo ./debian_init.sh
这个脚本适合新服务器的基础初始化,但在生产环境使用时,还应根据业务需求调整。例如是否修改 SSH 端口、是否安装 Docker、是否配置镜像源、是否接入监控系统等。
十三、排查问题常用命令
在 Debian 实战中,排查问题是一项非常重要的能力。下面整理一些高频命令。
1. 查看服务状态
systemctl status nginx
systemctl status flask-demo
2. 查看端口监听
ss -tulnp
或:
netstat -tulnp
3. 查看进程
ps aux | grep gunicorn
4. 查看日志
journalctl -u nginx -n 50
journalctl -u flask-demo -n 50
journalctl -u flask-demo -f
5. 测试 HTTP 请求
curl -I http://127.0.0.1
curl http://127.0.0.1:8000/health
6. 检查 Nginx 配置
sudo nginx -t
7. 查看磁盘空间
df -h
du -sh /var/log/*
8. 查看内存
free -m
9. 查看系统负载
uptime
htop
十四、实际运维中的几点经验
1. 不要忽视日志
很多线上问题并不是突然发生的,而是在日志中早有迹象。例如:
- 接口响应变慢;
- 某个接口频繁报错;
- 磁盘空间逐渐减少;
- 某些 IP 异常频繁访问;
- 后端服务重复重启。
建议至少保留关键服务的访问日志、错误日志和应用日志,并配合 logrotate 控制大小。
2. 不要直接在生产环境裸改配置
修改 Nginx、systemd 或 SSH 配置时,应该遵循:
- 修改前备份;
- 修改后测试;
- 确认无误再重载;
- 保留回滚方案。
例如修改 Nginx 后一定执行:
sudo nginx -t
修改 systemd 后执行:
sudo systemctl daemon-reload
3. 尽量使用普通用户部署应用
应用服务不建议使用 root 运行。本文中的 Flask 服务使用 deploy 用户运行,降低了服务被攻击后造成的破坏范围。
4. 后端服务只监听本机地址
在本文中,Gunicorn 绑定的是:
127.0.0.1:8000
这意味着外部无法直接访问后端端口,只能通过 Nginx 转发。这种方式更安全,也更便于统一处理 HTTPS、日志、限流和反向代理规则。
5. 自动备份必须定期验证
很多人配置了备份,却从未测试恢复。真正出问题时才发现备份文件损坏或缺少关键配置。
建议定期进行恢复演练,确认:
- 备份文件存在;
- 备份内容完整;
- 脚本执行正常;
- 备份日志没有报错;
- 旧备份清理策略合理。
十五、总结
本文通过多个实战案例,完整演示了 Debian 服务器从初始化到部署 Web 服务的基本流程。我们完成了以下内容:
- Debian 系统更新与基础工具安装;
- 创建普通用户并配置 sudo;
- 配置 SSH 安全登录;
- 使用 UFW 配置防火墙;
- 安装并配置 Nginx;
- 编写 Flask 后端服务源码;
- 使用 Gunicorn 运行 Python 应用;
- 使用 systemd 管理后端服务;
- 使用 Nginx 反向代理;
- 配置 logrotate 日志轮转;
- 编写 Shell 自动备份脚本;
- 编写 Debian 一键初始化脚本。
这些内容虽然看起来基础,但都是服务器运维和应用部署中最常见、最实用的技能。对于个人项目、小型企业内部系统、测试环境、云服务器应用部署来说,掌握这些流程已经可以解决大量实际问题。
Debian 的优势在于稳定、可靠、轻量,并且文档资源丰富。只要我们按照规范完成用户权限、安全策略、服务管理、日志处理和备份机制,就可以构建一个相对可靠的服务器运行环境。
在后续实践中,你还可以继续扩展:
- 配置 HTTPS 证书;
- 使用 Docker 部署服务;
- 接入 Prometheus 和 Grafana 监控;
- 配置 fail2ban 防暴力破解;
- 使用 Ansible 批量管理服务器;
- 将备份上传到对象存储;
- 使用 CI/CD 自动发布应用。
真正的 Linux 实战能力,不是只会敲几个命令,而是能够理解每一步背后的目的,并在故障发生时快速定位问题、恢复服务。希望本文能为你使用 Debian 部署和管理服务器提供一份可落地的参考。