CentOS 7 踩坑实录从搭网站到把系统搞崩再救回来我踩过的坑你们别再踩了26张真实操作截图 | 纯小白第一视角 | 每一个报错都是我亲手踩出来的说实话刚学 Linux 的时候我人是懵的。搭个 Web 服务吧启动半天没反应查半天是端口被占了配个防火墙吧firewalld 和 iptables 两套东西混着搞最后谁也没生效最狠的是瞎操作把 GRUB 引导搞坏了系统直接开不了机当时我人都傻了。这篇就是我把整个流程从头到尾实操一遍的完整记录——Nginx、Apache 怎么搭两套防火墙怎么配甚至把系统引导搞崩了怎么救回来全是我亲手敲命令、亲手踩坑、亲手排错出来的。26 张截图对应每一步跟着走基本不会翻车。一、先整个 Nginx 网站结果一上来就踩坑Nginx 这东西名气大轻量又好用我一开始就想先把它跑起来。结果源码装完发现没法用systemctl管每次都得手动找路径启动巨麻烦。1.1 手写 systemd 服务文件一劳永逸查了半天原来自己编译装的 Nginx 不带服务脚本得自己写一个。文件就放在/usr/lib/systemd/system/nginx.service写完之后就能用systemctl统一启停了。这里我当时踩了个小坑Type一定要写forking不然 Nginx 后台运行之后 systemd 会以为它崩了状态一直不对。1.2 看看服务跑起来没写完服务文件记得先systemctl daemon-reload重载一下不然系统不认。然后查状态systemctl status nginx看到active (running)我才松了口气。这里能看到一个 master 进程加 worker 进程这就是 Nginx 的经典架构主进程管配置干活的是 worker。1.3 设个开机自启本地测一下# 开机自启安排上systemctlenablenginx# 本地 curl 摸一下看通不通curl127.0.0.1重点踩坑预警我当时 curl 完返回的居然是 Apache 的页面给我整懵了搞了半天才反应过来——80 端口早就被 Apache 占了Nginx 根本没绑上 80 端口。解决办法很简单要么先把 Apache 停了要么改 Nginx 的监听端口别两个服务抢同一个端口。1.4 跨机器再验证一遍确保真的通了本地通了不算完我从另一台服务器 ssh 过去再 curl 一下模拟真实内网访问能正常返回 Nginx 默认页面的源码说明网络和服务都没问题。用浏览器直接访问 IP就能看到那个经典的欢迎页到这儿 Nginx 算是真正跑通了中间踩了端口占用的坑印象特别深。二、再整个 Apache还给网站加了个密码锁Apache 虽然老但模块多、配置灵活很多老项目还在用。我特意选了 8080 端口跑它就是怕再跟 Nginx 抢端口。2.1 先放行端口再写个首页改端口第一件事就是去防火墙开端口不然外面死活访问不到。我的操作顺序是这样的先httpd -t检查配置语法Syntax OK就放心了防火墙永久放行 8080然后--reload让规则立刻生效重启 httpd 服务用 echo 随便写了个首页文件丢进去然后再确认一遍端口和页面firewall-cmd --list-ports能看到 8080 就代表放行成功了再 curl 一下能返回我写的文字齐活。2.2 给网站加个密码不是谁都能进我想整个内部网站的效果输账号密码才能看。改一下 httpd 的主配置文件就行这段配置就是给/var/www目录加了一层基础认证里面几个参数我也搞明白了AuthType Basic就是开密码验证AuthName是弹框上显示的提示文字随便写AuthUserFile是存账号密码的文件得用 htpasswd 工具生成Require valid-user意思是只要是文件里的用户都能进配完重启服务再访问网站就会弹密码框了还挺有成就感。2.3 端口占用这个坑我又踩了一遍……没错httpd 我也遇到了启动失败的情况老熟人了看到Address already in use我都麻木了经典端口占用。排错三步走systemctl status httpd看详细报错用ps或者netstat找哪个进程占了端口要么干掉占用的进程要么改自己的端口反正现在我看到这个报错条件反射就知道怎么回事都是踩坑踩出来的。三、防火墙这玩意儿我两套都玩了一遍CentOS 7 默认是 firewalld但很多老教程还在讲 iptables。一开始我两套混着搞乱得一批后来才搞明白不能同时开。3.1 firewalld用区域管权限新手友好firewalld 的核心是区域zone不同区域安全级别不一样不用一条条写规则挺适合新手。我初始化的一套操作先把旧的 iptables 关了禁用掉两套一起开必出问题firewalld 拉起来设开机自启setenforce 0临时把 SELinux 关了——这玩意儿测试的时候特别容易莫名其妙拦截你看看都有哪些区域、默认是哪个测试图省事我直接把默认区域改成trusted所有流量都放行调试方便重载一下生效3.2 想用 iptables先把 firewalld 彻底屏蔽如果就想用传统 iptables 一条条写规则得先把 firewalld 处理干净这里注意光 stop 和 disable 不够最好mask一下不然哪天别的服务顺手给你拉起来了两套防火墙又打架了。然后装iptables-services就能用服务管理 iptables 了。3.3 iptables 黑白名单想拦谁拦谁iptables 就是一条条堆规则精确控制。我试了针对某个 IP 的黑白名单我的操作先把旧规则全清空不然后面越搞越乱加规则放行这个 IP 的 ping但是不让它访问 22 和 80 端口查看规则一定要加--line-numbers带序号不然删改的时候根本找不到第几条用-R可以替换某条规则比如我把 80 改成了 443另一台机器上我还试了删规则iptables -D INPUT 5就是删掉 INPUT 链第 5 条删完再看一眼确认没了就行。3.4 配完防火墙先 ping 一下通不通每次改完防火墙我必 ping 一下不然都不知道自己是不是把自己也拦外面了包全收到、零丢包就放心了。想恢复之前备份的规则也简单iptables-restore导回去就行导完再 ping 测一下新规则效果稳得很。四、手贱删了 GRUB 引导系统崩了又被我救回来了这部分是最刺激的。我本来就是想模拟一下故障结果删完引导文件重启系统直接黑了说实话当时心里还是慌了一下。4.1 先备份再删文件——模拟手贱现场任何高危操作前先备份这句话我现在刻进 DNA 里了。先把grub.cfg备份一份到 /root然后手贱删掉。重启之后果然不出所料系统找不到引导直接挂了。4.2 GRUB 救援模式手动把系统拉起来重启后进入grub命令行全黑屏幕一个光标挺吓人的但其实按步骤来没问题。第一步先找 /boot 分区在哪儿ls看一下所有分区hd0,msdos1是 xfs 格式这就是 boot 分区没跑了。第二步告诉 grub 引导文件在哪儿set root(hd0,msdos1) set prefix(hd0,msdos1)/grub2第三步手动加载内核和镜像启动指定内核文件、根分区再加载 initramfs 镜像最后敲boot回车。说实话第一次成功启动的时候还挺有成就感的有种系统是我亲手拉起来的感觉。4.3 进了急救模式也别怕挂载完就能修如果引导坏得比较彻底会直接进 emergency 模式提示 Switch Root 失败这时候得手动把根分区和 boot 分区都挂上才能进到真正的系统里修东西。先激活 LVM 卷组不然逻辑卷认不出来lvm vgchange -ay激活一下然后去/dev/mapper底下看设备。我当时还遇到设备节点不存在的问题用dmsetup mknodes重建一下就好了都是坑。然后就是挂载分区、切根步骤先把默认的/sysroot卸了把根逻辑卷挂到/sysroot建个 boot 目录把 sda1 挂进去chroot /sysroot一切就进到你自己的系统里了4.4 重装 GRUB生成新的引导文件进到系统里就简单了两条命令搞定# grub 装回系统盘grub2-install /dev/sda# 重新生成配置文件grub2-mkconfig-o/boot/grub2/grub.cfg看到done就稳了。exit 退出 chroot重启系统又活过来了。整个过程从我把系统搞崩了的慌张到一步步救回来学到的东西比看十遍教程都多。五、踩了这么多坑总结几句真心话搭服务就按流程来装软件 → 改配置 → 查语法 → 开防火墙 → 本地测完远程测。按这个走能避开绝大多数低级错误我端口占用的坑踩了两次就是因为没按顺序来。防火墙别两套混用firewalld 和 iptables 选一个用到底同时开两个最后谁拦的你都搞不清楚。测试环境图省事直接 trusted 区域全开生产环境再慢慢细化规则。动系统核心东西先备份grub、分区、系统配置这些改之前先备份一份出问题了直接回滚比啥都强。我这次是故意模拟故障真在生产环境搞崩了哭都来不及。报错别慌先读提示Linux 的报错其实都挺直白的文件不存在、权限不够、端口被占对着报错关键词搜基本都能找到解法。我现在遇到报错第一反应不是慌是先把报错信息读一遍。配图说明全文一共 26 张截图都是按我操作的先后顺序排的你发博客的时候直接按【插入图X】的位置对应插进去就行序号不用调一一对应。