Linux服务器入门教程

结论: Linux 服务器入门只需掌握四件事——选一个发行版(新手推荐 Ubuntu 24.04 LTS)、完成首次初始化(换源、建 sudo 用户、配 SSH 密钥、设时区)、记住二十来条常用命令、理解 Shell 的基本语法。云上 90% 的服务器跑的是 Linux,本文把所有命令按"文件、进程、网络、权限、包管理"分类列出,可直接照抄执行。

第一次登录 Linux 服务器,黑底白字的命令行界面往往让人发怵:没有图形界面,鼠标不起作用,一切靠敲命令。但 Linux 服务器的逻辑其实非常清晰——一切皆文件、一切靠命令、一切可脚本化。熟悉之后你会发现,批量管理 100 台 Linux 服务器的效率远高于逐台点击图形界面。本文假定你拿到的是一台全新的云服务器(Ubuntu 24.04 LTS 或 Rocky Linux 9),从发行版选择讲到日常运维命令,全程命令可直接复制。

一、发行版怎么选?Ubuntu、Debian、Rocky、AlmaLinux 对比

先给结论:新手选 Ubuntu,追求稳定与轻量选 Debian,需要 RHEL 兼容性和长生命周期选 Rocky Linux 或 AlmaLinux。

Linux 发行版(Distribution)本质上是"Linux 内核 + 软件包集合 + 包管理器"的组合。服务器领域主要有两大派系:

发行版包管理器支持周期特点适合场景
Ubuntu Server 24.04 LTSapt / dpkg5 年(可延至 10 年)教程最多、软件最新、云厂商默认镜像新手、Web 应用、容器、AI
Debian 12/13apt / dpkg约 5 年极其稳定、包版本保守、资源占用低长期稳定运行的基础服务
Rocky Linux 9dnf / rpm10 年Red Hat Enterprise Linux 的下游重建版,二进制兼容 RHEL企业环境、需要 RHEL 生态
AlmaLinux 9dnf / rpm10 年同为 RHEL 下游重建版,由社区基金会运营替代 CentOS 的企业场景
CentOS Stream 9dnf / rpm滚动RHEL 的上游开发分支,更新更快想提前体验 RHEL 新特性的场景
openEuler / 国产发行版dnf / apt视版本信创合规、国产硬件适配政企信创项目

几条实用建议:

  • CentOS Linux 7 已于 2024 年停止维护,新项目不要再选;存量系统应迁移到 Rocky Linux、AlmaLinux 或其他替代发行版。
  • 不要追新版本,服务器选 LTS(Long Term Support,长期支持)版本,如 Ubuntu 24.04 LTS、Rocky Linux 9。
  • 一台机器上不要混用 apt 和 dnf,包管理器由发行版决定,混用会破坏系统。

确认自己的系统版本:

bash
cat /etc/os-release
uname -a
hostnamectl

二、首次登录与 SSH 配置

先给结论:第一次登录用 root + 密码,登录后立刻创建普通用户、配置 SSH 密钥、禁用 root 密码登录,这是 Linux 服务器安全的第一道门槛。

从本地连上服务器

bash
# 首次用密码登录(默认 22 端口)
ssh root@你的公网IP

# 指定端口
ssh -p 2222 root@你的公网IP

# 首次连接会提示确认指纹,输入 yes;之后输入密码即可

Windows 用户可以用 PowerShell 自带的 ssh(Windows 10 1809 之后内置),或者用 Xshell、PuTTY、FinalShell 等图形客户端。

在本地生成密钥对并上传

bash
# 本地执行:生成 ED25519 密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"

# 把公钥上传到服务器(会自动写入 ~/.ssh/authorized_keys)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@你的公网IP

# Windows 没有 ssh-copy-id 时,用这条代替
cat ~/.ssh/id_ed25519.pub | ssh root@你的公网IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

此后登录就不需要输入密码了:ssh root@你的公网IP。

配置 SSH 客户端别名(可选但很实用)

