1. 服务器到手之前,先把这些事想明白
我第一次远程登录一台Linux服务器的时候,盯着黑乎乎的终端界面愣了大概三分钟,光标在那儿一闪一闪,脑子里只有一个问题:我现在该敲什么?后来带过几个新人,发现大家卡住的地方几乎一模一样——不是命令记不住,而是没人告诉他们这台机器是怎么回事、自己手上有什么、下一步该干嘛。所以这篇东西我打算按"拿到一台裸机之后我会怎么一步步收拾它"的顺序来写,尽量把每一步背后的原因也讲清楚,而不是甩一堆命令让人照抄。
这篇文章里说的"服务器",默认是你在云服务商那里买的一台云服务器,装的是主流Linux发行版(Ubuntu、Debian、CentOS、Rocky、Alma这些都很常见)。文章覆盖登录、初始化配置、常用开发环境搭建、日常使用习惯和问题排查,面向的是完全没碰过Linux服务器的人,也适合用了一段时间但配置得比较乱的读者回头梳理一遍。如果你本地装的是虚拟机(比如 VMware 或 VirtualBox 里跑的 Linux),思路完全一样,只是"登录"这一步换成本地终端而已。
1.1 买机器时真正该关心的几个参数
很多人挑服务器的时候只看价格,结果用了两个月发现磁盘爆了、内存不够、或者系统版本太老装不上新软件,又重新折腾一遍。我自己的经验是,下面这几个参数比CPU核数更值得花时间去确认。
操作系统镜像版本。这一步最容易被忽略。同是Ubuntu,20.04和22.04的软件源差异就不小,24.04又换了一批默认组件。选镜像时优先选长期支持版本(LTS),一般能得到五年左右的安全更新。如果你不确定自己要用什么,选 Ubuntu 的LTS版本容错率最高,社区资料也最全,遇到问题搜出来能用的答案多。
磁盘和内存的配比。纯跑Web服务、做反向代理,2核2G够用;如果要在上面编译东西(比如前端项目打包、Maven构建),内存最好4G起步,因为构建过程吃内存很凶,2G经常会被OOM Killer直接干掉进程,表现就是"编译到一半终端断了"。磁盘方面,系统盘20G只是温饱线,Docker镜像、日志、依赖缓存加起来涨得飞快,我一般给系统盘至少40G。
带宽与流量计费方式。这个坑很隐蔽。有些套餐是固定带宽(比如1Mbps),有些是"按流量计费"。前者便宜但下载速度慢,从服务器往外拉大文件会很痛苦;后者速度快但一旦被刷流量,账单会很难看。个人使用固定小带宽基本够,但你要是打算传数据集或者对外提供下载,就得算清楚。
地域节点。选离你和你的用户都近的节点,网络延迟会差出好几倍。这点没有特别玄乎的技术含量,就是物理距离决定的事。
| 使用场景 | 建议配置 | 说明 |
|---|---|---|
| 学习Linux命令、跑小脚本 | 1核1G,系统盘20G | 够用,但别指望编译大项目 |
| 部署个人网站、博客 | 2核2G,系统盘40G | 装个Nginx+数据库比较从容 |
| 前端/后端构建、Docker多容器 | 2核4G起步,系统盘60G | 构建过程吃内存,4G是心理安全线 |
| 跑数据库、做长期服务 | 4核8G,独立数据盘 | 数据盘方便单独备份和扩容 |
1.2 你会拿到哪几样东西
购买完成后,服务商的控制台里通常会给你三样东西:公网IP地址、登录用户名、登录凭证。凭证有两种形式,一种是初始密码,另一种是让你在控制台下载一个密钥文件(.pem或类似的私钥文件)。这两者的区别很重要:密码登录方便但容易被暴力破解,密钥登录安全但文件丢了就进不去。后面第三章我会详细讲怎么从密码切换成密钥。
还有一个东西经常被忽略:安全组。阿里云、腾讯云、华为云这类平台都叫"安全组",AWS叫"安全组"(Security Group),有些平台叫防火墙规则。它和服务器内部的防火墙是两套东西,很多新手改了服务器里的iptables或firewalld,发现端口还是不通,就是因为云平台那一层没放行。记住一句话:云平台的安全组在最外层,先过它,才轮到系统防火墙。
2. 登录这台机器:从密码到密钥
登录是所有人面对的第一道坎,也是新人报错最多的地方。"Permission denied"、"Connection timed out"、"Host key verification failed"这三句话,基本上能覆盖新手80%的登录问题。这一章把登录的完整流程讲透,包括怎么从最不安全的密码登录逐步过渡到密钥登录。
2.1 密码登录的完整过程和第一个坑
在Windows上,现在最省事的方式是用系统自带的终端(Windows Terminal)或者 PowerShell,直接敲 ssh 命令。老系统上如果没有ssh命令,装个 OpenSSH 客户端或者用 Xshell、MobaXterm 这类图形化工具也行。macOS和Linux用户直接用终端就好。
命令格式非常简单:
ssh 用户名@服务器IP比如ssh root@123.45.67.89,回车之后会提示你输入密码。这里第一个坑就来了:输入密码的时候屏幕上不会有任何显示,不会出现星号,光标也不动。很多人以为键盘坏了,其实这是正常的安全设计。直接盲敲,敲完回车就行。
第一次连接时还会弹出一段提示,大意是"这台主机的真实性未知,指纹是XXX,是否继续连接",输入yes回车即可。这个指纹是服务器公钥的哈希值,第一次连接时没得比对,接受就行。它的作用是防止你在后续连接中被中间人掉包,如果某天突然提示指纹变了,那才是需要警惕的信号。
登录成功后你会看到命令行提示符变了,通常长这样:
root@iZbp1xxxxx:~#@前面是当前用户,后面是主机名,~表示当前在用户的家目录,#表示是root用户(普通用户一般是$)。看到这行东西,就说明你已经站在服务器里面了。
2.2 从密码登录切换到密钥登录
密码登录最大的问题是会被扫。任何一台暴露在公网的22端口服务器,一天被尝试登录几百上千次是常态,日志里全是各种陌生IP在猜密码。解决办法就是换成密钥登录:你本地持有一把私钥,服务器上存着对应的公钥,登录时用数学方式验证,根本不给对方猜的机会。
整个过程分三步。
第一步,在本地生成密钥对:
ssh-keygen -t ed25519 -C "my-server-2024"一路回车就行。如果想要更保险,可以在提示"passphrase"的时候设一个密码,这样私钥文件被偷了也用不了,代价是每次登录都要输一遍(可以用ssh-agent缓存,后面说)。生成的密钥默认放在~/.ssh/目录下,id_ed25519是私钥,id_ed25519.pub是公钥。私钥文件绝对不能发给任何人,也不能上传到服务器上。
第二步,把公钥传到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@123.45.67.89这条命令做了一件看起来很魔法的事:它自动把公钥追加到了服务器的~/.ssh/authorized_keys文件里,并且顺手把目录权限设成了700、文件权限设成了600。这一步很关键,因为SSH对权限非常挑剔,如果authorized_keys是777或者其他用户可写的状态,SSH会直接拒绝使用它,而且不会告诉你原因,只会让你继续输密码——这是新手最常见的困惑之一。
如果你用的是Windows且没有ssh-copy-id,可以手动复制公钥内容,然后在服务器上执行:
mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys第三步,验证并关闭密码登录。先别急着关,新开一个终端窗口,试着用密钥登录一次,确认能进去,再动手改配置。这个习惯能救命,我见过太多人改完配置重启SSH服务,然后把自己彻底锁在外面,只能去控制台走VNC救援。
确认密钥登录没问题后,编辑/etc/ssh/sshd_config:
PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin prohibit-password改完执行sudo systemctl restart sshd重启服务。这里有个细节:Ubuntu系的服务名可能是ssh而不是sshd,两个都试试,用systemctl status ssh看哪个存在。另外,改配置之前建议先cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak备份一份,改坏了还能从救援模式恢复。
注意:修改SSH配置后一定要保留当前这个已经登录成功的终端窗口不要关,另开一个窗口测试新配置是否生效。万一配置写错,当前窗口还能救你。
2.3 登录失败怎么一步步排查
登录不上,先别慌,按下面的顺序排查,基本上能定位到问题在哪一层。
| 报错信息 | 大概率原因 | 处理方法 |
|---|---|---|
| Connection timed out | 网络不通、IP错、安全组没放行22端口 | ping一下IP,检查云平台安全组规则 |
| Connection refused | SSH服务没启动、端口被改 | 从控制台VNC进入,检查systemctl status sshd |
| Permission denied (publickey) | 密钥不匹配、权限不对、用户名错 | 检查authorized_keys内容和权限 |
| Host key verification failed | 服务器重装过,本地缓存的指纹过期 | 删除~/.ssh/known_hosts里对应那行 |
| 卡住很久然后超时 | 云平台安全组或系统防火墙拦截 | 逐层检查安全组和firewalld/ufw |
Permission denied是最常见的。你要确认三件事:登录用的用户名对不对(不是所有系统都允许root直连)、公钥是不是真的写进了目标用户的authorized_keys(多用户环境下经常写错用户)、以及权限设置对不对。有一个快速验证方法,在服务器上执行ssh-keygen -l -f ~/.ssh/authorized_keys,能看到指纹就说明文件格式没问题。
还有一个很隐蔽的情况:sshd_config里有一行AuthorizedKeysFile .ssh/authorized_keys,如果你把家目录或者文件路径改了,SSH就找不到了。还有SELinux在CentOS/Rocky上会额外限制家目录的访问,遇到诡异问题时可以临时setenforce 0测试一下,确认是SELinux的问题再针对性配置。
3. 系统初始化:上机第一小时该做什么
登录成功之后,别急着装软件。一台刚装好的系统有几件事必须先做,否则后面会反复踩坑。这一章的内容是我每次开新机器都会执行的固定动作,大概花二十分钟,但能省掉后面很多麻烦。
3.1 更新系统、校正时区和时间同步
第一件事是更新软件源和已安装的包。Ubuntu/Debian系:
sudo apt update && sudo apt upgrade -yCentOS/Rocky/Alma系:
sudo dnf update -y为什么第一步做这个?因为云服务商给的镜像可能已经放了几个月,仓库索引是旧的,你先装别的软件容易遇到依赖冲突。而且更新过程本身会顺带暴露一些源配置问题,早发现早处理。
第二件事是设时区。默认时区一般是UTC,如果你跑的是面向国内用户的服务,日志时间会比本地时间差8小时,排查问题的时候要不停做心算,非常折磨人。
sudo timedatectl set-timezone Asia/Shanghai timedatectl status第三件事是时间同步。服务器时间不准会引发一堆奇怪问题:HTTPS证书校验失败、数据库主从同步异常、分布式任务调度错乱、日志顺序对不上。现在主流发行版默认都启用了 systemd-timesyncd 或 chrony,检查一下状态:
timedatectl如果看到System clock synchronized: yes就没问题。如果没有,可以装 chrony 并指定公共时间服务器:
sudo apt install chrony -y编辑/etc/chrony/chrony.conf,加上几行公共NTP服务地址,比如ntp.aliyun.com、cn.pool.ntp.org、time.cloudflare.com这类公开可用的服务,然后sudo systemctl restart chrony。用chronyc sources -v能看到同步状态,^*开头的那行就是当前正在使用的源。
注意:不要把服务器时间往回调。如果时间差了,直接用同步服务拉平,手动
date -s修改容易导致依赖时间的服务出现数据错乱。
3.2 新建普通用户,别一直用root
一直用root操作是个很坏的习惯。root权限太大,一条命令敲错就可能删掉系统文件,而且很多服务默认拒绝以root身份运行。正确做法是建一个普通用户,需要提权时用sudo。
adduser zhangsan usermod -aG sudo zhangsan # Ubuntu/Debian usermod -aG wheel zhangsan # CentOS/Rockyadduser会交互式地问密码和用户信息,比useradd友好。加完组之后,切换到新用户测试一下sudo whoami,能输出root就说明配置好了。
接下来把新用户的密钥也配上,这样就能用新用户登录了。同时建议在sshd_config里把PermitRootLogin设成no,彻底禁止root直接登录。这一步做完,即使root密码泄露,攻击者也进不来。
用户管理这块还有几个常用操作值得记住:id 用户名查看用户的UID和所属组;groups 用户名看组信息;su - 用户名切换用户;deluser 用户名或userdel -r 用户名删除用户(-r会一起删家目录,谨慎使用)。
3.3 装齐基础工具,避免后面反复折腾
刚装好的系统往往很"素",连vim、wget、unzip都不一定有。我一般会一次性装一批常用工具,省得后面用到再一个个找。
Ubuntu/Debian:
sudo apt install -y vim wget curl git unzip zip htop net-tools \ build-essential python3-pip tree tmux lsofCentOS/Rocky:
sudo dnf install -y vim wget curl git unzip zip htop net-tools \ gcc gcc-c++ make python3-pip tree tmux lsof这里面有几个我觉得特别值得单独说。tmux是保命工具,它能让你的会话在断开连接后继续运行。比如你在服务器上跑一个要两小时的构建,网络一抖SSH断了,进程就跟着挂了,前面的时间全白费。用tmux new -s build开个会话,断线后用tmux attach -t build回来,进程还在跑。htop比自带的 top 好看太多,CPU、内存、进程一目了然。lsof用来查文件被哪个进程占用、端口被谁监听,排查问题非常顺手。
3.4 文件解压乱码:一个几乎人人会踩的坑
在Windows上打的压缩包传到Linux解压,中文文件名经常变成一堆问号或者方块,这是编码不一致导致的。Windows中文环境默认用GBK,Linux默认用UTF-8。
对于zip文件,可以先看看压缩包内部的文件名编码:
unzip -l 包名.zip如果显示乱码,试着用指定编码解压:
unzip -O cp936 包名.zip -d 目标目录不过-O参数并不是所有版本的unzip都支持,Debian/Ubuntu上自带的unzip就不一定认。这时候可以换个思路,用 Python 的 zipfile 模块处理,或者先解压再用convmv批量转换文件名:
sudo apt install convmv -y convmv -f gbk -t utf-8 -r --notest 目录名对于 tar.gz 包,如果里面的文本文件内容乱码,可以用 iconv 转:
iconv -f gbk -t utf-8 原文件.txt -o 新文件.txt最省事的办法其实是从源头解决:在Windows上打包时就用支持UTF-8的工具(比如7-Zip在设置里可以指定文件名编码),或者干脆用tar打包,tar默认不记录编码问题,跨平台传输再配合正确解压参数基本不会乱。
4. 开发环境搭建:按需装,别贪多
环境配置这块最大的误区是"看到什么装什么"。实际上你应该先想清楚这台服务器要跑什么,再决定装什么。装多了不仅占空间,还会带来版本冲突——比如系统自带的Python和你自己装的Python打架,是新手最容易遇到的噩梦。这一章按语言/工具分类讲,每种都给两条路:一条是包管理器安装(快),一条是手动安装(版本可控)。
4.1 Node.js 环境的两种装法
方案一:用 nvm 管理版本(推荐)。nvm 是 Node Version Manager,好处是能同时装多个Node版本并随时切换,写前端项目时特别有用。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 20 nvm use 20 node -v如果curl拉取脚本失败,可以换用wget -qO- 地址 | bash。装完后如果提示nvm: command not found,检查~/.bashrc末尾有没有被写入nvm的初始化片段,没有的话手动加上。
方案二:下载官方二进制包(免安装)。适合没有外网脚本执行环境、或者想要完全可控的场景。去官网找Linux x64的 tar.xz 包,下载后解压到/usr/local/:
wget https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz sudo tar -xf node-v20.11.1-linux-x64.tar.xz -C /usr/local/ sudo mv /usr/local/node-v20.11.1-linux-x64 /usr/local/nodejs然后配置环境变量,编辑/etc/profile或者~/.bashrc:
export NODE_HOME=/usr/local/nodejs export PATH=$NODE_HOME/bin:$PATH执行source /etc/profile生效。用which node确认指向的是你刚装的路径,而不是系统里可能存在的旧版本。国内环境下npm安装依赖慢的话,可以设置镜像源,这个属于常规操作,配置一次就行。
4.2 Python 环境与虚拟环境隔离
大多数Linux发行版自带Python3,但不要动系统自带的Python,很多系统工具依赖它,升级或替换会导致系统命令崩溃(最典型的就是 apt/yum 直接报错)。正确做法是另装一个独立版本。
Ubuntu上可以用 deadsnakes 源装指定版本,或者用 pyenv 管理多版本。但更简单实用的方式是直接用虚拟环境把项目依赖隔离开:
sudo apt install python3-venv -y python3 -m venv myproject source myproject/bin/activate pip install -r requirements.txt激活后命令行前面会出现(myproject)前缀,这时候pip install装的包只影响这个环境,不会污染系统。退出用deactivate。
如果你需要做深度学习相关的环境,conda 系列会更省事,它能同时管理Python版本和CUDA等非Python依赖:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程会问是否初始化shell,选yes。装完后conda create -n pytorch python=3.11建环境,conda activate pytorch激活。PyTorch的安装命令建议去官网用它的选择器生成,因为要匹配你的显卡驱动和CUDA版本,直接复制粘贴比自己猜靠谱。
注意:虚拟环境本质就是一个目录。不要把它提交到Git仓库,在
.gitignore里加上venv/、.venv/、env/这类规则,否则仓库会变得又大又乱。
4.3 Java 与 Maven:版本对齐是关键
Java环境最常见的坑是"版本对不上"。项目用JDK 17编译,服务器上装的是JDK 8,报错信息往往很晦涩。
装JDK最简单的方式是用包管理器:
sudo apt install openjdk-17-jdk -y多版本共存时用update-alternatives --config java切换。手动安装的话,下载tar.gz解压到/usr/local/,然后设置JAVA_HOME和PATH:
export JAVA_HOME=/usr/local/jdk-17 export PATH=$JAVA_HOME/bin:$PATHMaven的安装类似,解压后配环境变量:
export MAVEN_HOME=/usr/local/apache-maven-3.9.6 export PATH=$MAVEN_HOME/bin:$PATHMaven有个必做的优化:改镜像源。默认从中央仓库拉依赖,在国内网络环境下速度感人,经常卡在下载阶段。编辑$MAVEN_HOME/conf/settings.xml,在<mirrors>标签里加一个国内公共镜像地址,构建速度会有肉眼可见的提升。同时建议把本地仓库路径从默认的~/.m2/repository改到空间大的数据盘上,避免系统盘被依赖包撑爆。
验证安装是否成功:java -version、mvn -v,两个都能正常输出版本信息就说明环境变量配对了。
5. 把本地编辑器和服务器打通
在服务器上用vim写代码,短期可以,长期效率不高。比较舒服的方式是用VS Code的远程开发功能,本地编辑、远端运行,体验几乎和在本地开发一样。
5.1 Remote-SSH 插件的配置流程
装好VS Code后,在扩展市场搜索 "Remote - SSH" 安装。安装完左侧会出现一个远程资源管理器图标。
配置过程很简单:按Ctrl+Shift+P打开命令面板,输入 "Remote-SSH: Add New SSH Host",然后输入连接命令ssh 用户名@服务器IP。VS Code会问你配置文件存哪,一般选用户目录下的.ssh/config。之后在配置里可以补上几个实用参数:
Host myserver HostName 123.45.67.89 User zhangsan IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60ServerAliveInterval 60这行很实用,它让客户端每60秒发一次心跳,防止长时间不操作被服务器或中间网络设备断开连接。配好之后,在远程资源管理器里右键主机名选 "Connect to Host in New Window",新窗口左下角会显示 "SSH: myserver",这时候打开终端,就是在服务器上执行命令了。
如果连接卡在 "Setting up SSH Host" 很久然后失败,多半是服务器上要下载一个VS Code服务端组件但网络太慢。可以看输出面板的具体日志,一般会有明确的错误提示。常见原因是服务器磁盘满了、或者用户家目录没有写权限。
5.2 远程开发时的几个习惯
配置和工作区分开。VS Code的远程插件会把配置写在服务器家目录的.vscode-server里,这个目录会随着装插件慢慢变大,几百兆很常见。如果你系统盘小,可以定期清理或者把它软链到数据盘。
用工作区文件管理多项目。如果你在服务器上有好几个项目目录,不用每次开新窗口,可以把它们加进同一个.code-workspace文件,一次打开多个文件夹。
终端里保持tmux习惯。即使在VS Code里操作,长时间跑的任务还是放在tmux里更保险。VS Code的远程连接偶尔会断开重连,普通终端里的进程会跟着死掉。
Python解释器和Node版本在VS Code里单独指定。远程环境下,VS Code可能会用系统默认的Python或Node,而不是你虚拟环境里的。用Ctrl+Shift+P里的 "Python: Select Interpreter" 指定到虚拟环境路径下的python,能避免"本地跑得好好的,远端就是找不到包"这类问题。
6. 日常使用必会的命令与运维习惯
命令不用背全,但有几类必须熟练。这一章按使用频率排序,把最常用的整理出来,配合真实场景说明什么时候用。
6.1 文件与目录操作
这是最基础也最高频的一类。
| 命令 | 作用 | 常见用法示例 |
|---|---|---|
| ls | 列出目录内容 | ls -lah显示详细信息含隐藏文件 |
| cd | 切换目录 | cd /var/log、cd ~回家目录 |
| cp | 复制 | cp -r 源目录 目标目录 |
| mv | 移动或重命名 | mv 旧名 新名 |
| rm | 删除 | rm -rf 目录(极度危险,慎用) |
| find | 查找文件 | find / -name "*.log" -size +100M |
| du | 统计目录大小 | du -sh *看当前目录下各子项占用 |
| chmod | 改权限 | chmod 755 脚本.sh |
| chown | 改属主 | chown -R 用户:组 目录 |
rm -rf这个命令我要单独强调:它没有回收站,删了就没了。在服务器上执行之前,先确认当前路径(pwd),把命令完整写出来再回车,不要在rm -rf后面跟通配符又不检查。我见过有人想删/tmp/xxx/*,结果多打了一个空格变成/tmp/xxx/ *,直接把根目录下的东西扫了一遍。
find配合du是最好的磁盘排查组合。磁盘满了的时候,先df -h看哪个分区满,然后du -sh /path/* | sort -rh | head -20找到具体是谁占的。
6.2 进程、端口和服务管理
现在的Linux基本都用systemd管理服务,几个命令记牢就够用:
systemctl status 服务名 # 查看状态 systemctl start 服务名 # 启动 systemctl stop 服务名 # 停止 systemctl restart 服务名 # 重启 systemctl enable 服务名 # 设置开机自启 journalctl -u 服务名 -n 100 # 看最近100行日志 journalctl -u 服务名 -f # 实时跟踪日志排查"端口被占用"或"服务起不来",ss命令比netstat更快:
ss -tulnp | grep 8080这行命令能告诉你是哪个进程占了8080端口。如果服务启动失败,先看systemctl status输出,再看journalctl日志,90%的问题日志里都写了原因,只是很多人不看。
进程管理方面,ps aux | grep 关键词找进程,kill -9 PID强杀。但强杀是最后手段,先试kill PID(发送TERM信号让进程自己清理退出),不行再-9。
6.3 磁盘、内存和资源的实时监控
df -h看磁盘、free -h看内存、top或htop看整体负载,这三个是日常巡检的基本动作。
内存这块有个容易被误读的点:free -h里的 "available" 列才是真正可用的内存,不是 "free" 列。Linux会把空闲内存拿去做文件缓存,这是正常且有益的行为,看起来free很少其实不影响使用。真正要担心的是 swap 使用率持续很高,那说明物理内存确实不够了。
负载方面,uptime输出的三个数字是1分钟、5分钟、15分钟的平均负载。判断标准是把它和CPU核数对比:4核机器负载长期在4以上就说明压力大了,15分钟负载比1分钟高说明压力在缓解,反过来就是在恶化。
还有个小技巧,排查"网站变慢了"这类问题,先看dmesg -T | tail -50,内核级别的错误(比如OOM Killer杀进程、磁盘IO错误)都会记录在这里,而且带时间戳。
7. 常见问题排查实录
这一章是我这些年遇到过的、新手最常问的问题,整理成速查表,配上排查思路。
7.1 连接与权限类问题
| 现象 | 排查思路 | 解决方案 |
|---|---|---|
| 服务器连不上,ping也不通 | 云平台控制台看实例状态、安全组 | 检查安全组是否放行、实例是否在运行 |
| 能ping通但SSH连不上 | 检查SSH服务、端口、防火墙 | 控制台VNC登录,systemctl status sshd |
| 提示权限不足无法写入 | 看目标目录属主和权限 | 用sudo或改chown/chmod |
| sudo命令报"不在sudoers中" | 用户没加进sudo/wheel组 | usermod -aG sudo 用户名,需重新登录 |
关于防火墙要再强调一遍层级关系。云平台的安全组 → 系统防火墙(firewalld/ufw)→ 应用本身监听地址。三层任何一层没放行,端口就是不通。排查时从上往下逐层验证,别跳步。ufw的常用操作是sudo ufw allow 8080/tcp,firewalld是sudo firewall-cmd --permanent --add-port=8080/tcp然后sudo firewall-cmd --reload,注意firewalld加了--permanent之后必须reload才生效,这个细节坑过很多人。
7.2 环境与依赖类问题
"命令找不到"是最常见的一类。遇到command not found,按这个顺序查:which 命令名看能不能找到;echo $PATH看路径里有没有包含安装目录;检查环境变量是在~/.bashrc还是/etc/profile里配的,前者只对当前用户和交互式shell生效。改完记得source一下或者重新登录。
"版本不对"的问题,用which -a python3能看到所有同名命令的路径,确认实际调用的是哪一个。多版本共存时,update-alternatives是Linux上统一管理版本切换的标准工具,比手动改软链接规范。
"依赖装不上"通常是两个原因:网络问题(换镜像源)和编译工具缺失(缺 gcc、make、python-devel 这类头文件包)。报错信息里如果出现 "fatal error: xxx.h: No such file or directory",就是缺开发头文件,装上对应的-dev或-devel包即可。
7.3 几点踩过坑才明白的经验
改配置前先备份。这句话听起来老生常谈,但真出事的时候,有没有.bak文件就是能不能五分钟恢复的区别。cp 配置文件 配置文件.bak.日期这个习惯我坚持了很多年。
别在服务器上直接改生产配置做实验。想测试某个参数,先复制一份配置,用另一个端口起一个测试实例验证,确认没问题再动正式的。
日志是最诚实的朋友。遇到任何服务异常,第一反应应该是去看它的日志,而不是去搜索引擎搜报错。因为日志里有你这台机器的具体上下文,而搜索结果里的是别人的环境。journalctl、/var/log/目录、应用自己的日志文件,这三个地方轮流看。
给关键操作加个"确认反射"。执行删除、重启、改权限这类命令之前,停三秒,把命令从右往左再读一遍。这个习惯帮我避免过至少两次灾难性的误操作。
定期看看磁盘。服务器挂掉的原因里,磁盘满了绝对排前三。日志文件、Docker镜像、npm缓存、临时文件都是增长大户。可以写个简单的定时任务,每周把超过30天的日志清一清,比等出事了再救火从容得多。
最后分享一个我很喜欢的小组合:把常用的巡检命令写成一个脚本,放在~/check.sh,需要的时候一把梭:
#!/bin/bash echo "=== 时间 ==="; date echo "=== 运行时长 ==="; uptime echo "=== 磁盘 ==="; df -h | grep -v tmpfs echo "=== 内存 ==="; free -h echo "=== 占资源前5的进程 ==="; ps aux --sort=-%mem | head -6配上chmod +x check.sh,以后登录服务器第一件事就是跑一下,几十秒就能对机器状态心里有数。这个脚本本身很简单,但把"每次都要敲好几条命令"变成"一条命令搞定",长期下来省的时间和精力相当可观。环境配置这件事没有一劳永逸的终点,每次装新东西都是一次小小的踩坑和积累,把这篇文章当成一个起点,比当成一本手册更有用。