Linux 从零部署项目实战指南(一):服务器选购与环境初始化
本系列面向零基础或初中级开发者,手把手教你将一个项目从零部署到 Linux 服务器,并解决过程中遇到的常见问题。
一、前言
"项目写好了,怎么部署到服务器上?"
这是很多开发初学者最头疼的问题。买好了服务器却不知道从何下手,配置环境时各种报错,项目上线后遇到问题不知如何排查……
别担心,这个系列就是从零开始,把一个项目完整部署到 Linux 服务器上,每一步都有图有代码,每篇都附 "常见问题" 板块,把踩过的坑都告诉你。
本篇目标:拥有一台配置好基础环境的云服务器,能够通过 SSH 安全登录,目录结构清晰规范,防火墙配置到位。
二、云服务器选购指南
2.1 轻量应用服务器 vs 云服务器 ECS
很多新手买服务器时,会看到两个类似的产品,容易混淆:
💡 建议:个人学习、小博客项目选 轻量应用服务器 就够了,便宜且省心。如果是公司项目或学习完整的运维技能,选 ECS 更有操作空间。本系列以 ECS 为例讲解,但 90% 的内容在轻量服务器上同样适用。
2.2 主流云平台对比
2.3 配置选择建议
核心配置维度:CPU、内存、带宽、磁盘
CPU & 内存
# 按场景推荐配置学习练手: CPU: 2核 内存: 2G (最小可行配置) 说明: 能跑一个单机应用,但若同时跑 MySQL + Redis 内存会吃紧个人博客/小项目: CPU: 2核 内存: 4G (推荐配置,性价比最高) 说明: 同时跑 Nginx + MySQL + Redis + 应用进程,内存基本够用企业生产/高并发: CPU: 4核+ 内存: 8G+ 说明: 需要预留弹性空间应对流量高峰
带宽
带宽是容易被忽略的配置。带宽决定你的用户访问速度。
- • 1Mbps:理论最大下载速度约 128KB/s,仅够 API 接口交互,页面带大量图片就吃力
- • 3Mbps:约 384KB/s,个人博客轻度使用勉强够
- • 5Mbps:约 640KB/s,推荐起步配置,页面加载体验尚可
- • 10Mbps:约 1.25MB/s,小型生产环境舒适区
带宽计费模式:
按固定带宽(推荐新手): 优点:费用固定,不怕流量突增 缺点:流量用不用都付一样的钱 示例:5Mbps 包月 ≈ 100-150元/月按使用流量: 优点:闲时费用低 缺点:被攻击或流量突增时费用飙升 示例:1GB ≈ 0.8元,如果网站日流量 10GB,一天就 8 元
⚠️ 新手强烈建议选"按固定带宽"。按流量计费看着便宜,但如果网站被刷流量或者代码有 bug 循环请求,一觉醒来欠费几百块的情况并不少见。
磁盘
云服务器通常有两类磁盘:
系统盘(必选): - 默认 40GB,建议扩大到 60GB - 用于安装操作系统和系统软件 - 类型:高效云盘(便宜)或 SSD 云盘(快)数据盘(可选但推荐): - 单独挂载,用于存放项目代码、数据库、日志 - 优势:重装系统时数据盘不受影响 - 建议:至少 40GB SSD 数据盘
为什么要区分系统盘和数据盘?
# 场景:系统出问题需要重装系统# 有数据盘 ➜ 只重装系统盘,数据盘的数据还在# 无数据盘 ➜ 所有数据都得先备份,否则重装就丢了
2.4 地域选择
地域选择影响访问速度和备案要求:
国内节点: 华东(上海/杭州)—— 适合华东用户 华南(深圳/广州)—— 适合华南用户 华北(北京/张家口)—— 适合北方用户 注意:国内节点必须 ICP 备案才能绑定域名海外节点: 香港 —— 访问速度快,无需备案 新加坡 —— 东南亚用户首选 美国(硅谷/弗吉尼亚)—— 欧美用户首选 注意:海外节点延迟较高,但免备案
选地域口诀:离用户近、同运营商快、国内需备案。
2.5 购买实操指引
以阿里云 ECS 为例,购买时关键选项:
① 计费方式:包年包月(新手选这个,价格优惠)② 地域:华北2(北京)/ 华东1(上海)③ 实例:ecs.t6-c1m1.large(2核2G,入门够用)④ 镜像:Ubuntu 22.04 64位⑤ 系统盘:高效云盘 40GB⑥ 数据盘:SSD云盘 40GB(可选)⑦ 带宽:按固定带宽 5Mbps⑧ 安全组:创建后开放 22、80、443 端口
三、服务器初始化
3.1 操作系统选择
系统选择原则: 1. 选 LTS(长期支持)版本,不要追新 2. 选你熟悉的包管理器(apt / yum) 3. 选社区活跃的,出问题能搜到答案推荐排行: 🥇 Ubuntu 22.04 LTS —— 首选,文档最全,教程最多 🥇 Ubuntu 24.04 LTS —— 新版,但部分软件兼容性稍差 🥈 Debian 12 —— 稳定省资源,适合生产环境 ❌ CentOS 7 —— 2024年6月已停止维护,不要再用了 ⚠️ Rocky Linux / AlmaLinux —— CentOS 的替代品,但国内用户少
本系列以 Ubuntu 22.04 LTS 为例,命令和操作在 Ubuntu 24.04 和 Debian 12 上基本通用。
3.2 SSH 连接服务器
购买服务器后,云平台会提供初始登录信息:
- • 公网 IP:如
123.123.123.123 - • 用户名:Ubuntu 系统默认为
root 或 ubuntu - • 密码:你设置的登录密码(购买时设置或重置密码)
方式一:密码登录
Windows 用户(使用 PowerShell 或 CMD 或 Terminal):
# 基础登录命令ssh root@123.123.123.123# 如果提示 "Permission denied",可能是用户名不对,试试 ubuntussh ubuntu@123.123.123.123# 如果 SSH 端口不是默认的 22(比如改了端口)ssh -p 2222 root@123.123.123.123
首次连接会提示确认主机指纹,输入 yes 回车即可,然后输入密码登录。
🔑 密码输入技巧:Linux 输入密码时屏幕不会显示任何字符(没有 ******),这是正常的,输入完直接回车即可。
方式二:密钥登录(推荐,更安全)
密钥登录的原理是非对称加密:你有一对密钥,公钥放在服务器上,私钥留在本地。登录时,服务器用公钥验证你的私钥,匹配成功才允许登录。
第 1 步:在本地生成密钥对
# Windows PowerShell / macOS Terminal / Linux 均可执行ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
执行后会提示你:
Generating public/private rsa key pair.Enter file in which to save the key (C:\Users\你的用户名\.ssh\id_rsa):# 直接回车,使用默认路径Enter passphrase (empty for no passphrase):# 可选:给私钥加个密码,这样即使私钥泄露也需要密码才能使用# 建议设置,但每次登录需要输入这个密码(也可以配合 ssh-agent 缓存)Enter same passphrase again:
生成成功后,你会看到两个文件:
~/.ssh/id_rsa ← 私钥(自己保管,绝对不要给任何人)~/.ssh/id_rsa.pub ← 公钥(可以公开,上传到服务器)
第 2 步:将公钥上传到服务器
# 方法一:使用 ssh-copy-id(推荐,一行搞定)ssh-copy-id root@123.123.123.123# 输入密码后,ssh-copy-id 会自动将你的公钥追加到服务器的 authorized_keys 中# 方法二:如果 ssh-copy-id 不可用(Windows 默认没有此命令)# 先查看公钥内容cat ~/.ssh/id_rsa.pub# 复制输出的全部内容,然后登录服务器手动添加:mkdir -p ~/.sshchmod 700 ~/.sshecho "这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys
⚠️ 权限一定要设置正确,否则 SSH 服务器会忽略这个文件:
- •
~/.ssh 目录权限必须是 700(只有自己有读写执行权限) - •
~/.ssh/authorized_keys 文件权限必须是 600(只有自己有读写权限)
第 3 步:测试密钥登录
ssh root@123.123.123.123
如果配置正确,应该直接登录成功,不再需要输入密码(除非你设置了私钥 passphrase)。
第 4 步:配置 SSH 客户端(简化登录)
每次输入 ssh root@123.123.123.123 太长了,配置 SSH 别名可以简化:
在本地编辑 ~/.ssh/config 文件(Windows 路径:C:\Users\你的用户名\.ssh\config):
# 基础配置Host my-server HostName 123.123.123.123 User root Port 22 IdentityFile ~/.ssh/id_rsa# 你还可以配置多台服务器Host test-server HostName 111.111.111.111 User deploy Port 2222 IdentityFile ~/.ssh/id_rsa_test
配置后,只需要这样连接:
ssh my-server# 等同于 ssh root@123.123.123.123 -p 22 -i ~/.ssh/id_rsa
提高 SSH 安全性
修改 SSH 默认端口
默认的 22 端口每天被全球的扫描器疯狂探测,改个端口能挡掉 99% 的暴力破解:
# 1. 编辑 SSH 配置文件sudo vim /etc/ssh/sshd_config# 2. 找到以下行并修改# 修改前:#Port 22# 修改后:Port 22 # 保留 22 端口作为备用,先添加新端口测试Port 2222 # 自定义端口(建议 1024-65535 之间)# 3. 保存后重启 SSH 服务sudo systemctl restart sshd# 4. 重要!不要关闭当前连接,新开一个终端测试新端口ssh -p 2222 root@123.123.123.123# 5. 新端口确认能登录后,再回去注释掉 Port 22,重启 sshd
禁用密码登录(仅允许密钥登录)
# 编辑 /etc/ssh/sshd_configPasswordAuthentication noPubkeyAuthentication yesChallengeResponseAuthentication noUsePAM no# 重启 SSH 服务sudo systemctl restart sshd
⚠️ 禁用密码前,务必确认密钥登录已经配置成功且能正常登录,否则你会把自己锁在服务器外面!建议先开两个 SSH 窗口测试。
SSH 连接保活配置
默认 SSH 连接一段时间不操作就会断开,配置心跳包可以保持连接:
# 编辑服务端 /etc/ssh/sshd_configClientAliveInterval 60 # 每 60 秒发送一次心跳ClientAliveCountMax 3 # 连续 3 次心跳无响应后断开# 或者配置客户端侧(推荐,只影响当前机器)# 编辑 ~/.ssh/configHost * ServerAliveInterval 30 ServerAliveCountMax 3
3.3 基础环境配置
登录服务器后,按顺序执行以下操作:
步骤 1:更新系统软件包
# 更新软件源索引sudo apt update# 升级所有已安装软件包到最新版本sudo apt upgrade -y# 可选:升级内核和系统组件(更彻底,但耗时较长)sudo apt dist-upgrade -y# 清理不再需要的依赖包sudo apt autoremove -y
这几个命令的区别:
- •
apt update:只更新软件包列表,不实际安装 - •
apt upgrade:升级已有软件,但不安装新依赖或删除旧包 - •
apt dist-upgrade:更激进的升级,会处理依赖关系变更
步骤 2:安装常用工具
# 一次安装所有常用工具sudo apt install -y \ curl \ # 网络请求工具 wget \ # 下载工具 git \ # 版本控制 vim \ # 文本编辑器 htop \ # 进程监控 net-tools \ # 网络工具(ifconfig、netstat) lsof \ # 查看打开的文件/端口 tree \ # 目录树展示 unzip \ # 解压 zip 文件 tar \ # 解压 tar 文件 telnet \ # 端口连通性测试 dnsutils \ # DNS 工具(dig、nslookup) software-properties-common \ # PPA 管理工具 apt-transport-https \ # 支持 HTTPS 源 ca-certificates # CA 证书
步骤 3:配置时区和时间同步
# 查看当前时区timedatectl# 设置为北京时间(东八区)sudo timedatectl set-timezone Asia/Shanghai# 确认时间正确date# 查看时间同步状态timedatectl status# 如果显示 "NTP service: active",说明时间自动同步已启用# 如果没有启用,手动启用:sudo timedatectl set-ntp true
步骤 4:配置 Swap 交换分区(重要!)
为什么需要 Swap?
当物理内存不够时,系统会把不活跃的内存数据换到磁盘上的 Swap 分区。对于 2G 内存的服务器,配置 Swap 可以防止内存不足时 OOM(Out Of Memory)杀死进程。
# 检查当前是否有 Swapfree -h# 如果 Swap 行显示全是 0,说明没有配置# 创建 2GB 的 Swap 文件(按需调整:一般设为物理内存的 1-2 倍)sudo fallocate -l 2G /swapfile# 设置正确的权限(Swap 文件包含内存数据,必须仅 root 可读写)sudo chmod 600 /swapfile# 格式化为 Swap 格式sudo mkswap /swapfile# 启用 Swapsudo swapon /swapfile# 验证是否生效sudo swapon --showfree -h# 应该能看到 Swap 总量为 2G# 配置开机自动挂载echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab# 调整 Swappiness(控制内核使用 Swap 的积极程度,默认 60 偏积极)# 对于云服务器,建议设为 10,避免过于频繁地使用磁盘交换sudo sysctl vm.swappiness=10echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
Swappiness 说明:
- • 默认 60 意味着内存使用超过 40% 就可能开始换出
- • 设为 10 意味着内存使用超过 90% 才使用 Swap
- • 云服务器磁盘 I/O 是瓶颈,减少 Swap 使用能提升性能
步骤 5:优化系统内核参数
创建 /etc/sysctl.d/99-custom.conf 文件:
sudo tee /etc/sysctl.d/99-custom.conf << 'EOF'# ---- 网络优化 ----# 扩大网络连接队列长度(应对短时并发)net.core.somaxconn = 1024# 加快 TCP 连接回收(减少 TIME_WAIT 状态的连接数)net.ipv4.tcp_fin_timeout = 30# 允许更多的 TIME_WAIT 连接被复用net.ipv4.tcp_tw_reuse = 1# 扩大 TCP 接收/发送缓冲区net.core.rmem_max = 16777216net.core.wmem_max = 16777216# ---- 文件描述符 ----# 系统级别的最大文件打开数fs.file-max = 100000EOF# 应用配置sudo sysctl -p /etc/sysctl.d/99-custom.conf
步骤 6:调整文件描述符限制
# 修改 limits.confsudo tee -a /etc/security/limits.conf << 'EOF'* soft nofile 65535* hard nofile 65535* soft nproc 65535* hard nproc 65535EOF# 退出重新登录后,用 ulimit -n 验证ulimit -n# 应该输出 65535
步骤 7:修改主机名
# 查看当前主机名hostnamectl# 修改为有意义的名字(如项目名)sudo hostnamectl set-hostname myproject-server# 更新 hosts 文件,避免 sudo 时提示 "unable to resolve host"sudo sed -i "s/127.0.0.1.*/127.0.0.1 localhost myproject-server/" /etc/hosts
3.4 创建部署用户
出于安全考虑,不建议直接用 root 操作项目。创建专用用户来管理项目代码和服务:
# 创建名为 deploy 的普通用户# adduser 会交互式询问密码等信息,全部填写完整sudo adduser deploy# 将用户加入 sudo 组(使其拥有 sudo 权限)sudo usermod -aG sudo deploy# 切换到新用户su - deploy# 验证 sudo 权限sudo whoami# 应该输出 "root"# 为新用户配置密钥登录(可选,但推荐)# 在本地执行:# ssh-copy-id deploy@123.123.123.123
为什么不用 root?
root 权限过大,误操作可能损坏系统即使被入侵,攻击者得到的是 root 权限,后果严重sudo 有日志,可以追溯谁执行了什么命令
3.5 安装 Fail2ban 防暴力破解
互联网上每时每刻都有人在扫描 SSH 端口尝试暴力破解密码,Fail2ban 可以自动封禁频繁失败的 IP:
# 安装 fail2bansudo apt install -y fail2ban# 创建本地配置文件(覆盖默认配置)sudo tee /etc/fail2ban/jail.local << 'EOF'[DEFAULT]# 封禁时间:1 小时(单位:秒)bantime = 3600# 在 findtime 秒内失败 maxretry 次则封禁findtime = 600maxretry = 5# 忽略本机 IPignoreip = 127.0.0.1/8[sshd]enabled = trueport = sshlogpath = %(sshd_log)sEOF# 重启 fail2bansudo systemctl restart fail2ban# 查看状态sudo fail2ban-client status sshd# 查看被封禁的 IP 列表sudo fail2ban-client status sshd
3.6 配置自动安全更新
# 安装 unattended-upgradessudo apt install -y unattended-upgrades# 配置自动更新sudo dpkg-reconfigure --priority=low unattended-upgrades# 在弹出的界面中选择 "Yes"# 查看配置sudo cat /etc/apt/apt.conf.d/20auto-upgrades# 应该显示:# APT::Periodic::Update-Package-Lists "1";# APT::Periodic::Unattended-Upgrade "1";
四、项目目录规划
4.1 为什么需要规范的目录结构?
没有规范的目录结构,部署几个月后,你会面临这些混乱:
/ ─┬─ root ├─ home ─── 项目代码东一处西一处 ├─ data ─── 数据库文件找不到 ├─ var ─── 日志散落在各目录 └─ tmp ─── 临时文件堆积成山
而规范的目录结构应该是这样的:
/ ─┬─ home/www/project/ ← 项目代码(统一管理) ├─ data/ ← 数据存储(数据库、缓存、备份) ├─ etc/nginx/ ← 服务配置(Nginx 等) └─ var/log/ ← 系统日志
4.2 推荐的标准目录结构
/home/www/ # 项目根目录(所有项目都在这里) └── myproject/ # 项目名称(按项目名分目录) ├── source/ # 源码目录(git clone 到这里) ├── config/ # 项目配置文件 │ ├── appsettings.json # .NET 配置文件 │ ├── app.env # 环境变量文件 │ └── nginx.conf # Nginx 站点配置 ├── logs/ # 运行日志 │ ├── app.log # 应用日志 │ ├── access.log # 访问日志 │ └── error.log # 错误日志 └── static/ # 静态资源(图片、CSS、JS等) ├── uploads/ # 用户上传文件 └── assets/ # 前端构建产物/data/ # 数据存储根目录 ├── mysql/ # MySQL 数据文件 │ └── data/ # 数据库文件(由 MySQL 管理) ├── redis/ # Redis 持久化数据 │ └── dump.rdb # RDB 快照文件 └── backup/ # 备份目录 ├── db/ # 数据库备份 ├── code/ # 代码备份 └── config/ # 配置文件备份/etc/nginx/ # Nginx 配置目录 ├── sites-available/ # 可用站点配置 └── sites-enabled/ # 已启用站点配置(软链接到 available)/var/log/nginx/ # Nginx 访问与错误日志
4.3 创建目录并设置权限
# 创建完整的项目目录结构sudo mkdir -p /home/www/myproject/{source,config,logs,static/{uploads,assets}}sudo mkdir -p /data/{mysql,redis,backup/{db,code,config}}sudo mkdir -p /var/log/nginx# 将目录所有权交给 deploy 用户(deploy 用户可以正常读写)sudo chown -R deploy:deploy /home/wwwsudo chown -R deploy:deploy /datasudo chown -R deploy:deploy /var/log/nginx# 用 tree 命令查看创建结果tree -L 3 /home/wwwtree -L 3 /data
4.4 配置环境变量
环境变量用于存储敏感信息(数据库密码、API Key 等),避免硬编码在代码中:
# 为 deploy 用户配置环境变量vim ~/.bashrc# 在文件末尾添加:export DB_HOST="localhost"export DB_PORT="3306"export DB_USER="myapp"export DB_PASSWORD="your_secure_password"export REDIS_HOST="localhost"export REDIS_PORT="6379"export APP_ENV="production"# 使配置生效source ~/.bashrc# 验证echo $DB_HOST# 输出:localhost
💡 生产环境建议:对于更复杂的环境变量管理,可以使用 .env 文件,配合 direnv 工具按目录自动加载。
4.5 使用软链接管理站点配置
Nginx 的 sites-available 和 sites-enabled 机制是软链接的经典应用:
# 创建站点配置(在 sites-available 中)sudo vim /etc/nginx/sites-available/myproject# 启用站点(创建软链接到 sites-enabled)sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/# 检查配置语法sudo nginx -t# 重新加载 Nginxsudo systemctl reload nginx# 禁用站点(删除软链接)sudo rm /etc/nginx/sites-enabled/myproject
这种机制的好处:配置和启用分离,可以随时开关站点而不丢失配置。
五、防火墙配置
5.1 Linux 防火墙体系
Linux 防火墙的底层是 Netfilter(内核网络过滤框架),上层通过 iptables 管理规则。Ubuntu 的 UFW(Uncomplicated Firewall)是对 iptables 的封装,让防火墙配置更简单。
┌──────────────────────────────────────────────────┐│ 用户空间 ││ ┌──────┐ ┌──────────────────────────────┐ ││ │ UFW │──▶│ iptables / nftables 命令 │ ││ └──────┘ └──────────┬───────────────────┘ │├──────────────────────────┼────────────────────────┤│ 内核空间 │ ││ ┌──────▼──────────┐ ││ │ Netfilter │ ││ │ (内核网络过滤) │ ││ └─────────────────┘ │└──────────────────────────────────────────────────┘
5.2 使用 UFW 配置防火墙
# 安装 UFW(Ubuntu 默认已安装,确认一下)sudo apt install -y ufw# 先检查状态(默认是 inactive)sudo ufw status# 设置默认策略:拒绝所有入站,允许所有出站sudo ufw default deny incomingsudo ufw default allow outgoing# 开放必要端口(按需开放,越少越安全)sudo ufw allow 22/tcp # SSH 远程连接sudo ufw allow 80/tcp # HTTP Web 访问sudo ufw allow 443/tcp # HTTPS 加密访问# 如果需要其他服务,再加(如 MySQL 只允许内网访问)sudo ufw allow from 10.0.0.0/8 to any port 3306 # 内网 MySQL# 启用防火墙(会提示是否继续,输入 y)sudo ufw enable# 查看详细状态sudo ufw status verbose# 输出示例:# Status: active# Logging: on (low)# Default: deny (incoming), allow (outgoing), deny (routed)# New profiles: skip## To Action From# -- ------ ----# 22/tcp ALLOW IN Anywhere# 80/tcp ALLOW IN Anywhere# 443/tcp ALLOW IN Anywhere# 3306 ALLOW IN 10.0.0.0/8# 22/tcp (v6) ALLOW IN Anywhere (v6)# 80/tcp (v6) ALLOW IN Anywhere (v6)# 443/tcp (v6) ALLOW IN Anywhere (v6)
UFW 常用管理命令:
# 删除规则(按编号)sudo ufw status numberedsudo ufw delete 3# 拒绝特定 IPsudo ufw deny from 1.2.3.4# 临时禁用防火墙(排错时使用)sudo ufw disable# 重置所有规则(回到初始状态)sudo ufw reset
5.3 云平台安全组(双重保险)
重要概念:安全组是云平台层面的防火墙,UFW 是服务器内部的防火墙。两者都放行才能访问。
用户请求 → 云平台安全组 → 服务器 UFW → 服务进程 ↓ ↓ 必须放行 必须放行
配置安全组规则(以阿里云为例):
登录阿里云控制台 → 云服务器 ECS → 网络与安全 → 安全组 → 配置规则 → 入方向
规则方向:入方向优先级:1协议类型:TCP端口范围:22/22(SSH)授权对象:0.0.0.0/0(所有 IP)→ 建议改为你公司的公网 IP描述:SSH 远程连接规则方向:入方向协议类型:TCP端口范围:80/80(HTTP)授权对象:0.0.0.0/0描述:HTTP Web 访问规则方向:入方向协议类型:TCP端口范围:443/443(HTTPS)授权对象:0.0.0.0/0描述:HTTPS 加密访问
⚠️ 安全组配置技巧:
- SSH 端口(22)的授权对象建议绑定你的 IP,而不是
0.0.0.0/0 - 如果 IP 不固定,可以使用云平台的 安全组规则备注 功能管理多个 IP
5.4 防止自己被锁在门外
每次修改防火墙规则前,建议先创建一个定时任务来重置防火墙,以防把自己锁在外面:
# 在修改防火墙前,设置一个 5 分钟后自动关闭防火墙的任务# 如果修改后发现自己被锁了,等 5 分钟就能恢复sudo shutdown -r +5 "紧急恢复:防火墙配置可能有问题"# 如果修改成功,取消重启sudo shutdown -c
六、验证环境
执行完以上所有步骤后,做一次全面检查,确保服务器状态正常:
# ========== 系统信息 ==========echo "=== 系统版本 ==="lsb_release -a 2>/dev/null || cat /etc/os-releaseecho ""echo "=== 内核版本 ==="uname -recho ""echo "=== 主机名 ==="hostnamectl# ========== 资源状态 ==========echo "=== CPU 信息 ==="nproc # CPU 核心数lscpu | grep "Model name" # CPU 型号echo ""echo "=== 内存信息 ==="free -hecho ""echo "=== 磁盘信息 ==="df -h# ========== 网络状态 ==========echo "=== 公网 IP ==="curl -s ifconfig.meecho ""echo "=== 防火墙状态 ==="sudo ufw status verboseecho ""echo "=== 监听端口 ==="sudo ss -tlnp# ========== 外网连通性 ==========echo "=== DNS 解析测试 ==="nslookup baidu.comping -c 2 baidu.com# ========== 安全状态 ==========echo "=== Fail2ban 状态 ==="sudo fail2ban-client status sshdecho ""echo "=== SSH 登录日志(最近5次失败)==="sudo lastb | head -5
验证清单,逐项打勾:
[✅] SSH 密钥登录成功[✅] 密码登录已禁用[✅] SSH 端口已修改(可选)[✅] 系统软件包已更新[✅] 时区设置为 Asia/Shanghai[✅] Swap 已配置(2GB)[✅] Fail2ban 已启动[✅] 自动安全更新已配置[✅] deploy 用户已创建且有 sudo 权限[✅] 目录结构已创建[✅] UFW 防火墙已启用且端口正确[✅] 云平台安全组已配置[✅] 外网访问正常
七、常见问题
❓ Q1:SSH 连接超时 Connection timed out
错误信息:ssh: connect to host 123.123.123.123 port 22: Connection timed out
排查步骤:
① 服务器是否已开机? → 登录云平台控制台,查看实例状态② 安全组是否放行了 22 端口? → 控制台 → 安全组 → 入方向规则 → 检查是否有 22 端口③ 本地网络能否到达服务器? → ping 123.123.123.123 → 如果 ping 不通,说明网络层面不通 → 如果 ping 通但 SSH 连不上,说明端口问题④ 是否是公司网络限制? → 尝试切换手机热点连接
❓ Q2:Permission denied (publickey)
错误信息:root@123.123.123.123: Permission denied (publickey)
原因:SSH 服务器拒绝了你的密钥认证。
排查步骤:
① 公钥是否正确上传? → 登录云平台控制台(使用 VNC 或远程连接功能) → 检查 ~/.ssh/authorized_keys 文件内容 → 检查权限:chmod 600 ~/.ssh/authorized_keys; chmod 700 ~/.ssh② 是否使用了正确的私钥? → ssh -i ~/.ssh/id_rsa -v root@123.123.123.123 → -v 参数会输出详细调试信息,查看 "Authentication succeeded" 或失败原因③ 服务器 SSH 配置是否允许密钥登录? → 检查 /etc/ssh/sshd_config 中: PubkeyAuthentication yes
❓ Q3:apt update 报错 "Could not resolve"
错误信息:Temporary failure resolving 'archive.ubuntu.com'
原因:DNS 解析失败,无法解析软件源域名。
解决方案:
# 检查当前 DNS 配置cat /etc/resolv.conf# 手动添加 DNS 服务器sudo tee /etc/resolv.conf << 'EOF'nameserver 8.8.8.8nameserver 114.114.114.114EOF# 如果服务器重启后 /etc/resolv.conf 会被重置,改为配置 netplansudo vim /etc/netplan/00-installer-config.yaml# 在 network.ethernets.eth0 下添加:# nameservers:# addresses: [8.8.8.8, 114.114.114.114]# 应用配置sudo netplan apply
❓ Q4:SSH 登录很慢,要等很久才出现密码提示
原因:SSH 服务开启了 DNS 反向解析,但你的 IP 没有 PTR 记录。
解决方案:
# 编辑 /etc/ssh/sshd_configUseDNS noGSSAPIAuthentication no# 重启 SSH 服务sudo systemctl restart sshd
❓ Q5:sudo 提示 "unable to resolve host"
错误信息:sudo: unable to resolve host myproject-server
原因:主机名未正确添加到 hosts 文件。
解决方案:
# 查看主机名hostname# 将主机名加入到 hosts 文件sudo vim /etc/hosts# 确保有一行:127.0.0.1 localhost myproject-server
❓ Q6:端口明明开了但访问不了?
问题:服务已启动,防火墙也放行了,但就是访问不了。
排查步骤:
# ① 检查服务是否在监听正确端口sudo ss -tlnp | grep 80# 应该看到类似:LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234,fd=6))# ② 检查服务绑定的是 0.0.0.0 还是 127.0.0.1# 如果绑定的是 127.0.0.1,只能本机访问,需要改为 0.0.0.0# ③ 检查 UFW 是否放行sudo ufw status | grep 80# ④ 检查云平台安全组# 登录控制台检查入方向规则# ⑤ 本地测试端口连通性telnet 123.123.123.123 80# 如果卡住没反应,说明端口不通;如果显示 Connected,说明通
❓ Q7:磁盘空间不够用怎么办?
# 查看磁盘空间分布du -sh /* 2>/dev/null | sort -rh | head -20# 清理 apt 包缓存sudo apt cleansudo apt autoclean# 清理 journal 日志(保留最近7天的)sudo journalctl --vacuum-time=7d# 清理旧内核(释放 /boot 空间)sudo apt autoremove --purge -y# 清理 /tmp 临时文件sudo rm -rf /tmp/*# 如果还不够,在云平台控制台扩容数据盘,然后扩展文件系统# 扩容后执行:sudo growpart /dev/vdb 1sudo resize2fs /dev/vdb1
八、总结
至此,你的服务器已经完成了完整的初始化,可以开始部署项目了。
本文要点回顾:
第一篇:服务器选购与环境初始化├── ✅ 选购了合适的云服务器(ECS vs 轻量服务器)├── ✅ 选择了 Ubuntu 22.04 LTS 系统├── ✅ 配置了 SSH 密钥登录并禁用密码登录├── ✅ 修改了 SSH 端口(可选)├── ✅ 更新了系统软件包├── ✅ 配置了时区、Swap、内核参数├── ✅ 创建了 deploy 用户├── ✅ 安装了 Fail2ban 防暴力破解├── ✅ 配置了自动安全更新├── ✅ 规划了标准化的项目目录结构├── ✅ 配置了 UFW 防火墙├── ✅ 配置了云平台安全组└── ✅ 通过了全面验证检查
📌 下一篇预告:《Linux 从零部署项目实战指南(二):Nginx + MySQL + Redis 运行环境搭建》我们将搭建完整的项目运行环境,包括 Nginx 反向代理、MySQL 数据库、Redis 缓存,以及常见配置问题的排查方法。
如果你在操作过程中遇到任何问题,欢迎在评论区留言交流!
📌 本系列持续更新中,关注 IT在线自学 第一时间获取最新教程。