CentOS 8 Apache部署:dnf、systemd、firewalld与SELinux四件套实战

CentOS 8 Apache部署:dnf、systemd、firewalld与SELinux四件套实战

1. 项目概述:在 CentOS 8 上部署 Apache Web 服务器,不是“装个包”那么简单

你搜到“Установка веб-сервера Apache в CentOS 8”(俄语,意为“在 CentOS 8 上安装 Web 服务器 Apache”),点进来大概率是刚配好虚拟机、刚下载完 CentOS 8 Stream ISO、或者正卡在dnf install httpd后打不开http://localhost的人。别急——这不是一个“执行三行命令就能跑通”的玩具实验,而是一次典型的生产级基础服务部署。Apache 在 CentOS 8 上的安装逻辑,和你在 Ubuntu 或 Windows 上装 XAMPP 完全不同:它不自带 PHP、不默认开防火墙端口、不自动启用 SELinux 策略、甚至不默认启动服务。你看到的httpd包,只是 Apache HTTP Server 的核心二进制与最小配置集;真正让它对外提供网页服务的,是背后一整套系统级协同机制:systemd 的单元管理、firewalld 的区域策略、SELinux 的上下文标签、以及/etc/httpd/conf.d/下模块化配置的加载顺序。我带过十几期 Linux 运维实训,90% 的新手第一次失败,不是因为命令输错了,而是把systemctl start httpd当成终点,却没意识到systemctl enable httpd才是让服务开机自启的必要动作,更没人告诉他们firewall-cmd --permanent --add-service=http这条命令里--permanent不加,重启后防火墙规则就清零了。这篇文章不讲“Apache 是什么”,也不堆砌 RFC 文档,只聚焦一件事:用 CentOS 8 原生方式,从裸系统开始,一步不跳、一环不漏地把一个可访问、可维护、符合 Red Hat 生产规范的 Web 服务器立起来。适合刚接触 RHEL 系生态的运维新人、需要快速搭建测试环境的开发同学,以及正在备考 RHCSA 的考生——所有内容均基于真实物理机与 VMware Workstation 17 下 CentOS 8.5 Stream 镜像实测,配置项全部标注来源与作用,参数值全部给出计算依据,连 SELinux 模式切换都说明白“为什么不能直接setenforce 0”。

2. 整体设计思路与方案选型解析:为什么必须用 dnf + httpd + firewalld + SELinux 四件套

2.1 放弃旧思维:CentOS 8 不再支持 yum,dnf 是唯一正统包管理器

很多人习惯性敲yum install httpd,结果得到Command 'yum' not found的报错。这不是环境没配好,而是 CentOS 8 彻底移除了 yum 命令(仅保留符号链接指向 dnf)。dnf 是 yum 的下一代替代品,底层使用 libsolv 算法,依赖解析速度提升 3 倍以上,冲突检测更严格。比如当你执行dnf install httpd时,dnf 会自动拉取httpd-tools(含 ab 压力测试工具)、apr(Apache 可移植运行时库)、pcre(正则表达式引擎)等 12 个强依赖包,并验证每个 RPM 包的 GPG 签名是否来自 CentOS 官方密钥(/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial)。如果你强行用rpm -ivh手动装 httpd.rpm,会立刻报Failed dependencies: apr >= 1.6.3 is needed—— 这就是 dnf 的价值:它不是“装软件”,而是“构建可运行的软件生态”。我试过在一台离线服务器上用dnf download --resolve httpd提前缓存所有依赖,再用dnf localinstall *.rpm安装,整个过程耗时 47 秒,比手动凑包快 5 倍以上。

2.2 服务管理必须用 systemd:systemctl 不是语法糖,而是状态机控制核心

CentOS 8 全面采用 systemd 替代 SysV init。systemctl start httpdservice httpd start表面效果一样,但底层逻辑天壤之别。前者调用的是/usr/lib/systemd/system/httpd.service单元文件,其中定义了Type=notify(要求 Apache 主进程通过 sd_notify() 主动上报就绪状态)、RestartSec=10(崩溃后 10 秒重启)、LimitNOFILE=65536(限制最大文件描述符数)等 17 项关键策略。而后者只是调用/etc/init.d/httpd脚本,该脚本在 CentOS 8 中已被标记为 deprecated(已废弃),且无法触发After=network.target这类依赖链。实测发现:若用 service 命令启动 httpd,当网络未就绪时服务会静默失败;而 systemctl 会等待 network.target 就绪后再启动,失败时还会记录journalctl -u httpd --since "2 hours ago"的完整上下文。这就是为什么所有官方文档都强制要求用 systemctl——它不是命令替换,而是运维范式的升级。

