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

Debian 12 服务器上线前必做:从安全加固到 Docker/Nginx 部署全流程指南

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

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:限制认证失败次数;
  • ClientAliveIntervalClientAliveCountMax:控制空闲连接。

在重启 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

二十四、备份建议

生产环境中,备份不是可选项,而是必需项。建议至少覆盖以下内容:

  1. 应用代码;
  2. 数据库数据;
  3. 上传文件;
  4. 配置文件;
  5. SSL 证书;
  6. Docker Compose 文件;
  7. Nginx 配置;
  8. 定时任务脚本。

常用备份目录:

/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 日志限制;
  • [ ] 已配置备份策略;
  • [ ] 已验证服务开机自启;
  • [ ] 已测试服务异常重启;
  • [ ] 已记录部署文档;
  • [ ] 已保存关键配置和访问凭据。

二十六、生产环境部署注意事项

  1. 不要直接在生产环境试错
    重要变更应先在测试环境验证,包括 SSH 配置、防火墙规则、Nginx 配置、数据库迁移等。

  2. 不要关闭当前 SSH 会话后再测试新配置
    修改 SSH 和防火墙时,务必保留一个已登录终端,防止配置错误导致无法登录。

  3. 不要让日志无限增长
    应用日志、Docker 日志、Nginx 日志都应配置轮转或大小限制。

  4. 不要忽视备份恢复演练
    只有能恢复的备份才是真正有效的备份。建议定期做恢复测试。

  5. 不要开放不必要端口
    数据库、Redis、后台管理端口尽量只监听内网或本机地址。

  6. 不要把密钥和密码写入代码仓库
    敏感信息应使用环境变量、密钥管理服务或专门的配置管理方案。

  7. 不要长期使用过期系统和组件
    定期检查安全更新,尤其是 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 服务、容器化应用、反向代理服务器等常见场景。实际使用时,仍需要根据业务规模、安全要求、访问量、数据库类型和云厂商网络环境进行调整。

如果你只记住几个关键点,可以总结为:

  1. 使用普通用户登录,禁止 root 直接 SSH;
  2. SSH 使用密钥认证,关闭密码登录;
  3. 防火墙只开放必要端口;
  4. 系统时间必须同步;
  5. Docker 和应用日志必须限制大小;
  6. 关键配置和数据必须备份;
  7. 所有变更都应先测试再上线。

完成以上步骤后,你的 Debian 服务器就具备了较好的生产环境基础,可以继续部署业务服务、数据库、中间件以及监控系统。

目录结构
全文