Debian 服务器上线手册:从安全加固到一键初始化部署
Debian 生产环境部署指南|一键部署
在企业级应用、Web 服务、数据库服务、容器平台以及自动化运维场景中,Debian 一直是非常受欢迎的 Linux 发行版之一。它以稳定、安全、软件包管理成熟、社区生态完善而著称,尤其适合部署在生产环境中。相比一些更新节奏较快的发行版,Debian 更强调系统长期稳定运行,这对于生产环境来说非常重要。
本文将围绕 Debian 生产环境部署 展开,介绍从系统初始化、安全加固、基础软件安装、网络配置、SSH 加固、防火墙配置、时间同步、日志管理、自动更新、Docker 部署到一键部署脚本的完整流程。文章适合服务器管理员、后端开发者、运维工程师以及希望快速搭建稳定 Debian 生产环境的用户参考。
一、为什么选择 Debian 作为生产环境?
Debian 是一个历史悠久、社区驱动的 Linux 发行版,在服务器领域拥有非常高的认可度。选择 Debian 作为生产环境,主要有以下几个原因:
1. 稳定性强
Debian Stable 分支的软件包经过长期测试,相比追求最新版本的系统,它更注重稳定性。对于线上服务而言,稳定往往比“最新”更重要。
2. 安全维护及时
Debian 拥有专门的安全团队,能够及时发布安全补丁。生产服务器可以通过安全源快速获取漏洞修复。
3. 软件包生态成熟
Debian 使用 apt 作为包管理工具,软件仓库丰富,安装和维护常见服务非常方便。
4. 适合自动化部署
Debian 的系统结构清晰,配置文件规范,适合结合 Shell、Ansible、Terraform、Docker 等工具进行自动化部署。
5. 资源占用低
相比一些桌面化发行版,Debian Server 环境非常轻量,适合云服务器、物理机以及边缘计算设备。
二、生产环境部署前的准备
在正式部署 Debian 生产环境之前,需要先做好基础规划。
1. 推荐系统版本
建议优先选择:
Debian 12 Bookworm
Debian 12 是当前主流稳定版本,适合新项目生产部署。如果已有业务运行在 Debian 11,也可以继续使用,但新环境建议使用 Debian 12。
2. 推荐服务器配置
根据应用规模不同,配置有所区别。以下是通用参考:
| 使用场景 | CPU | 内存 | 磁盘 | 带宽 |
|---|---|---|---|---|
| 小型网站 | 1-2 核 | 1-2 GB | 20-40 GB SSD | 1-5 Mbps |
| 中型 API 服务 | 2-4 核 | 4-8 GB | 40-100 GB SSD | 5-20 Mbps |
| 数据库服务 | 4 核以上 | 8 GB 以上 | 高性能 SSD | 视业务而定 |
| Docker 容器平台 | 4 核以上 | 8 GB 以上 | 100 GB 以上 | 视业务而定 |
3. 推荐磁盘分区
如果使用云服务器,通常默认分区即可。如果是物理机或自建环境,建议将系统与数据分离:
/ 系统分区
/var 日志、缓存、服务数据
/home 用户数据
/data 业务数据
生产环境中,尤其是数据库、日志、文件上传等业务场景,建议将业务数据放在单独的数据盘,例如 /data。
三、系统初始化配置
完成 Debian 安装后,首先需要进行系统初始化。
1. 更新软件源
登录服务器后,先更新软件包索引:
sudo apt update
sudo apt upgrade -y
如果当前用户不是 root,并且没有 sudo 权限,需要先切换 root:
su -
2. 安装基础工具
生产环境常用基础工具包括:
sudo apt install -y \
curl \
wget \
vim \
nano \
git \
unzip \
tar \
htop \
net-tools \
lsof \
ca-certificates \
gnupg \
software-properties-common \
apt-transport-https
这些工具可以帮助我们进行网络测试、文件下载、系统监控、证书校验和软件源管理。
3. 设置主机名
合理的主机名有助于多服务器环境中的识别和管理。
sudo hostnamectl set-hostname prod-debian-01
然后编辑 hosts 文件:
sudo vim /etc/hosts
添加或修改:
127.0.0.1 localhost
127.0.1.1 prod-debian-01
查看当前主机名:
hostnamectl
四、创建普通用户并配置 sudo
生产环境不建议长期使用 root 用户直接登录,应创建普通用户,并给予必要的 sudo 权限。
1. 创建用户
例如创建用户 deploy:
adduser deploy
根据提示设置密码。
2. 添加 sudo 权限
usermod -aG sudo deploy
切换用户测试:
su - deploy
sudo whoami
如果输出:
root
说明 sudo 权限配置成功。
五、SSH 安全加固
SSH 是生产服务器最常见的远程入口,必须重点加固。
1. 修改 SSH 默认端口
默认端口 22 容易被扫描,可以修改为其他端口,例如 22222。
编辑配置文件:
sudo vim /etc/ssh/sshd_config
修改或添加:
Port 22222
2. 禁止 root 远程登录
在同一个配置文件中设置:
PermitRootLogin no
3. 禁用密码登录,使用密钥登录
如果已经配置好 SSH 公钥,建议关闭密码登录:
PasswordAuthentication no
PubkeyAuthentication yes
用户公钥一般放在:
/home/deploy/.ssh/authorized_keys
权限需要正确:
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
4. 重启 SSH 服务
修改完成后,先检查配置:
sudo sshd -t
如果没有输出错误,再重启 SSH:
sudo systemctl restart ssh
注意:修改 SSH 端口和登录方式后,不要立即关闭当前连接。建议新开一个终端测试连接成功后,再退出旧会话,避免把自己锁在服务器外。
六、防火墙配置
Debian 可以使用 ufw 简化防火墙管理。
1. 安装 ufw
sudo apt install -y ufw
2. 放行 SSH 端口
如果 SSH 端口为 22222:
sudo ufw allow 22222/tcp
3. 放行 Web 服务端口
如果部署网站,通常需要开放:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
4. 启用防火墙
sudo ufw enable
查看状态:
sudo ufw status verbose
生产环境建议只开放必要端口。数据库端口如 MySQL 的 3306、PostgreSQL 的 5432,不要直接暴露到公网,除非已经配置严格的访问控制。
七、时间同步配置
时间同步对日志分析、证书校验、分布式系统、数据库一致性都非常重要。
Debian 12 默认支持 systemd-timesyncd,可以直接启用:
sudo timedatectl set-timezone Asia/Shanghai
sudo systemctl enable systemd-timesyncd
sudo systemctl restart systemd-timesyncd
查看时间状态:
timedatectl
如果看到:
System clock synchronized: yes
说明时间同步正常。
八、系统资源限制优化
生产环境中,文件句柄、进程数等限制可能影响高并发服务。
1. 查看当前限制
ulimit -n
如果默认值较低,可以进行调整。
2. 修改 limits.conf
编辑:
sudo vim /etc/security/limits.conf
添加:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
3. systemd 服务限制
对于 systemd 管理的服务,需要在服务文件中单独设置:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
修改后执行:
sudo systemctl daemon-reload
sudo systemctl restart your-service
九、内核参数优化
对于 Web 服务、代理服务、高并发连接场景,可以适当调整内核参数。
编辑:
sudo vim /etc/sysctl.d/99-production.conf
添加以下内容:
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 2097152
vm.swappiness = 10
应用配置:
sudo sysctl --system
说明:
somaxconn:控制监听队列长度;tcp_fin_timeout:减少 FIN-WAIT 时间;ip_local_port_range:扩大本地临时端口范围;swappiness:降低系统使用 swap 的倾向。
不同业务场景参数不完全相同,建议上线前结合压测结果调整。
十、安装 Nginx
Nginx 是生产环境中最常见的 Web 服务器和反向代理组件。
1. 安装 Nginx
sudo apt install -y nginx
2. 启动并设置开机自启
sudo systemctl enable nginx
sudo systemctl start nginx
查看状态:
sudo systemctl status nginx
3. 测试访问
浏览器访问服务器 IP,如果看到 Nginx 默认页面,说明安装成功。
也可以使用 curl 测试:
curl -I http://127.0.0.1
十一、配置 HTTPS 证书
生产环境中,HTTPS 几乎是必选项。可以使用 Let’s Encrypt 免费证书。
1. 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
2. 申请证书
假设域名是:
example.com
执行:
sudo certbot --nginx -d example.com -d www.example.com
根据提示填写邮箱并确认。
3. 测试自动续期
sudo certbot renew --dry-run
Let’s Encrypt 证书有效期为 90 天,Certbot 会配置自动续期任务。
十二、安装 Docker 与 Docker Compose
如果生产环境采用容器化部署,Docker 是非常常见的选择。
1. 安装依赖
sudo apt install -y ca-certificates curl gnupg
2. 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
3. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. 安装 Docker
sudo apt update
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
5. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
查看版本:
docker version
docker compose version
6. 将普通用户加入 docker 组
sudo usermod -aG docker deploy
重新登录后生效。
注意:docker 组用户拥有接近 root 的权限,生产环境中应谨慎授予。
十三、日志管理与磁盘保护
生产环境中,日志如果不加限制,可能占满磁盘,导致服务异常。
1. 使用 journalctl 查看日志
journalctl -xe
查看某个服务日志:
journalctl -u nginx -f
2. 限制 systemd journal 日志大小
编辑:
sudo vim /etc/systemd/journald.conf
设置:
SystemMaxUse=1G
RuntimeMaxUse=512M
MaxRetentionSec=30day
重启:
sudo systemctl restart systemd-journald
3. 配置 logrotate
Debian 默认安装 logrotate。可检查:
ls /etc/logrotate.d/
例如 Nginx 日志轮转配置在:
/etc/logrotate.d/nginx
对于自定义应用,也建议配置日志轮转,避免单个日志文件无限增长。
十四、自动安全更新
生产环境中安全补丁非常重要,可以启用 unattended-upgrades 自动安装安全更新。
1. 安装组件
sudo apt install -y unattended-upgrades apt-listchanges
2. 启用自动更新
sudo dpkg-reconfigure unattended-upgrades
选择:
Yes
3. 检查配置
配置文件通常在:
/etc/apt/apt.conf.d/50unattended-upgrades
可以根据需要控制是否自动重启。对于核心业务服务器,不建议随意自动重启,应该结合维护窗口进行处理。
十五、安装 Fail2ban 防暴力破解
Fail2ban 可以根据日志检测异常登录行为,并自动封禁攻击 IP。
1. 安装 Fail2ban
sudo apt install -y fail2ban
2. 创建本地配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑:
sudo vim /etc/fail2ban/jail.local
找到 SSH 配置,示例:
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
3. 启动服务
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
十六、备份策略设计
任何生产环境都必须有备份方案。没有备份的系统不是真正的生产系统。
1. 需要备份的内容
通常包括:
- 数据库数据;
- 用户上传文件;
- 应用配置文件;
- Nginx 配置;
- Docker Compose 文件;
- SSL 证书;
- 定时任务;
- 系统关键配置。
2. 备份原则
建议遵循 3-2-1 备份原则:
3 份数据副本
2 种不同存储介质
1 份异地备份
3. 简单备份示例
例如备份 /data 和 /etc/nginx:
sudo tar -czf /backup/server-$(date +%F).tar.gz /data /etc/nginx
可以结合 crontab 定期执行:
crontab -e
添加:
0 3 * * * /usr/local/bin/backup.sh
生产环境建议将备份上传到对象存储、远程服务器或专用备份系统中。
十七、监控与告警
生产环境不仅要能运行,还要能及时发现问题。
1. 基础监控指标
至少应监控:
- CPU 使用率;
- 内存使用率;
- 磁盘使用率;
- 磁盘 I/O;
- 网络流量;
- 服务端口;
- 进程状态;
- HTTP 状态码;
- 数据库连接数;
- 容器状态。
2. 常见监控方案
可以选择:
- Prometheus + Grafana;
- Zabbix;
- Netdata;
- VictoriaMetrics;
- 云厂商监控;
- Uptime Kuma。
对于中小型项目,Uptime Kuma 非常适合做网站可用性监控;对于复杂系统,Prometheus + Grafana 更适合指标采集和可视化。
十八、一键部署脚本
下面提供一个适用于 Debian 12 的基础生产环境一键部署脚本。该脚本主要完成以下操作:
- 更新系统;
- 安装基础工具;
- 设置时区;
- 安装 UFW;
- 开放 SSH、HTTP、HTTPS 端口;
- 安装 Nginx;
- 安装 Fail2ban;
- 安装 Docker;
- 配置系统参数;
- 启用常用服务。
使用前请根据实际情况修改
SSH_PORT和USERNAME。
一键部署脚本
创建脚本:
vim debian-production-init.sh
写入以下内容:
#!/usr/bin/env bash
set -e
USERNAME="deploy"
SSH_PORT="22222"
TIMEZONE="Asia/Shanghai"
HOSTNAME="prod-debian-01"
echo "========== Debian Production Init =========="
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 root 用户执行此脚本"
exit 1
fi
echo "[1/12] 更新系统软件包..."
apt update
apt upgrade -y
echo "[2/12] 安装基础工具..."
apt install -y \
sudo \
curl \
wget \
vim \
nano \
git \
unzip \
tar \
htop \
net-tools \
lsof \
ca-certificates \
gnupg \
apt-transport-https \
software-properties-common \
ufw \
fail2ban \
unattended-upgrades \
apt-listchanges
echo "[3/12] 设置主机名..."
hostnamectl set-hostname "${HOSTNAME}"
echo "[4/12] 设置时区..."
timedatectl set-timezone "${TIMEZONE}"
systemctl enable systemd-timesyncd || true
systemctl restart systemd-timesyncd || true
echo "[5/12] 创建普通用户..."
if id "${USERNAME}" >/dev/null 2>&1; then
echo "用户 ${USERNAME} 已存在,跳过创建"
else
adduser --gecos "" "${USERNAME}"
fi
usermod -aG sudo "${USERNAME}"
echo "[6/12] 配置 SSH..."
SSHD_CONFIG="/etc/ssh/sshd_config"
cp "${SSHD_CONFIG}" "${SSHD_CONFIG}.bak.$(date +%F-%H%M%S)"
sed -i "s/^#\?Port .*/Port ${SSH_PORT}/" "${SSHD_CONFIG}" || true
if ! grep -q "^Port ${SSH_PORT}" "${SSHD_CONFIG}"; then
echo "Port ${SSH_PORT}" >> "${SSHD_CONFIG}"
fi
sed -i "s/^#\?PermitRootLogin .*/PermitRootLogin no/" "${SSHD_CONFIG}" || true
sed -i "s/^#\?PubkeyAuthentication .*/PubkeyAuthentication yes/" "${SSHD_CONFIG}" || true
sshd -t
systemctl restart ssh
echo "[7/12] 配置防火墙 UFW..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow "${SSH_PORT}/tcp"
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
echo "[8/12] 安装 Nginx..."
apt install -y nginx
systemctl enable nginx
systemctl restart nginx
echo "[9/12] 配置 Fail2ban..."
cat > /etc/fail2ban/jail.local < /etc/sysctl.d/99-production.conf < /etc/apt/sources.list.d/docker.list
apt update
apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
systemctl enable docker
systemctl restart docker
usermod -aG docker "${USERNAME}"
echo "[12/12] 启用自动安全更新..."
dpkg-reconfigure -f noninteractive unattended-upgrades || true
echo "========== 部署完成 =========="
echo "普通用户: ${USERNAME}"
echo "SSH 端口: ${SSH_PORT}"
echo "请确认可以通过新端口登录后,再关闭当前终端。"
echo "示例:ssh ${USERNAME}@服务器IP -p ${SSH_PORT}"
赋予执行权限:
chmod +x debian-production-init.sh
执行脚本:
sudo ./debian-production-init.sh
十九、一键脚本使用注意事项
虽然一键部署脚本可以显著提高效率,但生产环境仍应谨慎使用。
1. 执行前先审查脚本
不要直接运行来源不明的脚本。脚本可能修改 SSH、防火墙、用户权限、软件源等关键配置。
2. 确保云服务器安全组已放行端口
如果你的云服务器使用安全组,还需要在云平台控制台放行 SSH 新端口,例如 22222,否则即使系统防火墙放行,也无法连接。
3. 不要立刻关闭当前 SSH 会话
修改 SSH 配置后,应重新打开一个终端测试登录:
ssh deploy@服务器IP -p 22222
确认可登录后,再退出旧会话。
4. 密钥登录建议手动配置
脚本没有自动关闭密码登录,因为如果没有提前配置公钥,可能导致无法登录。建议确认公钥登录成功后,再手动关闭密码登录:
PasswordAuthentication no
然后重启 SSH:
sudo systemctl restart ssh
二十、生产环境部署后的检查清单
部署完成后,建议按以下清单逐项检查。
1. 系统版本
cat /etc/debian_version
2. 服务状态
systemctl status ssh
systemctl status nginx
systemctl status docker
systemctl status fail2ban
3. 防火墙状态
sudo ufw status verbose
4. 端口监听
ss -tulnp
5. 磁盘空间
df -h
6. 内存状态
free -h
7. 系统负载
uptime
8. Docker 状态
docker info
docker compose version
二十一、常见问题排查
1. 修改 SSH 端口后无法登录
可能原因:
- 云服务器安全组未放行新端口;
- UFW 未放行新端口;
- SSH 配置文件写错;
- SSH 服务未正常重启;
- 客户端连接仍使用默认 22 端口。
排查命令:
sudo sshd -t
sudo systemctl status ssh
sudo ufw status
ss -tulnp | grep ssh
2. Docker 安装失败
可能原因:
- 网络无法访问 Docker 官方源;
- GPG 密钥配置失败;
- Debian 版本过旧;
- 软件源缓存异常。
可尝试:
sudo apt update
sudo apt install -f
如果服务器在国内网络环境,可能需要使用镜像源。
3. Nginx 启动失败
检查配置:
sudo nginx -t
查看日志:
journalctl -u nginx -xe
常见原因是端口被占用:
sudo ss -tulnp | grep ':80'
4. 磁盘被日志占满
查看大文件:
sudo du -ah /var/log | sort -rh | head -20
清理 journal 日志:
sudo journalctl --vacuum-time=7d
或限制大小:
sudo journalctl --vacuum-size=1G
二十二、生产环境安全建议
最后,总结一些关键安全建议:
- 禁止 root 远程登录;
- 使用 SSH 密钥登录;
- 修改默认 SSH 端口;
- 只开放必要端口;
- 数据库不要直接暴露公网;
- 定期安装安全补丁;
- 配置 Fail2ban;
- 配置日志轮转;
- 建立自动备份机制;
- 对重要服务配置监控告警;
- 使用 HTTPS;
- 对 Docker 权限进行严格控制;
- 定期检查系统用户和登录记录;
- 对生产配置文件进行版本管理;
- 上线前进行压测和恢复演练。
结语
Debian 是一个非常适合作为生产环境的 Linux 发行版。它稳定、可靠、资源占用低,并且拥有成熟的软件包管理体系。一个合格的生产环境,不只是能安装软件和启动服务,还应该具备安全加固、日志管理、备份恢复、监控告警、故障排查和自动化部署能力。
本文从 Debian 系统初始化讲起,覆盖了用户管理、SSH 加固、防火墙、时间同步、系统优化、Nginx、HTTPS、Docker、Fail2ban、日志管理、自动更新、备份策略以及一键部署脚本等核心内容。你可以基于本文提供的方案快速完成一台 Debian 生产服务器的基础初始化,也可以根据业务特点继续扩展数据库、中间件、CI/CD、容器编排和监控体系。
对于生产环境而言,自动化部署只是第一步,持续维护、持续监控和持续优化才是保障系统长期稳定运行的关键。