上一篇 下一篇 分享链接 返回 返回顶部

从零接手一台 Debian 服务器:初始化、安全加固到 Flask 上线实战指南

发布人:慈云数据-客服中心 发布时间:10小时前 阅读量:4

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 脚本定时备份

目标是完成以下任务:

  1. 初始化 Debian 系统;
  2. 创建普通用户并配置 SSH;
  3. 安装基础软件;
  4. 配置防火墙;
  5. 部署 Nginx;
  6. 部署 Flask 示例服务;
  7. 使用 systemd 管理后端服务;
  8. 配置日志轮转;
  9. 编写自动备份脚本;
  10. 使用 crontab 定时执行备份。

三、案例一:Debian 系统初始化

刚拿到一台新服务器时,通常需要先更新系统软件包。

1. 更新软件源与系统

apt update
apt upgrade -y

如果你希望同时清理无用软件包,可以执行:

apt autoremove -y
apt autoclean

2. 安装基础工具

生产环境中常用工具包括 curlwgetvimgithtopnet-toolsufw 等。

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 配置时,应该遵循:

  1. 修改前备份;
  2. 修改后测试;
  3. 确认无误再重载;
  4. 保留回滚方案。

例如修改 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 部署和管理服务器提供一份可落地的参考。

目录结构
全文