bash
# 编辑 ~/.ssh/config
Host web01
    HostName 你的公网IP
    Port 2222
    User deploy
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

# 之后只需输入 ssh web01 即可登录

三、初始化:换源、建用户、时区、swap

先给结论:新系统上线前必须做的初始化有六件:更新软件源、创建 sudo 用户、配置 SSH 密钥登录、设置时区与时间同步、按需配置 swap、做基础安全加固。

更换软件源(国内机器建议换成国内镜像)

bash
# Ubuntu 24.04 备份并替换为阿里云镜像源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo tee /etc/apt/sources.list > /dev/null <<'EOF'
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
EOF

sudo apt update && sudo apt upgrade -y
bash
# Rocky Linux 9 替换为国内镜像(以阿里云为例)
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
         -i.bak /etc/yum.repos.d/rocky*.repo

sudo dnf makecache && sudo dnf update -y

创建 sudo 用户并配置权限

bash
# 创建用户(交互式会提示设置密码)
adduser deploy

# 加入 sudo 组(Ubuntu / Debian)
usermod -aG sudo deploy

# Rocky / AlmaLinux 对应的是 wheel 组
usermod -aG wheel deploy

# 免密码 sudo(可选,方便自动化)
echo "deploy ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/deploy
sudo chmod 440 /etc/sudoers.d/deploy

# 验证:切到新用户并执行 sudo
su - deploy
sudo whoami    # 应输出 root

禁用 root 密码登录并改端口

bash
sudo vim /etc/ssh/sshd_config
bash
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
AllowUsers deploy
ClientAliveInterval 300
ClientAliveCountMax 2
bash
# 语法检查后重启(注意:先另开窗口测试新用户能登录!)
sudo sshd -t
sudo systemctl restart ssh      # Ubuntu / Debian
# sudo systemctl restart sshd   # Rocky / AlmaLinux

务必先测试 ssh -p 2222 deploy@你的IP 登录成功,再关闭当前的 root 会话。

设置时区与时间同步

bash
sudo timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp true
timedatectl status

# Ubuntu 24.04 使用 systemd-timesyncd
systemctl status systemd-timesyncd

# 需要更精确时安装 chrony(建议生产环境使用)
sudo apt install -y chrony
sudo systemctl enable --now chrony
chronyc sources -v

时间不同步会导致日志错乱、HTTPS 证书校验失败、定时任务错位、数据库主从异常,是新手最容易忽略的问题之一。

配置 swap

bash
# 创建 4GB 交换文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 写入 fstab 实现开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 调整 swappiness(内存 8GB 以上建议设为 10)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 验证
free -h
swapon --show

四、包管理与软件安装

先给结论:记住 apt(Debian 系)或 dnf(RHEL 系)这六个子命令就够了:update、upgrade、install、remove、search、autoremove。

操作Debian / Ubuntu(apt)Rocky / AlmaLinux(dnf)
更新索引apt updatednf check-update / dnf makecache
升级软件apt upgrade -ydnf upgrade -y
安装软件apt install -y nginxdnf install -y nginx
卸载软件apt remove -y nginxdnf remove -y nginx
搜索软件apt search nginxdnf search nginx
查看信息apt show nginxdnf info nginx
清理无用包apt autoremove -y && apt cleandnf autoremove -y && dnf clean all
查找文件属于哪个包dpkg -S /usr/sbin/nginxrpm -qf /usr/sbin/nginx
查看已装包`dpkg -l \grep nginx``rpm -qa \grep nginx`

安装常用运维工具套装:

bash
# Ubuntu / Debian
sudo apt install -y curl wget vim git htop iotop iftop net-tools \
  lsof rsync unzip zip tree tmux jq sysstat smartmontools \
  software-properties-common ca-certificates gnupg

# Rocky / AlmaLinux(需要先装 EPEL 源)
sudo dnf install -y epel-release
sudo dnf install -y curl wget vim git htop iotop iftop net-tools \
  lsof rsync unzip zip tree tmux jq sysstat smartmontools