2.3 防火墙必须用 firewalld:iptables 规则已由 firewalld 动态托管

CentOS 8 默认禁用 iptables-services,转而使用 firewalld 作为前端管理器。firewall-cmd --add-port=80/tcp看似简单,实则触发三层操作:1)在/etc/firewalld/zones/public.xml中追加<port protocol="tcp" port="80"/>;2)调用 nftables 内核模块生成对应规则(nft list chain inet firewalld filter_IN_public可验证);3)向 D-Bus 总线广播org.fedoraproject.FirewallD1.reload事件通知所有监听者。如果你绕过 firewalld 直接写iptables -I INPUT -p tcp --dport 80 -j ACCEPT,重启 firewalld 服务时这条规则会被自动清除——因为 firewalld 认为这是“外部篡改”,会强制恢复 zone 配置。我踩过的坑是:某次调试时用 iptables 开了 8080 端口,第二天发现网站打不开,查日志才发现 firewalld 重启后把自定义规则全干掉了。正确做法永远是firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload--permanent参数本质是写入 XML 配置文件,--reload才是真正下发到内核。

2.4 SELinux 必须保持 enforcing 模式:关闭它等于裸奔

网上大量教程教人setenforce 0或修改/etc/selinux/config,这是最危险的操作。SELinux 在 CentOS 8 中默认为 enforcing 模式,其核心机制是:每个进程、文件、端口都被打上安全上下文标签(如system_u:object_r:httpd_exec_t:s0),策略引擎实时校验访问行为是否符合httpd_can_network_connect等布尔值规则。当你把网站文件放在/home/user/www目录下,即使 chmod 755,Apache 也会因avc: denied { read } for pid=1234 comm="httpd" name="index.html" dev="sda1" ino=5678 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file报错而拒绝服务——这是 SELinux 在阻止越权读取用户家目录。解决方案不是关 SELinux,而是用semanage fcontext -a -t httpd_sys_content_t "/home/user/www(/.*)?" && restorecon -Rv /home/user/www重新标记上下文。我统计过 32 个真实故障案例,76% 的“页面 403 错误”根源是 SELinux 上下文错误,而非权限数字不对。记住:SELinux 不是障碍,而是你的第一道纵深防御。

3. 核心细节解析与实操要点:从安装到可访问的 7 个关键环节

3.1 环境确认:三步验证系统状态,避免后续所有无效操作

在敲任何安装命令前,必须完成三项原子级检查。这不是形式主义,而是 Red Hat 官方排障流程的第一步。

第一步:确认系统版本与仓库状态
执行cat /etc/redhat-release应输出CentOS Linux release 8.5.2111或类似;执行dnf repolist必须看到appstream,baseos,epel(若启用 EPEL)三个核心仓库处于 enabled 状态。如果baseos显示 disabled,说明你安装时未勾选“Software Development Tools”或仓库配置被破坏。修复命令为dnf config-manager --set-enabled baseos appstream。注意:dnf repolist --all会列出所有仓库(包括 disabled 的),但只有 enabled 的才参与包搜索。

第二步:验证网络与 DNS 解析
运行ping -c 3 mirror.centos.org测试外网连通性;执行nslookup mirror.centos.org确认 DNS 正常。CentOS 8 默认使用 systemd-resolved 作为本地 DNS 缓存,其配置文件/etc/systemd/resolved.confDNS=行必须包含有效地址(如114.114.114.114)。曾有学员因虚拟机 NAT 模式下 DNS 设置为192.168.122.1(libvirt 默认网关)但该网关未开启 DNS 转发,导致dnf makecache卡死 10 分钟。

第三步:检查 SELinux 与防火墙初始状态
sestatus输出中Current mode:必须为enforcingMode from config file:应为enforcingfirewall-cmd --state必须返回running。如果 firewall-cmd 报错not running,执行systemctl start firewalld && systemctl enable firewalld。这三步耗时不到 30 秒,却能规避 85% 的“安装成功但无法访问”问题。

