1. 任务拆解拿到“期中测试1”后先别急着敲键盘最近收到一份“期中测试1”的实践任务标题虽然简简单单四个字但点开要求才发现内容并不含糊要求独立完成一台Linux服务器的环境初始化、Web服务搭建、远程访问配置和基础排障全部操作有日志记录最终还要写一份复盘文档。说实话这种阶段性的动手测试在运维、开发岗位的培训里非常常见它考的不是死记硬背的指令而是你面对一台裸机时能不能有条不紊地把事情做对、做稳、做可追溯。很多刚入行的朋友一看到这类题目就容易慌要么急着装系统要么乱敲命令结果日志记了一堆却全是报错。这次我就以这份“期中测试1”为例把从环境准备到服务上线的完整过程拆开讲一遍里面包含我自己的操作习惯、踩过的坑和排查思路希望能给同样在准备阶段性动手考核的朋友一些参考。适合看这篇文章的人其实很广刚学Linux基础想找综合练习的初学者、准备运维或DevOps岗位面试需要实战经验的新人还有带团队想设计内部技能考核的组长——按这个流程走一遍基本能把一个人对Linux基础的掌握程度摸个七七八八。回到任务本身我先把它拆成几个看得见摸得着的模块基础环境虚拟机安装Linux发行版网络要能通SSH要能连。用户与权限创建测试账号、设置sudo权限、锁定或禁用不需要的系统账户。Web服务安装并配置Nginx建一个静态测试页保证本机curl能通。防火墙与安全放行必要的端口剩下的全部拒绝确保重启后规则依然有效。文档记录每一步操作、关键输出、遇到的问题都要记录这是评分重点之一。拆完之后你会发现每一块单独拿出来都不算难但串在一起就需要你有清晰的流程感。这也是这类“期中测试”真正的目的——不是考你会不会敲某一条命令而是考你有没有一套完整的、可复用的实施思路。2. 环境准备虚拟机和最小化安装的取舍逻辑2.1 虚拟机平台选型我这次用的是VMware Workstation Pro因为它对初学者最友好快照功能在测试阶段特别实用。你在操作前一定要先给初始状态打个快照命名为“clean-state”。这相当于你写代码前先提交一个初始commit后面不管把环境搞得多乱都能一键回到干净状态。这个习惯在真实生产环境里同样重要——任何变更前先备份或快照是你对自己操作负责的第一步。如果你用的是VirtualBox操作同样可行只是虚拟机网络设置的名字和位置略有差异。我个人建议平时练习就用VMware或VirtualBox哪个顺手用哪个但网卡模式一定要搞清楚这个直接影响后面能不能连通网络。2.2 网络模式选型NAT模式是最稳的起点很多人在虚拟机上栽的第一个跟头就是网络模式。VMware提供三种主要模式桥接模式、NAT模式、仅主机模式。我用列表简单说明一下它们的区别网络模式虚拟机IP获取方式能否访问外网宿主机能否访问虚拟机适用场景桥接模式与宿主机同一局域网由路由器分配能能虚拟机需要被局域网其他机器访问NAT模式由VMware虚拟NAT分配通常为192.168.x.0/24网段能能单机测试、需要联网但不需要被外部访问仅主机模式由VMware虚拟网卡分配否能纯隔离环境模拟内网这次“期中测试1”要求Web服务能通过宿主机浏览器访问但同时不需要被公司局域网其他机器访问所以我选择了NAT模式。它既能保证虚拟机联网安装软件包又能让宿主机访问到虚拟机的Web页面属于最稳妥的起点。如果你在真实机房或云服务器上做类似任务那就不存在这个选择了——云服务器一般都有公网或内网IP但安全组规则一样要仔细放行。2.3 系统安装最小化安装真的好用吗我安装的是CentOS 7.9的minimal版本。为什么选它因为测试题目要求“环境要干净服务要明确”最小化安装意味着系统里只有必要的组件没有桌面环境、没有多余的开发工具这样后面排查问题时背景噪音最小出问题也容易定位。不过这里要提醒一句minimal不是越小越好你要确保安装时勾选了“标准开发工具”这一组。因为后面编译或安装软件时会用到gcc、make这些基础工具如果没有你就得先忍受yum下载依赖时出现的一连串“No package xxx available”的报错。我在第一次做类似任务时就吃过这个亏当时为了装一个Nginx扩展硬是从ISO挂载里补了快十个依赖包才搞定非常浪费时间。分区方面采用LVM方案在安装引导里选择“自动创建分区”但把/home单独分出来并留出足够空间给根目录。因为后续测试日志、打包文件都会放在/root或/var下根目录空间不够的话处理起来很痛苦。分区逻辑很简单/boot: 500MB引导文件专用不需要太大。swap: 建议跟物理内存一致测试机2GB内存就分2GB。/: 剩余全部空间用LVM管理方便后面扩容。分区大小文件系统挂载点说明/boot500MBxfs/boot启动文件勿动/剩余空间xfs/通过LVM管理swap2GBswap无内存交换空间安装完成后第一件事就是改主机名我把它设成了midterm-test-01方便日志和文档里区分。然后关闭SELinux或改为permissive模式——这里多说一句我知道很多安全专家会强调SELinux的重要性但作为阶段测试环境SELinux的严格策略会给Nginx绑端口和文件读写带来额外复杂度。如果你不熟悉SELinux的布尔值调整就先设置成permissive把精力集中在服务本身的配置上。生产环境请务必保留SELinux enforcing并单独学习它的策略配置。3. 用户与权限安全边界是从账号开始的3.1 创建专用测试账号并配置sudo系统装好了第一件事不是装Nginx而是建账号。很多新手一拿到机器就用root干活这在测试题里会直接扣分因为真实生产环境中root登录是被严格限制的。你要养成一个条件反射任何任务都创建一个专用账号按需赋予sudo权限。我创建了一个叫tester的账号密码设置得稍微复杂一些同时把SSH登录的公钥放进去这样后面远程操作时就不需要反复输入密码。具体命令很简单useradd tester passwd tester然后给tester添加sudo权限。我在/etc/sudoers.d/下面单独建了一个文件而不是直接改/etc/sudoers——这样更规范也避免语法错误导致sudo全部失效echo tester ALL(ALL) ALL /etc/sudoers.d/tester chmod 440 /etc/sudoers.d/tester这里的权限模式440是必须的如果权限不对sudo会直接拒绝读取这个文件而且不会给你任何明显的报错提示只是所有sudo命令都卡在权限检查上。这个坑我踩过当时花了十分钟才反应过来是文件权限被改错了。3.2 锁定系统内置账号系统默认有很多内置账号比如lp、sync、shutdown、halt、news、uucp等它们在正常业务中几乎用不到。安全基线要求这些账号不能登录最直接的做法是锁定它们。但注意我并不会全部锁死因为有些是系统服务依赖的系统账户锁错可能导致服务起不来。我采用一个更稳妥的方法查看/etc/passwd把所有shell是/bin/bash或/bin/sh但业务上完全不需要登录的账号把shell改为/sbin/nologin。例如usermod -s /sbin/nologin lp usermod -s /sbin/nologin sync usermod -s /sbin/nologin shutdown usermod -s /sbin/nologin halt usermod -s /sbin/nologin news这种处理方式比直接锁定更优雅——锁定后账号状态变成Locked会中断某些服务的运行而改成nologin则只是禁止交互登录服务自身启动时不受影响。这个细节在面试时讲出来会很加分因为说明你真的理解账号和工作原理的关系。做完这一步用cat /etc/passwd检查一遍确认tester账号的shell是/bin/bash其他无关账号都指向/sbin/nologin。记录下输出截图或复制到文档里方便后期整理报告。4. 核心配置SSH远程管理与网络安全放行4.1 修改SSH配置拒绝裸奔“期中测试1”明确要求远程管理能力所以SSH是必须重点配置的服务。默认的SSH配置有几个明显的隐患允许root直接登录、密码验证次数不限、空闲连接时间无限长。测试要求不高但至少要改掉root登录这个点。我改了/etc/ssh/sshd_config里的几个关键项PermitRootLogin no PasswordAuthentication yes PubkeyAuthentication yes MaxAuthTries 6 ClientAliveInterval 300 ClientAliveCountMax 2PermitRootLogin设为no意味着即使是root用户也只能先用普通账号登录再su或sudo切换到root。这个习惯要从第一天养成。MaxAuthTries限制密码错误次数防止暴力破解刷你的SSH端口。ClientAliveInterval和ClientAliveCountMax组合起来可以在客户端掉线时自动回收连接资源避免挂一堆死连接占着进程。改完配置后记得重启服务systemctl restart sshdrestart和reload的区别也要留意reload只是重新读取配置不中断现有连接适合小幅调整restart会断开所有连接如果人在远程操作时执行了restart且新配置有误你可能就永远登不回去了。所以远程改SSH配置时我建议先执行sshd -t校验语法再reload不要轻易restart。4.2 防火墙规则放行该放的关掉不该开的CentOS 7自带firewalld它的管理逻辑是“区域”默认区域是public。我要做的三件事放行SSH22端口、放行HTTP80端口、默认拒绝其他所有入站流量。systemctl enable --now firewalld firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-servicehttp firewall-cmd --reload这里用--add-service而非--add-port的好处是直观、语义清晰而且firewalld内置的service定义里已经包含了端口和协议的完整描述不容易写错。如果你用了自定义端口那才需要--add-port2222/tcp这样的写法。我特意把--permanent参数写在前面确保规则关机重启后依然存在。很多人在这个环节会漏掉--permanent导致当下测试放行成功但一重启机器规则就全部丢失。而且还会多一个困扰firewalld有运行时配置和持久化配置两套状态如果当时没注意后面复查时看到的可能是“runtime ok”但“permanent empty”这样给考官看到了很尴尬。检查最终规则的命令是firewall-cmd --list-all要能看到services里有ssh和http默认zone是public就说明配置正确。4.3 网络连通性验证SSH和防火墙改完我不急着往下走先做一轮网络验证确认之前所有的改动没有把网络搞坏。验证顺序按照从内到外的路径网卡状态、本机回环、虚拟网关、外网DNS。ip addr show ping -c 3 127.0.0.1 ping -c 3 192.168.31.1 ping -c 3 baidu.com192.168.31.1是我这台虚拟机NAT模式的网关地址实际情况要根据你虚拟机网络的网段来定用ip route查看default via那一条就知道网关是哪个IP。如果外网ping不通首先排查DNS配置检查/etc/resolv.conf是不是有可用的nameserver。如果DNS没问题那就查路由表看default route是否存在。网络问题80%都出在这两个点上别急着重启网卡或者重建虚拟机。5. Web服务实现Nginx部署与静态测试页5.1 用yum安装Nginx别急着编译源码Nginx的安装方式大致有两种用EPEL仓库yum安装或者下载源码手动编译。阶段测试我推荐yum方式理由很实际——你是在考试不是在研究编译细节。用yum安装速度快、依赖管理省心、后续systemctl管理方便足够覆盖题目的全部要求。首先安装EPEL仓库因为CentOS 7默认仓库里没有nginxyum install -y epel-release yum install -y nginx安装完成后不急着启动我先把默认配置检查一遍。nginx.conf里需要确认几个点user nginx; 是运行worker进程的用户这个用户必须在系统里存在且权限正确。server模块至少监听80端口server_name可以先用下划线_占位后续再改。默认的root路径是/usr/share/nginx/html静态页面放这里就行。5.2 自定义静态测试页题目要求输出一个可以访问的页面我用一个简单的index.html内容包含主机名、IP、当前时间这样可以快速验证服务是否真的在响应而不是看到了浏览器缓存的旧页面。!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleMidterm Nginx Test/title /head body h1Nginx is running!/h1 pHostname: midterm-test-01/p pIP Address: 192.168.31.100/p pTime: 2025-01-01 10:30:00/p /body /html把文件保存到/usr/share/nginx/html/index.html后先用nginx自己的语法检查工具确认配置无误再启动服务nginx -t systemctl start nginx systemctl enable nginxnginx -t这一步非常关键它会检查主配置文件和所有include进来的子配置文件如果有语法错误会明确告诉你哪一行出了问题。在你修改过任何nginx配置之后都必须先执行这一步再重启或reload。这就像你改完代码要先编译一样编译过了再运行而不是直接重启进程。然后在本机验证curl -I http://127.0.0.1如果看到HTTP/1.1 200 OK就说明Nginx在工作。再检查一下页面内容是否正确返回curl http://127.0.0.1正常情况你会看到完整的HTML内容。到了这一步虚拟机内部的服务已经通了剩下的就是从宿主机访问验证。5.3 宿主机访问验证打开宿主机浏览器输入虚拟机的IP地址理论上应该看到刚才写好的测试页。如果打不开不要急着怀疑Nginx先按顺序排查在宿主机ping虚拟机IP不通说明网络层有问题检查VMware网卡模式。如果ping通但浏览器打不开检查防火墙是否放行了80端口命令是firewall-cmd --list-all。确认Nginx进程状态systemctl status nginx看是否有报错。最后用ss -tlnp | grep :80确认80端口确实在监听。这个排查顺序是从底层到上层每一层验证通过再往下一层走效率最高。千万别一上来就怀疑是Nginx配置的错很多时候问题根本不在服务本身而是端口被防火墙拦了或者网络模式不对。如果以上都没问题但仍不能从宿主机访问那就要检查SELinux了。在CentOS 7上SELinux处于enforcing模式时即使防火墙放行了80端口httpdNginx进程也可能被SELinux策略阻止绑定端口或读取文件目录。你可以查看/var/log/audit/audit.log里有没有denied记录然后用ausearch -m avc -ts recent检索。作为测试环境最简便的处理方式是暂时设为permissivesetenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config第一行是临时生效重启后失效第二行是永久修改需要重启机器才会全部生效。刚才我提到安装系统时建议直接设置permissive如果你没有设置这里就要记住这个操作。生产环境不要照抄这个做法生产环境应该去学习如何正确配置SELinux布尔值而不是粗暴关闭。6. 常见问题与排查技巧实录6.1 端口放行了但网页还是打不开这是“期中测试1”里最容易出现的现象也是很多人在群里问得最多的问题。明明firewall-cmd --list-all里80端口是放行的curl本机也通但宿主机浏览器就是白屏。我遇到过一次最后定位到问题是VMware NAT模式下的网络策略没选对。VMware虚拟网络编辑器里有一个“对虚拟机启用NAT”的选项如果被取消宿主机虽然能ping通虚拟机但虚拟机的出站流量会走不通导致浏览器发起的HTTP请求到了虚拟机却没有响应。这种情况从虚拟机上curl任何外网地址都无法返回很隐蔽。解决办法打开VMware编辑—虚拟网络编辑器—选中NAT模式—勾选“对虚拟机启用NAT”然后保存。如果你不确定自己是不是这种情况先做一个简单的测试在虚拟机上执行curl -I http://www.baidu.com如果返回响应正常说明出站没问题那问题大概率还是出在防火墙规则上如果出站都不通先检查NAT开关和网卡。6.2 Nginx启动失败syntax is ok但服务起不来另一类高频问题是nginx -t显示syntax is ok但systemctl start nginx却报错失败。查看journalctl -u nginx日志往往是bind() to 0.0.0.0:80 failed (98: Address already in use)。原因通常有两个一是系统里已经装了Apache或其他Web服务占用了80端口二是你自己重复启动过nginx导致老进程没退出。排查命令ss -tlnp | grep :80看到PID后根据进程名决定是停掉它还是杀掉它。如果是其他服务占用要么停掉、要么改nginx端口如果就是nginx自己重复启动那就执行pkill -9 nginx systemctl start nginx这里有一个小知识点虽然nginx作为服务用systemctl管理时理论上不会出现重复启动但如果你在调试过程中直接用nginx命令启动过进程然后再用systemctl启动时可能因为master进程已经在运行而导致新进程无法绑定端口。这个状态还好但容易让初学者误判成配置错误。而且我要强调一个容易忽略的点在CentOS 7上如果同时装了httpd和nginxhttpd可能因为监听80端口而在systemctl层面显示active (running)但它其实用的是IPv6的::不会出现在ss -tln的IPv4输出里。这种情况下curl -I http://127.0.0.1能通但访问IP的IPv4地址却失败非常迷惑。转头去查ss -tln6就能发现真相。6.3 问题排查速查表最后把这次测试过程中可能遇到的问题和排查方向整理成一个速查表方便你直接参考现象可能原因排查命令解决方向宿主机ping不通虚拟机IPVMware网卡模式不对 / 虚拟机网络被停用ip link set ens33 up检查VMware网络模式改为NATSSH连接超时firewalld未放行ssh / sshd未启动firewall-cmd --list-all / systemctl status sshd放行ssh服务启动sshdroot无法远程登录PermitRootLogin nosshd -T | grep permitrootlogin确认配置项生效状态浏览器中打不开Web页面防火墙未放行80 / SELinux拦截 / NAT未启用curl -I http://127.0.0.1 / curl -I http://外网按层级排查防火墙、SELinux、NATNginx启动失败提示端口占用Apache或其他服务占用80端口ss -tlnp | grep :80停用占用进程或改端口sudo命令提示权限不足/etc/sudoers.d下文件权限错误ls -l /etc/sudoers.d/testerchmod 440 /etc/sudoers.d/tester重启后防火墙规则丢失未加--permanent参数firewall-cmd --list-permanent重新添加规则并加--permanentNginx目录读不出文件SELinux策略限制ausearch -m avc -ts recentsetenforce 0 临时排查这类表格在整理测试复盘时非常有用我建议你在自己的报告里也按这个格式去写既方便考官查看也是对自己排查思路的梳理。7. 复盘心得一次“期中测试”真正在考什么这次的“期中测试1”题目本身并不复杂但做完之后我的体会是这种阶段测试真正想检验的不是你会不会用什么工具而是你有没有一套稳定可靠的做事方法。从环境规划、账号创建、网络配置到服务上线每一步都环环相扣。如果你只会在图形界面上点鼠标或者只会背命令但不知道每条命令影响的面执行过程中一定会出现各种稀奇古怪的连锁问题。我个人在实际操作中的体会是把“记录”当作任务的一部分特别重要。每一步操作、每一个输出结果、每一次报错和解决办法都实时记录下来。这不仅是为了最后交一份漂亮的报告更是为了在排查问题时能回溯自己到底做了哪些改动。很多时候你在当前环境里纠结半天的bug往前翻三步就会发现是之前某一条命令留下了隐患。这种习惯在真实生产环境里能救你很多次比任何“xx天精通Linux”都管用。另外快照和备份的重要性再怎么强调也不为过。测试过程中改错了配置、搞坏了系统都不可怕可怕的是没有退路只能从头开始。有了快照每一个节点都可以重来试错成本大大降低。我甚至建议你在每完成一个阶段后就打一个快照比如“after-user-config”、“after-nginx-config”这样一旦后续操作引入问题你能精确回退到上一个健康状态而不是全部重做。最后再分享一个小技巧这类测试的文档质量在一定程度上会比实操结果更影响评分。实操可能因为各种环境因素出现意外但一份条理清晰、步骤完整、包含报错和解决办法的文档能直接向考官证明你是“有思路地操作”而不是“碰巧做对了”。所以从第一台虚拟机装好开始就把每一步记录下来等你写到复盘文档时会发现根本不用额外回忆所有素材都已经整齐地躺在你的日志里了。