五、防火墙与端口管理

先给结论:Ubuntu 用 ufw,RHEL 系用 firewalld,两者都遵循"默认拒绝入站、放行必要端口"的原则。

bash
# ---------- Ubuntu / Debian:ufw ----------
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment 'SSH'
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numbered

# 删除规则(按编号)
sudo ufw delete 3
bash
# ---------- Rocky / AlmaLinux:firewalld ----------
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

# 删除规则
sudo firewall-cmd --permanent --remove-service=http && sudo firewall-cmd --reload

云服务器还需要在控制台的安全组里放行同样的端口,安全组在系统之外,两层都要开。

bash
# 查看监听端口与进程
sudo ss -lntup
sudo netstat -lntup

# 查看谁占用了 80 端口
sudo lsof -i :80
sudo fuser -n tcp 80

# 测试远端端口是否可达
nc -zv 你的IP 443
curl -v telnet://你的IP:443

六、常用命令速查表(文件 / 进程 / 网络 / 权限 / 系统)

先给结论:下面这五张表覆盖日常运维 90% 的命令,建议先全部跑一遍熟悉手感。

文件与目录

bash
pwd                       # 显示当前目录
ls -lah                   # 列出文件(含隐藏、人类可读大小)
cd /var/www               # 切换目录
mkdir -p /data/app/logs   # 递归创建目录
touch file.txt            # 创建空文件
cp -a src/ dst/           # 复制目录(保留属性)
mv old.txt new.txt        # 移动/重命名
rm -rf /tmp/old           # 强制删除(慎用)
cat file.txt              # 显示文件全部内容
less /var/log/syslog      # 分页查看(q 退出)
head -n 20 file.txt       # 查看前 20 行
tail -n 100 -f app.log    # 实时追踪日志(Ctrl+C 退出)
grep -n "ERROR" app.log   # 搜索并显示行号
grep -rn "timeout" /etc/nginx/   # 递归搜索目录
find /var -type f -size +100M    # 查找大于 100MB 的文件
find /data -name "*.log" -mtime +7 -delete   # 删除 7 天前的日志
du -sh /var/*             # 查看各目录占用大小
df -hT                    # 查看磁盘分区与使用率
tar -czf backup.tar.gz /data   # 打包压缩
tar -xzf backup.tar.gz -C /tmp # 解压到指定目录

进程与服务

bash
ps aux | grep nginx              # 查找进程
ps aux --sort=-%mem | head -10   # 按内存占用排序
top                              # 实时查看进程(q 退出)
htop                             # 增强版 top
kill -15 PID                     # 优雅终止进程
kill -9 PID                      # 强制杀死进程
pkill -f "node server.js"        # 按名称杀进程
systemctl status nginx           # 查看服务状态
systemctl restart nginx          # 重启服务
systemctl reload nginx           # 平滑重载配置
systemctl enable --now nginx     # 开机自启并立即启动
systemctl disable nginx          # 取消开机自启
journalctl -u nginx -f           # 实时查看服务日志
journalctl -u nginx --since "10 min ago"
uptime                           # 查看负载均值

网络

bash
ip a                             # 查看网卡与 IP(替代 ifconfig)
ip route                         # 查看路由表
ping -c 4 223.5.5.5              # 测试连通性
traceroute example.com           # 追踪路由
mtr -r -c 20 example.com         # 持续追踪并统计丢包
dig example.com +short           # DNS 查询
nslookup example.com             # DNS 查询(备用)
curl -I https://example.com      # 只看响应头
curl -o /dev/null -w "%{http_code} %{time_total}\n" https://example.com   # 取状态码与耗时
wget -c https://example.com/big.iso    # 断点续传下载
scp file.tar.gz deploy@IP:/data/       # 上传文件
rsync -avz -e "ssh -p 2222" ./dist/ deploy@IP:/data/www/   # 增量同步
ss -s                            # 连接统计

权限与用户

bash
ls -l                            # 查看权限(如 -rw-r--r--)
chmod 644 file.txt               # 改权限:属主读写,其他人只读
chmod 600 ~/.ssh/id_ed25519      # 私钥必须 600
chmod +x script.sh               # 加执行权限
chown deploy:deploy /data/app    # 改属主属组
chown -R www-data:www-data /var/www/html
sudo -u www-data whoami          # 以指定用户执行
id deploy                        # 查看用户 UID/GID 与所属组
last                             # 查看登录历史
w / who                          # 查看当前登录用户

Linux 权限的三组含义(以 -rwxr-xr-- 为例):

位置含义数值
第 1 位文件类型(- 普通文件,d 目录,l 链接)—
2~4 位属主权限(rwx)4+2+1 = 7
5~7 位属组权限(r-x)4+0+1 = 5
8~10 位其他用户权限(r--)4

系统信息

bash
lscpu                            # CPU 型号、核数、NUMA
free -h                          # 内存与 swap
lsblk                            # 磁盘与分区
df -hT                           # 文件系统使用率
iostat -x 1                      # 磁盘 IO 实时
vmstat 1 5                       # 内存、CPU、IO 综合
uname -a                         # 内核版本
cat /etc/os-release              # 发行版信息
dmesg -T | tail -30              # 内核日志
env                              # 环境变量

七、Shell 基础:让命令能组合起来

先给结论:Shell 的核心能力是"输入输出重定向 + 管道 + 变量 + 脚本",掌握这四点就能把单条命令组合成自动化流程。

重定向与管道

bash
# 输出重定向:覆盖写入 / 追加写入
echo "hello" > out.txt
echo "world" >> out.txt

# 错误重定向:2> 标准错误,&> 全部
command > result.log 2> error.log
command &> all.log
command > /dev/null 2>&1        # 丢弃所有输出(cron 里常用)

# 管道:把前一个命令的输出作为后一个的输入
cat access.log | grep "404" | wc -l
ps aux | grep nginx | grep -v grep | awk '{print $2}'

变量、条件与循环

bash
#!/usr/bin/env bash
set -euo pipefail               # 严格模式:出错即退出,变量未定义即报错

NAME="web01"
DATE=$(date +%F)
COUNT=$(grep -c "ERROR" /var/log/app.log || true)

echo "主机: ${NAME}, 日期: ${DATE}"

if [ "$COUNT" -gt 100 ]; then
  echo "错误日志过多:${COUNT} 条,需要排查"
else
  echo "日志正常"
fi

for host in web01 web02 web03; do
  echo "--- 检查 ${host} ---"
  ssh "$host" "uptime; df -h / | tail -1"
done

# 遍历文件并处理
for f in /data/*.tar.gz; do
  [ -e "$f" ] || continue
  echo "处理 $f"
done

实用的日常一键脚本

bash
#!/usr/bin/env bash
# 一键查看服务器健康状态
echo "===== 系统负载 ====="
uptime
echo "===== 内存 ====="
free -h
echo "===== 磁盘 ====="
df -hT | grep -v tmpfs
echo "===== CPU 占用 TOP5 ====="
ps aux --sort=-%cpu | head -6
echo "===== 内存占用 TOP5 ====="
ps aux --sort=-%mem | head -6
echo "===== 监听端口 ====="
sudo ss -lntup | head -20

保存为 health.sh 后:

bash
chmod +x health.sh
./health.sh
# 或放到 /usr/local/bin/ 供全局调用
sudo mv health.sh /usr/local/bin/health && health

定时任务(cron)

bash
crontab -e          # 编辑当前用户的定时任务
crontab -l          # 查看

# 格式:分 时 日 月 周 命令
# 每天凌晨 3 点备份
0 3 * * * /home/deploy/backup.sh >> /var/log/backup.log 2>&1
# 每 5 分钟检查一次
*/5 * * * * /usr/local/bin/check.sh