Debian 12 服务器上线前必做:从安全加固到 Docker/Nginx 部署全流程指南
Debian 生产环境部署指南|附完整命令
Debian 以稳定、安全、软件包管理成熟著称,是生产环境中非常常见的 Linux 发行版之一。相比一些更新节奏更快的发行版,Debian 更适合对稳定性要求较高的服务器场景,例如 Web 服务、数据库服务、缓存服务、反向代理、内部业务系统、CI/CD 节点等。
本文将以 Debian 12 Bookworm 为示例,整理一套较完整的生产环境部署流程,内容涵盖系统初始化、安全加固、用户管理、SSH 配置、防火墙、时间同步、基础软件安装、Swap 配置、日志管理、系统优化、Docker 部署、Nginx 部署以及常用运维命令。
说明:本文命令默认使用
root用户执行。如果你使用普通用户,请在命令前添加sudo。
一、系统环境说明
本文示例环境如下:
| 项目 | 示例 |
|---|---|
| 操作系统 | Debian 12 Bookworm |
| 架构 | x86_64 |
| 用户 | root / deploy |
| Web 服务 | Nginx |
| 容器环境 | Docker |
| 防火墙 | UFW |
| 时间同步 | systemd-timesyncd / chrony |
| SSH 端口 | 建议修改为非默认端口 |
查看当前系统版本:
cat /etc/os-release
查看内核版本:
uname -a
查看 CPU、内存信息:
lscpu
free -h
查看磁盘信息:
lsblk
df -h
二、首次登录服务器
一般云服务器创建完成后,会通过以下方式登录:
ssh root@服务器IP
例如:
ssh root@192.168.1.100
如果云厂商使用密钥登录:
ssh -i /path/to/private_key root@服务器IP
首次登录后,建议先确认服务器基本信息:
hostname
whoami
pwd
ip addr
三、更新系统软件包
生产环境部署前,第一步应更新软件包索引,并升级已有软件。
apt update
apt upgrade -y
如果需要处理内核或关键系统包升级,可以执行:
apt full-upgrade -y
清理无用依赖:
apt autoremove -y
apt autoclean
安装常用基础工具:
apt install -y \
vim \
curl \
wget \
git \
unzip \
zip \
tar \
htop \
net-tools \
lsof \
bash-completion \
ca-certificates \
gnupg \
apt-transport-https \
software-properties-common
说明:
curl/wget:用于下载文件或调用接口;vim:常用文本编辑器;htop:更直观地查看系统资源;lsof:查看端口和文件占用;net-tools:提供netstat等传统网络命令;ca-certificates:HTTPS 证书相关;gnupg:添加第三方软件源时常用。
四、设置主机名
生产环境建议为服务器设置清晰的主机名,例如:
hostnamectl set-hostname prod-web-01
查看结果:
hostnamectl
修改 /etc/hosts:
vim /etc/hosts
示例内容:
127.0.0.1 localhost
127.0.1.1 prod-web-01
如果服务器有内网 IP,也可以写入:
10.0.0.10 prod-web-01
五、创建普通运维用户
生产环境不建议长期直接使用 root 登录。建议创建普通用户,并授予 sudo 权限。
创建用户:
adduser deploy
根据提示设置密码。
安装 sudo:
apt install -y sudo
将用户加入 sudo 组:
usermod -aG sudo deploy
验证用户:
su - deploy
sudo whoami
如果输出为:
root
说明 sudo 权限正常。
六、配置 SSH 密钥登录
在本地电脑生成 SSH 密钥:
ssh-keygen -t ed25519 -C "deploy@production"
如果旧系统不支持 ed25519,可使用 RSA:
ssh-keygen -t rsa -b 4096 -C "deploy@production"
将公钥上传到服务器:
ssh-copy-id deploy@服务器IP
如果没有 ssh-copy-id,可以手动复制:
mkdir -p /home/deploy/.ssh
vim /home/deploy/.ssh/authorized_keys
粘贴本地公钥内容后,修正权限:
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
测试登录:
ssh deploy@服务器IP
七、加固 SSH 配置
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config
建议配置如下:
Port 22222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
配置说明:
Port 22222:修改默认 SSH 端口,减少暴力扫描;PermitRootLogin no:禁止 root 直接登录;PasswordAuthentication no:禁止密码登录,只允许密钥登录;MaxAuthTries 3:限制认证失败次数;ClientAliveInterval和ClientAliveCountMax:控制空闲连接。
在重启 SSH 前,一定要先检查配置是否正确:
sshd -t
如果没有输出,说明配置语法正常。
重启 SSH:
systemctl restart ssh
或者:
systemctl restart sshd
注意:修改 SSH 端口后,不要立即关闭当前终端。请另开一个终端测试新端口是否能登录。
测试新端口:
ssh -p 22222 deploy@服务器IP
八、配置防火墙 UFW
安装 UFW:
apt install -y ufw
允许新的 SSH 端口:
ufw allow 22222/tcp
如果服务器需要开放 HTTP 和 HTTPS:
ufw allow 80/tcp
ufw allow 443/tcp
启用防火墙:
ufw enable
查看状态:
ufw status verbose
示例输出:
Status: active
To Action From
-- ------ ----
22222/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
如果需要删除规则:
ufw status numbered
ufw delete 规则编号
例如:
ufw delete 2
九、配置系统时间与时区
生产环境时间必须准确,否则会影响日志分析、证书校验、定时任务、数据库同步等。
查看当前时间:
timedatectl
设置时区为上海:
timedatectl set-timezone Asia/Shanghai
启用时间同步:
timedatectl set-ntp true
查看状态:
timedatectl status
如果希望使用 chrony:
apt install -y chrony
systemctl enable chrony
systemctl start chrony
查看同步源:
chronyc sources -v
十、配置 Swap
如果服务器内存较小,例如 1GB、2GB,可以配置 Swap 防止内存耗尽时进程被直接杀死。但 Swap 不能替代物理内存,生产环境仍建议根据业务合理配置内存。
查看当前 Swap:
swapon --show
free -h
创建 2GB Swap 文件:
fallocate -l 2G /swapfile
如果 fallocate 不可用,可使用:
dd if=/dev/zero of=/swapfile bs=1M count=2048
设置权限:
chmod 600 /swapfile
格式化为 Swap:
mkswap /swapfile
启用 Swap:
swapon /swapfile
写入 /etc/fstab,实现开机自动挂载:
echo '/swapfile none swap sw 0 0' >> /etc/fstab
调整 swappiness:
sysctl vm.swappiness=10
永久生效:
echo 'vm.swappiness=10' >> /etc/sysctl.conf
查看结果:
free -h
swapon --show
十一、系统内核与网络参数优化
生产环境可以根据业务情况进行基础优化。编辑配置文件:
vim /etc/sysctl.d/99-production.conf
写入以下内容:
fs.file-max = 1000000
net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 10
使配置生效:
sysctl -p /etc/sysctl.d/99-production.conf
查看某个参数:
sysctl net.ipv4.tcp_fin_timeout
注意:内核参数优化没有万能模板,应结合实际业务、连接数、网络环境和应用类型调整。不要盲目复制线上高并发参数。
十二、配置文件句柄限制
高并发服务可能需要提高文件句柄限制。
编辑文件:
vim /etc/security/limits.conf
添加:
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
编辑 systemd 默认限制:
vim /etc/systemd/system.conf
找到或添加:
DefaultLimitNOFILE=65535
编辑用户级 systemd 配置:
vim /etc/systemd/user.conf
添加:
DefaultLimitNOFILE=65535
重新加载:
systemctl daemon-reexec
查看当前限制:
ulimit -n
十三、安装并配置 Fail2ban
Fail2ban 可以根据日志自动封禁恶意 IP,常用于防止 SSH 暴力破解。
安装:
apt install -y fail2ban
复制配置:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑配置:
vim /etc/fail2ban/jail.local
找到 [sshd] 部分,示例:
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 10m
bantime = 1h
启动服务:
systemctl enable fail2ban
systemctl restart fail2ban
查看状态:
fail2ban-client status
fail2ban-client status sshd
手动解封 IP:
fail2ban-client set sshd unbanip 1.2.3.4
十四、安装 Docker
Docker 是生产环境中常用的容器运行平台。建议使用官方源安装。
卸载旧版本:
apt remove -y docker docker-engine docker.io containerd runc
安装依赖:
apt install -y ca-certificates curl gnupg
创建 keyrings 目录:
install -m 0755 -d /etc/apt/keyrings
添加 Docker GPG Key:
curl -fsSL https://download.docker.com/linux/debian/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置权限:
chmod a+r /etc/apt/keyrings/docker.gpg
添加 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" \
> /etc/apt/sources.list.d/docker.list
更新索引:
apt update
安装 Docker:
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
设置开机自启:
systemctl enable docker
systemctl start docker
查看版本:
docker version
docker compose version
测试运行:
docker run --rm hello-world
将 deploy 用户加入 docker 组:
usermod -aG docker deploy
重新登录后验证:
docker ps
十五、配置 Docker 日志限制
生产环境中,Docker 容器日志如果不限制,可能会占满磁盘。
创建或编辑 Docker 配置:
vim /etc/docker/daemon.json
写入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启 Docker:
systemctl daemon-reload
systemctl restart docker
查看 Docker 配置:
docker info
十六、安装 Nginx
Nginx 常用于静态资源服务、反向代理和负载均衡。
安装:
apt install -y nginx
启动并设置开机自启:
systemctl enable nginx
systemctl start nginx
查看状态:
systemctl status nginx
查看版本:
nginx -v
测试配置:
nginx -t
重载配置:
systemctl reload nginx
十七、Nginx 反向代理示例
创建站点配置:
vim /etc/nginx/sites-available/example.com
写入:
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Real-IP $remote_addr;
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 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
创建软链接启用站点:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
删除默认站点:
rm -f /etc/nginx/sites-enabled/default
检查配置:
nginx -t
重载 Nginx:
systemctl reload nginx
十八、配置 HTTPS 证书
可以使用 Certbot 申请 Let’s Encrypt 免费证书。
安装 Certbot:
apt install -y certbot python3-certbot-nginx
申请证书:
certbot --nginx -d example.com -d www.example.com
查看证书:
certbot certificates
测试自动续期:
certbot renew --dry-run
Let’s Encrypt 证书有效期通常为 90 天,Certbot 会配置自动续期任务。可以查看 systemd timer:
systemctl list-timers | grep certbot
十九、配置日志轮转
Debian 默认使用 logrotate 管理日志轮转。查看 Nginx 日志轮转配置:
cat /etc/logrotate.d/nginx
可以根据业务需要调整,例如:
vim /etc/logrotate.d/myapp
写入:
/var/log/myapp/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
}
测试配置:
logrotate -t /etc/logrotate.conf
强制执行一次:
logrotate -f /etc/logrotate.conf
二十、配置定时任务
查看当前用户定时任务:
crontab -l
编辑定时任务:
crontab -e
示例:每天凌晨 3 点执行备份脚本:
0 3 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
查看系统级定时任务目录:
ls -lah /etc/cron.d/
ls -lah /etc/cron.daily/
建议生产环境定时任务必须记录日志,避免任务失败后无从排查。
二十一、部署一个 Docker Compose 示例应用
创建目录:
mkdir -p /opt/apps/demo
cd /opt/apps/demo
创建 docker-compose.yml:
vim docker-compose.yml
示例内容:
services:
web:
image: nginx:stable
container_name: demo-nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
创建测试页面:
mkdir -p html
echo 'Hello Debian Production
' > html/index.html
启动服务:
docker compose up -d
查看容器:
docker ps
查看日志:
docker logs -f demo-nginx
访问测试:
curl http://127.0.0.1:8080
停止服务:
docker compose down
二十二、常用服务管理命令
查看服务状态:
systemctl status nginx
systemctl status docker
systemctl status ssh
启动服务:
systemctl start nginx
停止服务:
systemctl stop nginx
重启服务:
systemctl restart nginx
重载配置:
systemctl reload nginx
设置开机自启:
systemctl enable nginx
取消开机自启:
systemctl disable nginx
查看开机自启服务:
systemctl list-unit-files --type=service | grep enabled
二十三、常用排障命令
查看端口监听:
ss -tunlp
或:
netstat -tunlp
查看某个端口占用:
lsof -i:80
查看系统日志:
journalctl -xe
查看某服务日志:
journalctl -u nginx -f
查看最近启动日志:
journalctl -b
查看磁盘使用:
df -h
du -sh /*
查找大文件:
find / -type f -size +500M 2>/dev/null
查看内存:
free -h
查看进程:
ps aux --sort=-%mem | head
ps aux --sort=-%cpu | head
查看网络连接:
ss -antp
二十四、备份建议
生产环境中,备份不是可选项,而是必需项。建议至少覆盖以下内容:
- 应用代码;
- 数据库数据;
- 上传文件;
- 配置文件;
- SSL 证书;
- Docker Compose 文件;
- Nginx 配置;
- 定时任务脚本。
常用备份目录:
/etc/nginx
/etc/ssh
/etc/docker
/opt/apps
/var/www
/home/deploy
示例备份命令:
mkdir -p /backup
tar -czf /backup/etc-nginx-$(date +%F).tar.gz /etc/nginx
tar -czf /backup/apps-$(date +%F).tar.gz /opt/apps
如果需要远程同步,可使用 rsync:
rsync -avz /backup/ deploy@备份服务器IP:/backup/prod-web-01/
二十五、安全检查清单
部署完成后,建议逐项检查:
- [ ] 系统软件包已更新;
- [ ] 已创建普通用户;
- [ ] 已禁用 root SSH 登录;
- [ ] 已禁用 SSH 密码登录;
- [ ] SSH 端口已修改;
- [ ] 防火墙规则已启用;
- [ ] 仅开放必要端口;
- [ ] 已配置时间同步;
- [ ] 已配置日志轮转;
- [ ] 已配置 Docker 日志限制;
- [ ] 已配置备份策略;
- [ ] 已验证服务开机自启;
- [ ] 已测试服务异常重启;
- [ ] 已记录部署文档;
- [ ] 已保存关键配置和访问凭据。
二十六、生产环境部署注意事项
-
不要直接在生产环境试错
重要变更应先在测试环境验证,包括 SSH 配置、防火墙规则、Nginx 配置、数据库迁移等。 -
不要关闭当前 SSH 会话后再测试新配置
修改 SSH 和防火墙时,务必保留一个已登录终端,防止配置错误导致无法登录。 -
不要让日志无限增长
应用日志、Docker 日志、Nginx 日志都应配置轮转或大小限制。 -
不要忽视备份恢复演练
只有能恢复的备份才是真正有效的备份。建议定期做恢复测试。 -
不要开放不必要端口
数据库、Redis、后台管理端口尽量只监听内网或本机地址。 -
不要把密钥和密码写入代码仓库
敏感信息应使用环境变量、密钥管理服务或专门的配置管理方案。 -
不要长期使用过期系统和组件
定期检查安全更新,尤其是 OpenSSL、OpenSSH、Nginx、Docker、数据库等关键组件。
二十七、一键初始化脚本示例
以下脚本可作为基础初始化参考,执行前请根据实际情况修改 SSH 端口、用户名等参数。
创建脚本:
vim init-debian-prod.sh
写入:
#!/bin/bash
set -e
SSH_PORT=22222
NEW_USER=deploy
TIMEZONE=Asia/Shanghai
echo "==> 更新系统"
apt update
apt upgrade -y
apt install -y sudo vim curl wget git unzip zip tar htop net-tools lsof \
bash-completion ca-certificates gnupg apt-transport-https ufw fail2ban
echo "==> 设置时区"
timedatectl set-timezone ${TIMEZONE}
timedatectl set-ntp true
echo "==> 创建用户"
if id "${NEW_USER}" >/dev/null 2>&1; then
echo "用户 ${NEW_USER} 已存在"
else
adduser ${NEW_USER}
usermod -aG sudo ${NEW_USER}
fi
echo "==> 配置 SSH"
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%H%M%S)
sed -i "s/^#\?Port .*/Port ${SSH_PORT}/" /etc/ssh/sshd_config
sed -i "s/^#\?PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#\?PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#\?PubkeyAuthentication .*/PubkeyAuthentication yes/" /etc/ssh/sshd_config
sshd -t
echo "==> 配置防火墙"
ufw allow ${SSH_PORT}/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
echo "==> 配置 Fail2ban"
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local || true
systemctl enable fail2ban
systemctl restart fail2ban
echo "==> 重启 SSH"
systemctl restart ssh || systemctl restart sshd
echo "==> 初始化完成"
echo "请使用以下命令测试登录:"
echo "ssh -p ${SSH_PORT} ${NEW_USER}@服务器IP"
赋予执行权限:
chmod +x init-debian-prod.sh
执行:
bash init-debian-prod.sh
注意:该脚本会禁用密码登录,因此执行前必须确保目标用户已经配置好 SSH 公钥,否则可能导致无法登录服务器。
总结
Debian 生产环境部署的核心目标是:稳定、安全、可维护、可恢复。一台服务器并不是安装好应用就算部署完成,还需要做好系统更新、用户权限、SSH 加固、防火墙、时间同步、日志轮转、备份策略和监控排障。
本文提供的是一套通用生产环境初始化方案,适合 Web 服务、容器化应用、反向代理服务器等常见场景。实际使用时,仍需要根据业务规模、安全要求、访问量、数据库类型和云厂商网络环境进行调整。
如果你只记住几个关键点,可以总结为:
- 使用普通用户登录,禁止 root 直接 SSH;
- SSH 使用密钥认证,关闭密码登录;
- 防火墙只开放必要端口;
- 系统时间必须同步;
- Docker 和应用日志必须限制大小;
- 关键配置和数据必须备份;
- 所有变更都应先测试再上线。
完成以上步骤后,你的 Debian 服务器就具备了较好的生产环境基础,可以继续部署业务服务、数据库、中间件以及监控系统。