提示:将这三步写成check-env.sh脚本,每次新环境部署前先运行。内容仅四行:cat /etc/redhat-release; dnf repolist | head -5; ping -c 1 mirror.centos.org &>/dev/null && echo "Network OK" || echo "Network FAIL"; sestatus | grep "Current mode"。实测比人工检查快 3 倍,且无遗漏。

3.2 安装与基础配置:httpd 包的隐藏依赖与主配置文件结构

执行dnf install httpd -y后,实际安装的 RPM 包共 15 个,其中最关键的三个是:

  • httpd-2.4.37-43.module_el8.5.0+862+eeaf69b9.x86_64:主程序包,含/usr/sbin/httpd二进制与/etc/httpd/conf/httpd.conf
  • httpd-tools-2.4.37-43.module_el8.5.0+862+eeaf69b9.x86_64:含ab(Apache Bench)、htpasswd(密码文件生成)等工具
  • mod_ssl-2.4.37-43.module_el8.5.0+862+eeaf69b9.x86_64:SSL/TLS 模块,提供 HTTPS 支持

/etc/httpd/conf/httpd.conf是 Apache 的心脏,但它的结构远非“一堆配置项”。全文 1248 行,按功能分为 7 大区块:

  1. 全局环境(第 33-120 行):定义ServerRoot,Listen,User,Group等进程级参数
  2. 主模块加载(第 123-180 行):LoadModule指令按顺序加载mpm_event,authz_core,log_config等核心模块
  3. 主服务器设置(第 183-320 行):ServerAdmin,DocumentRoot,DirectoryIndex等网站级参数
  4. 日志系统(第 323-370 行):ErrorLog,CustomLog,LogLevel控制日志行为
  5. MPM(多路处理模块)配置(第 373-420 行):<IfModule mpm_event_module>块定义StartServers,MaxRequestWorkers等并发参数
  6. 主目录权限(第 423-480 行):<Directory "/var/www">块设置Require all granted等访问控制
  7. 虚拟主机模板(第 483-520 行):<VirtualHost *:80>示例,实际需自行编写

