Apache工作原理详细说明

Apache主要目录结构

配置文件关系图:

1. /etc/httpd/conf/httpd.conf**(主配置文件)**

这是 Apache 的"总控开关",包含全局设置。关键部分包括:

  • 这是 Apache 的主配置文件,启动时首先读取。

  • 包含全局设置:监听端口、服务器根目录、模块加载、默认虚拟主机等。

  • 其他配置通常通过 Include 指令从这里引入。

    ServerRoot "/etc/httpd" # Apache 安装根目录
    Listen 80 # 监听端口
    Include conf.modules.d/*.conf # 加载模块配置
    User apache # 进程运行用户
    Group apache
    ServerAdmin root@localhost
    ServerName localhost:80
    DocumentRoot "/var/www/html" # 默认网站根目录

1.1目录权限控制

DocumentRoot "/var/www/html" #网站的默认文档根目录

<Directory "/var/www"><Directory "/var/www/html"> 的区别

复制代码
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Directory "/var/www">

  • 匹配整个 /var/www 目录(包括其子目录)。
  • 设置全局权限,防止其他程序在 /var/www 下创建恶意内容。
  • AllowOverride None:禁止 .htaccess 文件覆盖配置。
  • Require all granted:允许所有人访问该目录(但通常只用于管理目的)。

<Directory "/var/www/html">

  • 只匹配 /var/www/html 这个具体目录。
  • 更精细地控制网站主目录的行为。
  • Options Indexes FollowSymLinks:允许目录列表(Indexes),并支持符号链接(FollowSymLinks)。
  • AllowOverride None:仍禁用 .htaccess
  • Require all granted:允许公开访问。
1.2.包含其他配置

IncludeOptional conf.d/*.conf # ← 关键!自动加载 conf.d 下的所有 .conf 文件

所有自定义虚拟主机、SSL、重写规则都应放在 conf.d/ 中,而不是直接改 httpd.conf

Include conf.modules.d/*.conf

2. /etc/httpd/conf.modules.d/****(模块加载目录)

每个 .conf 文件负责加载一组模块,例如:

  • 00-base.conf:加载核心模块(mod_mime, mod_dir 等)

  • 10-php.conf:加载 libphp7.so

  • 00-mpm.conf:选择多路处理模块(prefork / worker / event)

    /etc/httpd/conf.modules.d/10-php.conf

    LoadModule php7_module modules/libphp7.so

模块必须先加载,才能在配置中使用其指令(如 php_value)。

  1. 虚拟主机配置目录(推荐使用)
3. 虚拟主机配置目录(扩展配置目录)

这是最常用的自定义配置位置。

  • 存放自定义站点配置、虚拟主机(VirtualHost)、SSL 配置等
  • 所有 *.conf 文件都会被自动加载(顺序按字母)。
  • httpd.conf 包含:

|------------------|----------------------------|
| ssl.conf | 启用 HTTPS,配置 443 端口 |
| autoindex.conf | 允许目录列表(Options +Indexes) |
| your-site.conf | 你自己的虚拟主机 |

复制代码
# /etc/httpd/conf.d/myapp.conf
<VirtualHost *:80>
    ServerName myapp.local
    DocumentRoot /opt/myapp/web
    <Directory /opt/myapp/web>
        Require all granted
        AllowOverride All
    </Directory>
    ErrorLog /var/log/httpd/myapp_error.log
    CustomLog /var/log/httpd/myapp_access.log combined
</VirtualHost>

重启 Apache 后自动生效,无需修改主配置。

最佳实践:你的 YUM 源、网站、反向代理等配置都应放在这里 ,而不是修改 httpd.conf

例如:你可以创建 /etc/httpd/conf.d/repo.conf 来专门配置仓库访问。

4. 其他重要文件/目录

|-----------------------------------------|-------------------------------------------------------------|
| 路径 | 作用 |
| /etc/httpd/conf/magic | MIME 类型识别规则(用于 mod_mime_magic ) |
| /var/log/httpd/ | 日志目录:- access_log:访问日志 - error_log:错误日志(排查 404/500 必看!) |
| /var/www/html/ | 默认 Web 根目录(DocumentRoot) |
| /etc/sysconfig/httpd | 启动参数配置(如设置环境变量、额外选项) |
| /usr/lib/systemd/system/httpd.service | systemd 服务单元文件(控制启动方式) |


5.配置加载顺序
  1. /etc/httpd/conf/httpd.conf
    • → 加载 /etc/httpd/conf.modules.d/*.conf
    • → 加载 /etc/httpd/conf.d/*.conf

⚠️ 注意:后加载的配置会覆盖先加载的同名指令(取决于指令的作用域和是否可重复)。

典型工作流程(以访问 http://example.com/ 为例)

  1. 用户浏览器请求 → 到达服务器 80 端口 #/etc/httpd/conf/httpd.conf 的Listen 80
  2. Apache 查找匹配的 <VirtualHost *:80> #/etc/httpd/conf.d/*.conf(通常是自定义虚拟主机文件)
  3. 根据 ServerName example.com 找到对应虚拟主机
    #同一个 <VirtualHost> 块内的 ServerName 如:/etc/httpd/conf.d/example.con
  4. 获取 DocumentRoot /var/www/example
    #1.同一个 <VirtualHost> 块内的 DocumentRoot

#2.它覆盖全局 httpd.conf 中的 DocumentRoot(作用域优先级:<VirtualHost> > 全局)

  1. 将 URL /index.html 映射为 /var/www/example/index.html

#默认映射无单独配置文件,但可被 conf.d/example.confAliasRewriteRule 覆盖。

  1. 检查 <Directory "/var/www/example"> 权限

#<Directory> 指令块,通常和 DocumentRoot 写在同一个虚拟主机配置文件中。

#注意:如果你没写这个<Directory>块,Apache 会使用 httpd.conf 中对/var/www/ 的默认权限,可能导致 403 Forbidden!

  1. 返回文件内容(或 403/404 错误)
6、常用配置指令速查

|------------------------------|-----------------------------|
| 指令 | 作用 |
| Listen | 监听 IP:端口 |
| ServerName | 服务器主机名(避免启动警告) |
| DocumentRoot | 网站根目录 |
| <Directory> | 控制目录访问权限 |
| AllowOverride | 是否允许 .htaccess覆盖配置 |
| Require | 访问控制(all granted = 允许所有人) |
| ErrorLog / CustomLog | 日志路径 |
| Include/ IncludeOptional | 包含其他配置文件 |


7、安全与权限注意事项
  1. 不要开放敏感目录

<Directory "/">

Require all denied

</Directory>

  1. 限制 .htaccess****使用

AllowOverride None # 提高性能,增强安全

  1. SELinux 上下文(CentOS/RHEL):

sudo semanage fcontext -a -t httpd_sys_content_t "/opt/myapp(/.*)?"

sudo restorecon -R /opt/myapp

  1. 防火墙放行端口

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

sudo firewall-cmd --reload

8.实用命令
查看当前生效的完整配置

sudo httpd -S

  • 显示虚拟主机、监听端口、配置文件来源等,排错神器
检查配置语法是否正确

sudo httpd -t 或 sudo apachectl configtest

✅ 输出 Syntax OK 表示配置无语法错误。

查看已加载的模块

httpd -M

相关推荐
fufu031143 分钟前
Linux环境下的C语言编程(三十六)
linux·c语言·开发语言·数据结构·算法
小嘟嘟131 小时前
第2章 Shell 变量与参数传递:3 种定义方式 + 避坑指南
linux·运维·shell
looking_for__1 小时前
【Linux】进程概念
linux
Eric.Lee20211 小时前
ubuntu系统在bashrc文件中对conda进行启用设置
linux·运维·python·ubuntu·conda
mooyuan天天1 小时前
CobaltStrike横向渗透之Https Beacon实战2(跳板机Linux)
linux·内网渗透·横向移动·cobalt strike
IDOlaoluo1 小时前
apache-maven-3.9.9-bin.zip 使用步骤(超简单版)
java·maven·apache
model20051 小时前
Alibaba linux 3安装mapserver
linux·运维·服务器
水天需0101 小时前
awk 命令全面详解
linux·运维·服务器
YFLICKERH1 小时前
【Linux系统】Docker技术与应用
linux·docker