Apache工作原理详细说明
发布时间:2026-08-15 | 浏览:8
这是 Apache 的"总控开关",包含全局设置。关键部分包括:
这是 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" # 默认网站根目录
其他配置通常通过 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" # 默认网站根目录
DocumentRoot "/var/www/html" #网站的 默认文档根目录 。
<Directory "/var/www"> 和 <Directory "/var/www/html"> 的区别
<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 :允许公开访问。
IncludeOptional conf.d/*.conf # ← 关键!自动加载 conf.d 下的所有 .conf 文件
所有自定义虚拟主机、SSL、重写规则都应放在 conf.d/ 中,而不是直接改 httpd.conf
Include conf.modules.d/*.conf
每个 .conf 文件负责加载一组模块,例如:
00-base.conf :加载核心模块( mod_mime , mod_dir 等)
00-base.conf :加载核心模块( mod_mime , mod_dir 等)
10-php.conf :加载 libphp7.so
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
00-mpm.conf :选择多路处理模块(prefork / worker / event)
LoadModule php7_module modules/libphp7.so
模块必须先加载,才能在配置中使用其指令(如 php_value )。
这是 最常用 的自定义配置位置。
存放自定义站点配置、虚拟主机(VirtualHost)、SSL 配置等 。
所有 *.conf 文件都会被自动加载(顺序按字母)。
被 httpd.conf 包含:
|------------------|----------------------------| | ssl.conf | 启用 HTTPS,配置 443 端口 | | autoindex.conf | 允许目录列表( Options +Indexes ) | | your-site.conf | 你自己的虚拟主机 |
重启 Apache 后自动生效,无需修改主配置。
✅ 最佳实践:你的 YUM 源、网站、反向代理等配置都应放在这里 ,而不是修改 httpd.conf 。
例如:你可以创建 /etc/httpd/conf.d/repo.conf 来专门配置仓库访问。
|-----------------------------------------|-------------------------------------------------------------| | 路径 | 作用 | | /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 服务单元文件(控制启动方式) |
/etc/httpd/conf/httpd.conf
→ 加载 /etc/httpd/conf.modules.d/*.conf → 加载 /etc/httpd/conf.d/*.conf
→ 加载 /etc/httpd/conf.modules.d/*.conf
→ 加载 /etc/httpd/conf.d/*.conf
⚠️ 注意: 后加载的配置会覆盖先加载的同名指令 (取决于指令的作用域和是否可重复)。
典型工作流程(以访问 http://example.com/ 为例)
用户浏览器请求 → 到达服务器 80 端口 #/etc/httpd/conf/httpd.conf 的Listen 80
Apache 查找匹配的 <VirtualHost *:80> #/etc/httpd/conf.d/*.conf (通常是自定义虚拟主机文件)
根据 ServerName example.com 找到对应虚拟主机 #同一个 <VirtualHost> 块内的 ServerName 如:/etc/httpd/conf.d/example.con
获取 DocumentRoot /var/www/example #1.同一个 <VirtualHost> 块内的 DocumentRoot
#2.它覆盖全局 httpd.conf 中的 DocumentRoot (作用域优先级: <VirtualHost> > 全局)
将 URL /index.html 映射为 /var/www/example/index.html
#默认映射无单独配置文件,但可被 conf.d/example.conf 中 Alias 或 RewriteRule 覆盖。
检查 <Directory "/var/www/example"> 权限
# <Directory> 指令块,通常和 DocumentRoot 写在同一个虚拟主机配置文件中。
#注意:如果你没写这个 <Directory> 块,Apache 会使用 httpd.conf 中对 /var/www 或 / 的默认权限,可能导致 403 Forbidden!
返回文件内容(或 403/404 错误)
|------------------------------|-----------------------------| | 指令 | 作用 | | Listen | 监听 IP:端口 | | ServerName | 服务器主机名(避免启动警告) | | DocumentRoot | 网站根目录 | | <Directory> | 控制目录访问权限 | | AllowOverride | 是否允许 .htaccess 覆盖配置 | | Require | 访问控制( all granted = 允许所有人) | | ErrorLog / CustomLog | 日志路径 | | Include / IncludeOptional | 包含其他配置文件 |
<Directory "/">
Require all denied
限制 .htaccess****使用 :
AllowOverride None # 提高性能,增强安全
SELinux 上下文 (CentOS/RHEL):
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/myapp(/.*)?"
sudo restorecon -R /opt/myapp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
显示虚拟主机、监听端口、配置文件来源等, 排错神器 !
sudo httpd -t 或 sudo apachectl configtest
✅ 输出 Syntax OK 表示配置无语法错误。