
服务器基础知识先聊点实际的。很多人第一次接触服务器要么是网站突然打不开要么是自己折腾的某个服务半夜挂了然后才开始认真翻文档。我见过太多这样的场景某同学花大价钱买了台配置很猛的服务器结果跑了两个月发现网站还是三天两头卡顿查来查去最后发现是磁盘满了日志文件把几十G空间吃得干干净净。服务器这东西真不是“配置高就行”它有自己的脾气和套路。这篇东西就是想把这些年摸过的坑、总结出来的经验一次性讲清楚从选硬件、装系统、配安全到日常排查问题每个环节我都尽量给你能直接落地的操作而不是扔一堆术语让你自己查。这篇内容适合谁刚入行的运维新手、想自己搭博客跑服务的开发者、以及被公司安排去管服务器但完全没头绪的“兼职运维”。你放心复杂概念我会用大白话讲明白每一步都尽量给具体命令和参数你看完直接照着做就能用。1. 选服务器和攒电脑是两码事硬件指标怎么看1.1 这几种配置分别适合什么场景先把最核心的一件事说清楚同样是“8核16G”的配置价格能差出去好几倍区别就在硬件的“体质”上。CPU、内存、硬盘、带宽这四个维度决定了这台机器能干啥。CPU方面别只看核心数。同样是8核普通桌面级处理器和服务器级处理器在长时间高负载下的稳定性完全是两回事。服务器CPU通常有更大的缓存、支持ECC内存内存纠错而且主频策略更稳不会跑几个小时就过热降频。选配置的时候核心数越多越适合跑虚拟机、容器这类并发场景但如果你只是搭个博客或者做小型应用2核就足够了别浪费钱。内存是另一个容易忽略的点。你以为16G内存就是16G能随便用服务器上各种服务、缓存、数据库加上操作系统本身内存消耗比你想象中快得多。我自己的经验是跑WordPress这类动态站2G内存勉强能跑4G才会有余量跑数据库实例最好8G起步再加上一些Swap空间兜底。硬盘这件事我多说两句因为翻车率最高。机械盘和固态盘的差距体感上是天壤之别。机械盘随机读写性能惨烈跑到数据库这种需要频繁小文件读写的场景简直就是灾难而SSD的4K随机读写性能要高出几个数量级。现在的NVMe固态盘顺序读写随便上千兆每秒日常用起来非常舒服。如果预算有限我建议的折中方案是系统盘和数据盘分开系统盘用SSD冷数据、备份文件放机械盘。下面给一组参考配置对应不同场景你选机器的时候可以对着看场景CPU内存硬盘带宽个人博客/静态站2核2-4G40G SSD3-5M中小型Web应用4核8G80G SSD 500G HDD5-10M数据库/中间件4核16G100G NVMe SSD10M注意这只是一个参考起点实际还是要根据你的业务类型去调整。数据库比Web服务更吃内存和磁盘IO视频站点更吃带宽这些都需要对应加配。1.2 带宽、IP和带外管理租服务器最容易忽略的三件事很多人选服务器时盯着CPU内存硬盘看半天却对带宽和IP这些细节不上心结果买回来一用才发现处处难受。带宽首先要分清是“峰值带宽”还是“保证带宽”。不少便宜套餐标的是峰值带宽意思是短时间可以冲到上限但长时间跑满可能会被限制。别只听商家宣传“独享XX兆”你要真想验证可以拿到机器后用工具测一下持续下载速度对比一下标称值心里就有数了。IP这块如果你打算建站或者跑对外服务公网IP的数量和类型一定要确认好。IPv4地址资源紧张有些套餐默认不给你独立公网IP或者需要额外购买买之前一定要问清楚。还有个小细节有些机房给的IP属于“被墙”风险较高的段虽然这属于玄学范畴但如果你做的是跨境业务尽量挑一个口碑比较好的IP段别等上线了发现访问不畅再折腾迁移。带外管理这个名词新手可能陌生但它是服务器稳定运行的关键保障。专业术语叫IPMI或者iLO/iDRAC通俗讲就是服务器即使系统崩了、网络断了你还是可以通过一条独立的管理通道看到硬件状态、远程开关机。咱们平时买的云服务器云控制台里那个“远程VNC”、“强制重启”按钮底层就是这套东西。自己物理机也要确保能连上带外管理口不然系统挂了连不上只能跑去机房物理操作那就麻烦了。2. 装完系统只是开始登录后必做的六件事2.1 系统选什么版本怎么选很多新手上来就选最新的版本觉得新的一定好这其实是个误区。服务器讲究的是稳定压倒一切你用一台刚出的新版系统去跑业务万一遇到不兼容的软件那真是叫天天不应。Linux发行版主要分两大派系Debian系和RHEL系。Debian系代表是Debian、Ubuntu特点是包管理用apt版本更新快社区资料多我个人觉得对新手更友好。RHEL系的CentOS、Rocky Linux、AlmaLinux包管理用yum/dnf特点是特别稳很多企业生产环境都用这个系但相对“保守”一些软件版本偏老。怎么选纯粹自用、想省心就选Debian系如果是企业项目或者以后要考证照方抓药那建议直接上Rocky Linux这类RHEL系和商业环境保持一致。安系统的时候记住一个原则最小化安装。别把图形界面装上别把一堆用不上的组件都勾上。服务器是拿来跑服务的不是拿来当桌面电脑用的多装一个组件就多一个潜在漏洞入口也多占一份系统资源。纯命令行环境干净利落后面出问题排查起来也简单。2.2 改SSH配置第一步就要做的安全加固装好系统第一件事就是通过SSH连上去。但很多新手不知道默认的SSH配置到处都是安全隐患root用户可以密码登录默认端口是22全世界扫描机器人每天都在盯着这个端口试密码。我自己的服务器装完系统不到十分钟日志里就能看到大量来自各地的密码爆破尝试。所以第一步生成密钥对把SSH登录方式改成密钥认证。# 在本地电脑生成密钥对 ssh-keygen -t ed25519 -C your_comment # 把公钥上传到服务器先假设你还能密码登录 ssh-copy-id rootyour_server_ip然后修改服务器上的SSH配置。打开 /etc/ssh/sshd_config把这几项改掉# 禁止root直接密码登录用密钥登录root没问题 PermitRootLogin prohibit-password # 禁止密码登录只用密钥 PasswordAuthentication no # 换个非默认端口比如2222能少一大半扫描攻击 Port 2222 # 只允许指定用户登录可选 AllowUsers yourname改完之后重启SSH服务systemctl restart sshd。这里我踩过一个坑改端口之后如果系统开启了SELinux而你没有给新端口打标签那SSH服务可能直接起不来。如果用的是CentOS/Rocky这类带SELinux的系统记得执行semanage port -a -t ssh_port_t -p tcp 2222先把新端口放行。改配置的时候也留一手别把自己锁在外面保持当前SSH连接不要断开然后开一个新窗口去测试新配置确认能登录了再关闭旧连接。2.3 更新系统、时区、Swap和基础工具SSH加固完顺手把下面这几件事做了都是以后能省大事的。更新系统。Debian系执行apt update apt upgradeRHEL系执行yum update。这个操作把系统补丁和软件源刷新一遍别嫌麻烦跳过很多安全漏洞都是靠这一步堵上的。我建议你养成习惯每个月初手动执行一次或者用unattended-upgrades这类工具做自动安全更新。设置时区。服务器默认时区往往是UTC你计划任务里写个2点执行结果发现是北京时间早上10点跑的这种错乱很烦人。执行timedatectl set-timezone Asia/Shanghai就把时区切到北京时间了。检查一下Swap。内存不够用的时候Swap能顶一下避免进程直接被系统杀掉。如果没有Swap可以用下面方式创建fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入/etc/fstab实现开机自动挂载 echo /swapfile none swap sw 0 0 /etc/fstab最后装几个常用基础工具比如curl、wget、htop、lsof、git、vim这些后面排查问题时都是趁手兵器一次装上省得临时找。3. 跑个服务在服务器上理解进程、端口和systemd3.1 怎么判断服务真的起来了新手最常遇到的情况是明明按照教程把Nginx装好了网页就是打不开然后就懵了。其实排查的思路非常清晰先看服务进程在不在再看端口有没有监听最后看防火墙有没有放行。看服务状态用systemd现在主流的Linux版本都用它管理系统服务。systemctl status nginx可以看到服务是不是active状态有没有报错信息。如果服务没起来有时候状态里就直接显示原因了。看端口监听用ss -tlnp这个命令它会列出所有监听中的TCP端口以及对应的进程。如果Nginx正常你应该能看到:80或者:443在监听。看不到端口说明服务根本没在监听看得到端口但外面访问不通那就检查防火墙。防火墙这块Debian系常用ufwRHEL系常用firewalld。原则就是默认拒绝放行必须的服务。以ufw为例# 先设置默认策略拒绝所有入站 ufw default deny incoming # 放行SSH端口注意改成你自己的端口 ufw allow 2222/tcp # 放行Web服务 ufw allow 80/tcp ufw allow 443/tcp # 启用防火墙 ufw enable这个习惯非常重要很多机器被入侵就是因为在防火墙上开了大口子。你要记住只开业务必需的端口其他的一律关掉。3.2 用Docker还是不用Docker这是个问题现在部署个服务Docker几乎是绕不开的话题。我的看法是个人项目、中小型应用用Docker确实能省不少心特别是环境隔离这一点实在是太香了。你不用再担心“在我本地上跑得好好的怎么到服务器上就报错”这种环境差异问题了镜像打包好到哪都能跑。但Docker不是银弹新手有几个坑特别常见。第一个坑是数据丢失。容器是你随手就能删掉重建的东西如果你把数据写在容器内部一旦容器被删除数据就没了。所以我反复强调数据库文件、应用上传的图片、生成的临时文件这些必须通过卷volume挂载到宿主机上。启动容器时加上-v /host/path:/container/path参数把数据目录映射到宿主机这样容器删了数据还在。第二个坑是容器日志无限增长。Docker默认把容器日志以json格式存到宿主机不做轮转的话几个月下来日志就能吃掉几十G磁盘空间。我就是在这上面吃过亏。解决办法可以在启动容器时加上日志限制参数docker run -d \ --log-driver json-file \ --log-opt max-size10m \ --log-opt max-file3 \ your_image或者直接修改Docker的全局配置在 /etc/docker/daemon.json 里加上{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }第三个坑是容器重启策略。记得给关键容器加上--restart always参数否则服务器一旦重启Docker服务虽然会自动启动但容器不会自己跟着起来你的服务就静悄悄地挂了等到用户反馈才发现就晚了。4. 安全别靠运气防火墙、权限和备份三板斧4.1 最小权限原则别一上来就全用root很多新手拿到服务器习惯性用root账号干所有事装包用root跑服务用root这个习惯非常不好。万一某个服务被攻破攻击者直接就拿下了root权限整台机器就彻底沦陷了。正确的做法是创建一个普通用户给它sudo权限日常操作都用这个用户来做# 创建新用户并加入sudo组 useradd -m -s /bin/bash yourname usermod -aG sudo yourname # Debian系 # RHEL系执行 usermod -aG wheel yourname passwd yourname然后各种服务尽量用专用用户跑比如Nginx的worker进程、数据库服务都有自己的系统账号这样即使某个服务被攻破能做的事情也极其有限。目录权限也注意一下别动不动就chmod 777给到755、750就差不多了数据目录600、700都行。文件和目录权限的配置别嫌麻烦这是最后一道物理防线。权限给错了可能一个人就能把你的数据打包拖走。4.2 日志、备份和恢复演练网络安全这件事上备份的重要性甚至大于主动防御。硬件会坏机房会断电人会误操作事情发生了你才发现没备份那才叫真绝望。业界的3-2-1备份原则就三句话数据至少保留3份副本存储在2种不同的介质上其中1份放在异地。落实到个人服务器上怎么操作我建议这样核心数据数据库、配置文件、上传文件每天本地打包一次然后定期同步到云存储或者另一台机器上。用rsync做增量备份是性价比很高的方案# 本地备份先打包数据库 mysqldump -u root -p yourdb /backup/yourdb_$(date %F).sql # 用rsync同步到远程存储 rsync -avz /backup/ your_remote_host:/remote/backup/然后写个crontab定时任务比如每天凌晨3点执行备份脚本0 3 * * * /opt/scripts/backup.sh /var/log/backup.log 21备份最怕的是什么是备份本身是坏的。所以我一直强调一件事备份必须定期演练恢复。你辛辛苦苦备份了半年真出了问题恢复不了那备份就等于零。我的习惯是每个月挑一天从备份里恢复一个测试库到临时目录验证一下数据完整性和可恢复性。这个过程不难但这一步的价值比你买任何安全设备都高。5. 排查问题是有套路的几个真实翻车现场5.1 磁盘满了网站诡异卡死这是所有服务器问题里最常见的一个也是新手最容易懵的一个。症状很有意思网站打开慢、数据库连不上、SSH登录要半天各种莫名其妙的问题同时出现但表面上看不出什么异常。排查第一步用df -h看磁盘整体占用情况。如果输出里某个分区到了90%甚至100%恭喜你找到嫌疑人了。第二步用du -sh /var/log/*之类的方式看看到底是谁在吃空间。按我的经验日志文件占大头的概率极高特别是Nginx访问日志、系统日志、以及Docker容器日志。清理手段按轻重缓急来。日志文件直接清空或删除用journalctl --vacuum-size200M可以把systemd日志压缩清理到200M。如果是Nginx的访问日志可以在nginx配置文件里加日志轮转或者干脆把日志级别调低。还有一个非常隐蔽的坑文件被删了但空间没释放。你用df -h看到磁盘还是满的但du -sh /*找来找去就是找不到大文件。这种情况一般是有进程还握着那个已删除文件的句柄。用lsof L1可以列出这类文件把对应的进程重启一下空间就恢复了。这个坑我踩过好几次排查思路一定要记住。5.2 SSH连不上了别慌按这个顺序查某天你突然发现SSH连不上服务器了第一反应别慌也先别急着重启机器。按照下面这个顺序从上往下排查第一步ping一下服务器确认网络通不通。ping不通那就是网络层面的问题比如服务器宕机、机房网络故障。ping得通继续往下走。第二步检查端口通不通。用nc -vz your_server_ip 2222试探一下你的SSH端口是否开放。端口不通可能是防火墙把端口封了也可能是SSH服务挂了还可能服务器被人攻击了在疯狂占资源。第三步端口通但连不上或者提示密码错误就去服务器控制台看日志。Debian系日志在/var/log/auth.logRHEL系在/var/log/secure。这里面会告诉你登录失败的具体原因。另一个常见情况是fail2ban这类工具把IP封了如果之前登录失败次数太多它会把你的IP拉黑一阵子这个可以用fail2ban-client status sshd查看。整个过程的核心思路就是一层一层定位从网络层到传输层到应用层别上来就重装系统。5.3 CPU和内存打满怎么判断是谁干的服务器突然变慢了怎么找出“凶手”我最常用的命令组合是top、free、vmstat。先跑一下top按CPU使用率排序看看是哪个进程在吃CPU。如果是PHP-FPM或者Java这类进程CPU飙高一般是业务流量上来了或者代码里出现了死循环。按P键可以按CPU排序按M键按内存排序。再看内存free -h会显示总内存、已用、可用以及Swap的使用情况。很多新手看到“已用”很高就慌其实那部分是系统缓存buff/cache是可以随时释放的真正要关注的是“可用”available这一列。如果available长期低于20%Swap使用率一直在增长说明内存真的不够了。vmstat这个命令可以看到更细的系统整体状态重点关注si和so两列如果频繁有Swap换入换出说明物理内存严重不足系统在频繁“倒腾”内存页面这种情况加内存是根治办法临时缓解就调高Swap或者砍掉一些非必要服务。还有一个容易被忽略的角落dmesg | tail或者journalctl -k里常能翻到被系统OOM杀掉的进程记录。日志里写了哪个进程被杀那你排查的方向就有了要么是进程真的一次性申请了太多内存要么就是内存碎片化导致无法分配连续内存。网上很多教程教你看free -m就够了但按照我这个组合拳来基本能定位90%的卡顿问题。最后再分享一点个人心得。管理服务器这几年下来最深的体会是大部分事故都是“懒”出来的懒得做备份、懒得配防火墙、懒得跟踪日志。服务器不会平白无故出问题每一次故障背后都有一个被忽略的小细节。每次出问题别急着甩锅给服务商先老老实实翻日志、看监控找到根因下次才能真的避开。你若把这些基础功练扎实了服务器其实是很老实的东西你给了它该有的关注它就能踏踏实实给你干活。