关键参数详解:

  • Listen 80:Apache 监听 80 端口,但注意——这只是应用层绑定,还需 firewalld 开放该端口,且 SELinux 允许 httpd 绑定网络端口(setsebool -P httpd_can_network_bind 1
  • User apache:工作进程以apache用户身份运行,该用户由httpd-tools包创建,UID 48,GID 48,无登录 shell,符合最小权限原则
  • DocumentRoot "/var/www/html":网站根目录,但注意 SELinux 上下文必须为httpd_sys_content_t,否则 403 错误

注意:不要直接修改httpd.conf主文件!Red Hat 官方最佳实践是将自定义配置放入/etc/httpd/conf.d/目录,以.conf结尾(如my-site.conf)。Apache 启动时按字母序加载该目录下所有文件,覆盖主配置中的同名指令。这样既便于版本管理,又避免升级时httpd.conf.rpmnew覆盖你的修改。

3.3 服务启停与状态监控:systemctl 的 5 个必知子命令

systemctl是管理 httpd 服务的唯一接口,掌握以下 5 个子命令即可应对 95% 场景:

  1. systemctl start httpd:启动服务。注意:此命令不阻塞终端,启动后立即返回。若需等待服务就绪,加--wait参数(systemctl start --wait httpd),它会轮询systemctl is-active httpd直到返回active

  2. systemctl status httpd:查看服务状态。输出中重点关注三行:Active:行显示active (running)failedMain PID:行显示主进程 ID(如1234);CGroup:行显示资源组路径。若状态为failed,执行journalctl -u httpd -n 50 --no-pager查看最近 50 行日志,错误通常在最后一行。

  3. systemctl enable httpd:设置开机自启。本质是创建符号链接/etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service。没有这步,重启后服务不会自动启动。

  4. systemctl restart httpd:重启服务。等价于stop+start,但更安全——它会先发送 SIGTERM 给主进程,等待 90 秒(默认TimeoutStopSec)后若未退出再发 SIGKILL。

  5. systemctl reload httpd:重载配置。当修改/etc/httpd/conf.d/*.conf后,执行此命令让 Apache 重新读取配置文件,无需中断现有连接。原理是主进程 fork 新子进程加载新配置,待新进程就绪后,平滑切换请求处理权。

实操技巧:用systemctl list-units --type=service | grep httpd可查看所有 httpd 相关单元(如httpd.service,httpd@.service实例模板),避免误操作。

3.4 防火墙配置:firewalld 的 zone 机制与服务抽象

CentOS 8 的 firewalld 采用 zone(区域)模型,每个 zone 对应一套预定义规则集。publiczone 是默认区域,适用于不受信任的公共网络。开放 HTTP 服务的本质,是将http服务(预定义端口 80/tcp)添加到publiczone 的允许列表中。

执行firewall-cmd --permanent --add-service=http后,firewalld 会:

  • /etc/firewalld/zones/public.xml中添加<service name="http"/>
  • http服务定义在/usr/lib/firewalld/services/http.xml,内容为<port protocol="tcp" port="80"/>
  • 执行firewall-cmd --reload后,firewalld 解析 XML,生成 nftables 规则:nft add rule inet firewalld filter_IN_public tcp dport 80 accept

但注意:--add-service=http只开放 80 端口,若需 HTTPS,则必须--add-service=https(对应 443 端口)。更灵活的做法是直接开放端口:firewall-cmd --permanent --add-port=8080/tcp,适用于自定义端口场景。

验证是否生效:firewall-cmd --list-all输出中,services:行应包含httpports:行应为空(若用服务方式)或含8080/tcp(若用端口方式)。

提示:生产环境建议创建专用 zone。例如firewall-cmd --permanent --new-zone=webserver创建webserverzone,再firewall-cmd --permanent --zone=webserver --add-interface=eth0将网卡绑定到该 zone,最后firewall-cmd --permanent --zone=webserver --add-service=http。这样即使publiczone 被攻破,webserver zone 仍受独立策略保护。

3.5 SELinux 上下文管理:从 avc denied 日志到永久修复

当 Apache 无法读取网站文件时,/var/log/audit/audit.log中会出现形如type=AVC msg=audit(1678890123.456:789): avc: denied { read } for pid=1234 comm="httpd" name="index.html" ...的日志。这是 SELinux 的审计消息,必须解析才能修复。

第一步:提取关键字段

  • comm="httpd":发起访问的进程名
  • name="index.html":被拒绝访问的文件名
  • scontext=system_u:system_r:httpd_t:s0:源上下文(httpd 进程)
  • tcontext=unconfined_u:object_r:user_home_t:s0:目标上下文(文件所在目录)
  • tclass=file:目标类型为文件
  • perm={ read }:被拒绝的操作是读取

第二步:确定正确的目标上下文
网站静态文件应使用httpd_sys_content_t类型。执行ls -Z /var/www/html/查看当前上下文,正常应为system_u:object_r:httpd_sys_content_t:s0 index.html。若显示user_home_t,说明文件来自用户家目录,需重标。

第三步:永久修复

  1. 临时修复(重启后失效):chcon -t httpd_sys_content_t /var/www/html/index.html
  2. 永久修复(推荐):semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"添加正则规则,再restorecon -Rv /var/www/html应用。-Rv参数表示递归(-R)并显示详细过程(-v)。

注意:semanage命令需安装policycoreutils-python-utils包(dnf install policycoreutils-python-utils)。若提示command not found,说明该工具未安装,必须先装。

3.6 网站内容部署:DocumentRoot 权限与测试页生成

/var/www/html是默认网站根目录,但权限设置有严格要求:

  • 目录权限:drwxr-xr-x(755),属主root:root
  • 文件权限:-rw-r--r--(644),属主root:root
  • SELinux 上下文:system_u:object_r:httpd_sys_content_t:s0

执行ls -ld /var/www/html验证目录权限,ls -l /var/www/html验证文件权限。若权限错误,用chmod 755 /var/www/htmlchmod 644 /var/www/html/index.html修正。

生成测试页最稳妥的方式是用echo命令:

echo '<html><head><title>CentOS 8 Apache Test</title></head><body><h1>It works on CentOS 8!</h1><p>Server: $(hostname -f)</p></body></html>' > /var/www/html/index.html

注意:不要用图形化编辑器(如 gedit)直接保存,可能引入 BOM 头或换行符问题。用file -i /var/www/html/index.html检查编码应为utf-8dos2unix /var/www/html/index.html可清除 Windows 风格换行符。

3.7 本地与远程访问验证:curl 与浏览器的双重确认

本地验证(服务器本机):

  • curl -I http://localhost:检查 HTTP 头,应返回HTTP/1.1 200 OKContent-Type: text/html; charset=UTF-8
  • curl http://127.0.0.1:获取页面内容,确认 HTML 渲染正确
  • ss -tlnp | grep :80:验证 httpd 进程确实在监听 80 端口,输出应含LISTEN 0 128 *:80 *:* users:(("httpd",pid=1234,fd=4))

远程验证(客户机):

  • ping <server-ip>确认网络可达
  • telnet <server-ip> 80测试端口连通性(若 telnet 未安装,用nc -zv <server-ip> 80
  • 浏览器访问http://<server-ip>,观察是否显示测试页

若远程无法访问但本地正常,90% 是防火墙问题:检查firewall-cmd --list-all是否包含http,并确认客户机与服务器在同一网络段(如 VMware 中客户机需设为 NAT 模式,且 VMware Network Adapter VMnet8 已启用)。

4. 实操过程与核心环节实现:从零开始的完整部署流水线

4.1 准备阶段:虚拟机配置与系统初始化(耗时约 8 分钟)

我使用 VMware Workstation 17 创建 CentOS 8.5 Stream 虚拟机,配置如下:

  • CPU:2 核(满足 httpd 最小需求)
  • 内存:2GB(httpd默认内存占用约 15MB,但需预留系统开销)
  • 硬盘:20GB(httpd包及依赖仅占 32MB,但需空间存放日志与网站文件)
  • 网络:NAT 模式(确保vmnet8适配器启用,IP 段为192.168.122.0/24

安装完成后,首先进入 root 用户,执行初始化命令:

# 更新系统(重要!修复已知漏洞) dnf update -y # 安装基础工具(vim、wget、net-tools 等) dnf groupinstall "Development Tools" -y dnf install vim-enhanced wget net-tools -y # 配置时区与时间同步 timedatectl set-timezone Asia/Shanghai timedatectl set-ntp true # 关闭 swap(Apache 对 swap 敏感,生产环境建议关闭) swapoff -a sed -i '/swap/d' /etc/fstab

实操心得:dnf update必须在安装 httpd 前执行。曾有学员跳过此步,安装的httpd-2.4.37-21存在 CVE-2021-44790 漏洞,更新后升至httpd-2.4.37-43修复。swapoff是经验之谈——当内存不足时,Linux 会将 httpd 进程页换出到 swap,导致请求响应延迟飙升至秒级,用户感知为“网站卡死”。

4.2 安装与配置阶段:7 步完成 Apache 部署(耗时约 3 分钟)

按顺序执行以下命令,每步均有明确目的:

  1. 安装 httpd 及其工具集

    dnf install httpd httpd-tools -y

    验证:rpm -qa | grep httpd应输出httpd-2.4.37-43...httpd-tools-2.4.37-43...

  2. 启用并启动服务

    systemctl enable httpd systemctl start httpd

    验证:systemctl is-active httpd返回active

  3. 开放防火墙端口

    firewall-cmd --permanent --add-service=http firewall-cmd --reload

    验证:firewall-cmd --list-services | grep http应输出http

  4. 检查 SELinux 状态并授权网络绑定

    sestatus | grep "Current mode" setsebool -P httpd_can_network_bind 1

    setsebool -P-P参数表示永久生效(写入/etc/selinux/targeted/modules/active/booleans.local

  5. 生成测试页

    echo '<!DOCTYPE html><html><head><title>CentOS 8 Apache</title></head><body><h1>✅ Apache is running on CentOS 8</h1><p>Time: $(date)</p></body></html>' > /var/www/html/index.html

    注意:$(date)在单引号中不会展开,此处仅为示例,实际应写死时间或用双引号

  6. 验证文件上下文

    ls -Z /var/www/html/ # 若非 httpd_sys_content_t,则执行: semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" restorecon -Rv /var/www/html
  7. 本地访问测试

    curl -s http://localhost | grep "Apache is running" # 应输出 <h1>✅ Apache is running on CentOS 8</h1>

4.3 远程访问阶段:客户机配置与跨网段调试(耗时约 5 分钟)

在 Windows 客户机上:

  • 打开 PowerShell,执行ping 192.168.122.100(假设服务器 IP 为该值)
  • 若 ping 不通,检查 VMware 网络设置:编辑 > 虚拟网络编辑器 > VMnet8 > NAT 设置 > 网关 IP应为192.168.122.2,服务器网关应设为此值
  • 执行telnet 192.168.122.100 80,若提示“无法打开到主机的连接”,说明防火墙或 httpd 未运行
  • 浏览器访问http://192.168.122.100,成功显示测试页即完成

若客户机为另一台 Linux,用curl http://192.168.122.100即可。

4.4 高级配置阶段:启用 HTTPS 与虚拟主机(可选扩展)

若需 HTTPS,执行:

# 安装 mod_ssl dnf install mod_ssl -y # 生成自签名证书(仅测试用) openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/pki/tls/private/localhost.key \ -out /etc/pki/tls/certs/localhost.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost" # 开放 443 端口 firewall-cmd --permanent --add-service=https firewall-cmd --reload # 重启 httpd systemctl restart httpd

此时https://192.168.122.100可访问,浏览器会提示证书不安全(因自签名),点击“高级 > 继续访问”即可。

虚拟主机配置示例(/etc/httpd/conf.d/my-site.conf):

<VirtualHost *:80> ServerName mysite.local DocumentRoot "/var/www/mysite" <Directory "/var/www/mysite"> Require all granted </Directory> </VirtualHost>

创建目录mkdir -p /var/www/mysite,放测试页,再restorecon -Rv /var/www/mysite修复 SELinux 上下文,最后systemctl reload httpd

5. 常见问题与排查技巧实录:12 个真实故障的速查表

问题现象根本原因排查命令解决方案
curl: (7) Failed to connect to localhost port 80: Connection refusedhttpd 未运行或未监听 80 端口systemctl status httpd, `ss -tlnpgrep :80`
页面显示403 Forbidden文件权限错误或 SELinux 上下文错误ls -l /var/www/html/index.html,ls -Z /var/www/html/chmod 644 /var/www/html/index.html,restorecon -Rv /var/www/html
firewall-cmd --list-all不显示http服务--permanent未加,规则未持久化firewall-cmd --list-all --permanent重新执行firewall-cmd --permanent --add-service=http && firewall-cmd --reload
systemctl start httpdJob for httpd.service failed配置语法错误httpd -t(检查语法),journalctl -u httpd -n 50httpd -t会指出错误行号,如Syntax error on line 102 of /etc/httpd/conf.d/my.conf
curl http://localhost返回空内容网站根目录为空或 index.html 不存在ls -l /var/www/html/echo "test" > /var/www/html/index.html
远程无法访问,本地正常防火墙未开放端口或网络不通firewall-cmd --list-all,ping <server-ip>检查firewall-cmd --list-all,确认客户机与服务器网络连通
ab -n 1000 -c 100 http://localhost/apr_socket_recv: Connection refusedab 工具未安装which abdnf install httpd-tools -y
semanage fcontext -acommand not foundpolicycoreutils-python-utils 未安装`dnf list installedgrep policycoreutils`
httpd启动后立即退出MPM 模块冲突或端口被占用journalctl -u httpd -n 20, `ss -tlnpgrep :80`
curl https://localhostSSL connection timeoutmod_ssl 未安装或 443 端口未开放`dnf list installedgrep mod_ssl,firewall-cmd --list-ports`
systemctl enable httpd后重启仍不启动/etc/systemd/system/multi-user.target.wants/下链接损坏ls -l /etc/systemd/system/multi-user.target.wants/httpd.servicesystemctl disable httpd && systemctl enable httpd重建链接
httpd日志/var/log/httpd/error_log为空LogLevel 设置过高grep LogLevel /etc/httpd/conf/httpd.conf修改为LogLevel warnLogLevel info,再systemctl reload httpd

实操心得:我整理的这份速查表,源自 37 次真实排障记录。最常被忽略的是httpd -t命令