一、定义
Apache HTTP Server(常简称Apache)是主流 Web 服务器,是目前最成熟、使用最广泛的开源 Web 服务器之一
二、作用
核心是接收并处理客户端的 HTTP/HTTPS 请求,返回对应的资源或响应结果 ,是客户端(浏览器 / 客户端程序)与后端应用 / 静态资源之间的核心中间层
- 静态资源托管:直接提供 HTML、CSS、JS、图片、视频等静态文件的访问服务,是最基础功能;
- 反向代理:将客户端请求转发到后端应用服务器(如 Tomcat、Java/PHP/Python 服务),隐藏后端服务地址,实现服务隔离;
- 负载均衡:将请求分发到多个后端节点,提升服务并发处理能力,实现服务高可用;
- HTTPS 配置:集成 SSL/TLS 模块(mod_ssl),配置 HTTPS 证书,实现 HTTP 到 HTTPS 的加密访问,保障数据传输安全;
- 请求过滤 / 转发:通过规则配置实现 URL 重写、请求过滤、路径转发,适配不同的业务访问规则;
- 日志记录:记录所有访问请求和错误信息,为业务分析、问题排查提供数据支撑;
- 访问控制:基于 IP、域名、用户身份实现访问权限管控,限制非法请求访问。

三、核心配置文件(centos环境)
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/ 子配置文件
/var/www/html 网站根目录
/var/log/httpd/ 日志文件目录
[root@apache conf]# cat httpd.conf |grep -Ev '^[[:space:]]*$|^[[:space:]]*#'
ServerRoot "/etc/httpd" #Apache 安装根目录
Listen 80 #监听端口
Include conf.modules.d/*.conf #加载指定目录下的所有模块配置文件
User apache #定义运行 Apache 进程的用户
Group apache #用户组
ServerAdmin 26397122@qq.com #定义服务器管理员邮箱
DocumentRoot "/var/www/html" #网站根目录
ErrorLog "logs/error_log" #错误日志路径
LogLevel warn #日志级别
AddDefaultCharset UTF-8
EnableSendfile on
IncludeOptional conf.d/*.conf #辅助配置文件
#禁止访问服务器根目录(禁止访问目录)
<Directory />
AllowOverride none # 禁止该目录下的 .htaccess 文件覆盖主配置
Require all denied # 拒绝所有用户访问服务器根目录(/),防止泄露系统文件
</Directory>
#禁止访问.ht开头的文件(禁止访问文件)
<Files ".ht*">
Require all denied # 禁止访问 .htaccess、.htpasswd 等隐藏文件,防止泄露认证信息
</Files>
#网站核心根目录(/var/www/html)
<Directory "/var/www/html">
Options Indexes # 目录索引功能 开启 - 表示禁用
AllowOverride None
Require all granted
</Directory>
#默认索引文件 也就是默认访问网页
<IfModule dir_module> # 仅当 dir_module 模块加载时生效
DirectoryIndex index.html # 访问目录时默认加载的文件(优先级最高),可新增 index.php
</IfModule>
#日志配置模块
<IfModule log_config_module>
#日志格式 起别名为combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#日志格式 起别名为common
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#日志io模块,更多参数
<IfModule logio_module>
#日志格式 起别名为combinedio
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#定义访问日志 采用上述定义的combined格式.
CustomLog "logs/access_log" combined
</IfModule>
#别名模块
<IfModule alias_module>
#(外部重定向)将访问 /foo 的请求,永久重定向到 http://www.example.com/bar
Redirect permanent /foo http://www.example.com/bar
#(本地重定向)将访问 /webpath 映射到服务器本地的 /full/filesystem/path 目录
Alias /webpath /full/filesystem/path
#(本地重定向脚本)和 Alias 类似,但专门用于映射 CGI 脚本目录,会执行脚本 再返回
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
#必须对文件目录 都添加权限 chmod 777
日志级别:
debug (调试级) info(信息级) notice(通知级) warn(警告级) error(错误级) crit(严重级) alert(警报级) emerg(紧急级)
LogLevel error # 仅记录 error/crit/alert/emerg,日志量少且精准
虚拟主机配置(一台主机可以运行多个网站)
基于域名(最常用)(通过不同域名,访问同一个ip主机的不同网站)
1.配置hosts文件
[root@apache linux2]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.118.100 www.linux1.org
192.168.118.100 www.linux2.org
2.创建网站数据目录
[root@apache linux1]# mkdir /var/wwwroot/linux1
[root@apache linux2]# mkdir /var/wwwroot/linux2
[root@apache linux1]# echo "linux11111" >index.html
[root@apache linux2]# echo "linux22222" >index.html
chown -R apache:apache /var/wwwroot/linux1
chown -R apache:apache /var/wwwroot/linux2
chmod -R 755 /var/wwwroot/
3.配置基于域名的主机
[root@apache conf.d]# cat linux1.conf
<VirtualHost *:80>
ServerName www.linux1.org #指定该虚拟主机对应的域名
DocumentRoot /var/wwwroot/linux1 #指定 www.linux1.org 对应的网站根目录
<Directory "/var/wwwroot/linux1"> #专门配置 /var/wwwroot/linux1 目录的访问规则
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@apache conf.d]# cat linux2.conf
<VirtualHost *:80>
ServerName www.linux2.org
DocumentRoot /var/wwwroot/linux2
<Directory "/var/wwwroot/linux2">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
4.访问对应的域名
[root@apache conf.d]# curl www.linux1.org
linux111111111
[root@apache conf.d]# curl www.linux2.org
linux222222222
基于端口
在linux1.conf
<VirtualHost *:80>
ServerName www.linux1.org
DocumentRoot /var/wwwroot/linux1
<Directory "/var/wwwroot/linux1">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
在linux2.conf
listen 8080 #先监听8080端口
<VirtualHost *:8080>
ServerName www.linux2.org
DocumentRoot /var/wwwroot/linux2
<Directory "/var/wwwroot/linux2">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
基于ip(ip地址太贵了,一般不用)
在linux1.conf
<VirtualHost 192.168.118.100>
ServerName www.linux1.org
DocumentRoot /var/wwwroot/linux1
<Directory "/var/wwwroot/linux1">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
在linux2.conf
<VirtualHost 192.168.118.99>
ServerName www.linux2.org
DocumentRoot /var/wwwroot/linux2
<Directory "/var/wwwroot/linux2">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
rewrite模块
定义: Apache 中最强大的 URL 处理工具,核心作用是修改 / 重写 / 重定向请求的 URL,支持正则表达式匹配,能实现 URL 美化、域名跳转、防盗链、访问控制等核心需求
核心语法:
rewriteEngine 首先要开启rewrite
rewriteCond A B 查看是否满足条件,A是否满足B
rewriteRule C D 如果满足,那么C就替换成D
RewriteEngine On 开启 Rewrite 功能
RewriteCond %{HTTP_HOST} ^old.com$ 条件判断:满足条件时才执行后续的 RewriteRule)
RewriteRule ^old.html$ new.html [R=301,L] 匹配 URL 并执行重写 / 重定向
防盗链:(防止别的网站,引用我们网站的资源)
RewriteEngine On
# 防盗链核心规则
# 条件1:排除无来源的请求(比如用户直接在浏览器输入资源URL)
RewriteCond %{HTTP_REFERER} !^$
# 条件2:允许自己的域名(替换成你的实际域名,多个域名用 | 分隔,如 your.com|www.your.com)
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?your\.com [NC]
# 规则:匹配指定类型的资源
RewriteRule \.(jpg|jpeg|png|gif|webp)$ https://your.com/images/anti-hotlink.png [L,NC,R=302]
域名跳转
<VirtualHost 172.16.247.247:80>
ServerName www.mylinux.lo
ServerAlias www.linux1.lo
# 作用:设置域名别名,访问 www.linux1.lo 也会匹配此虚拟主机
DocumentRoot /var/wwwroot/linux1
<Directory "/var/wwwroot/linux1">
AllowOverride None
Require all granted
</Directory>
# Rewrite 域名跳转规则
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.linux1.lo$
# 作用:条件判断,仅当用户访问的域名是 www.linux1.lo 时,执行后续跳转
RewriteRule ^/(.*)$ http://www.mylinux.lo/$1 [R=301,L]
# 作用:执行跳转,将 www.linux1.lo/任意路径 永久重定向到 www.mylinux.lo/相同路径
</VirtualHost>
# 整体效果总结:
# 当用户访问 www.linux1.lo 或 www.linux1.lo/about.html 时,会自动永久跳转到 www.mylinux.lo 或 www.mylinux.lo/about.html
日志分割
rotatelogs 是 Apache 官方自带的日志分割工具
# 修改 httpd.conf 或虚拟主机配置
# 访问日志:按天分割,本地时区,日志路径 /var/log/httpd/access_年月日.log
CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/access_%Y%m%d.log 86400" combined
# 错误日志:按天分割
ErrorLog "|/usr/sbin/rotatelogs -l /var/log/httpd/error_%Y%m%d.log 86400"
负载均衡
<VirtualHost *:80>
ServerName www.mysite.com
ServerAlias mysite.com
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.101:8080 weight=5 maxconn=100
BalancerMember http://192.168.1.102:8080 weight=3 maxconn=100
BalancerMember http://192.168.1.103:8080 weight=2 maxconn=100
ProxySet lbmethod=byrequests
#基于权重的算法 byrequests
#还有 最少连接 轮询 IP 哈希 随机 按流量 按请求数分发
ProxySet stickysession=JSESSIONID nofailover=On
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# 可选:开启负载均衡状态监控页面(访问http://www.mysite.com/balancer-manager 查看节点状态)
<Location /balancer-manager>
SetHandler balancer-manager
# 安全控制:仅允许内网IP访问监控页面
Require ip 192.168.1.0/24
# Require all denied # 生产环境若不需要,直接禁用
</Location>
# 日志配置
ErrorLog /var/log/httpd/lb_error.log
CustomLog /var/log/httpd/lb_access.log combined
ProxyLogs /var/log/httpd/lb_proxy.log
</VirtualHost>
四、常见httpd命令
httpd -t #测试配置文件是否有语法错误
httpd -M #查看所有已经加载的模块
systemctl restart httpd #重新加载配置文件
五、MPM 模块实现,Multi-Processing Module(多处理模块)
prefork(预派生模型,进程模型): 主进程在启动时就预先创建好多个空闲的子进程,当客户端请求到来时,直接分配一个空闲子进程去处理,子进程处理完请求后不会立即销毁,而是回到空闲状态等待下一个请求。每个请求由一个独立的子进程处理,进程之间完全隔离。
worker(工作线程模型):主进程先创建几个子进程,每个子进程再创建多个工作线程。客户端请求到来时,由子进程分配一个空闲线程去处理。线程比进程更轻量,内存占用更低,一个子进程内的线程可以共享内存资源。
**event(事件驱动模型):**基于 worker 模型优化而来,引入了事件管理器,它会把处于空闲状态的 Keep-Alive(长连接) 接管过来,让原来的线程可以去处理新的请求,从而大大提升了并发能力。
六、部署流程
1.dnf安装
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# setenforce 0
[root@apache ~]# dnf install -y httpd
[root@apache ~]# systemctl enable --now httpd
[root@apache ~]# systemctl status httpd
七、面试常见问题
1. 什么是 Apache httpd?
答:Apache httpd 是一个开源、跨平台的 Web 服务器软件,广泛用于托管网站和 Web 应用。其名称中的 "httpd" 意为 "HTTP Daemon",是 Apache 在 Linux 系统中的默认进程名。
2. Apache 支持哪些多路处理模块(MPM)?有何区别?
答:主要支持三种 MPM:
- prefork:多进程模型,每个进程处理一个连接,兼容非线程安全模块(如 mod_php),内存占用高。
- worker:多进程 + 多线程,内存效率高,但要求模块线程安全。
- event:基于事件驱动,异步处理空闲连接,适合高并发场景(Apache 2.4+ 默认)。
3. 如何查看 Apache 使用的是哪种 MPM?
答:执行命令:
httpd -V | grep -i mpm
4. Apache 的主配置文件路径是什么?
答:在 CentOS/RHEL 中,默认主配置文件为:
/etc/httpd/conf/httpd.conf
5. 如何实现多个网站(虚拟主机)?
答:使用 <VirtualHost> 指令。例如:
<VirtualHost *:80>
ServerName site1.com
DocumentRoot /var/www/site1
</VirtualHost>
6. .htaccess 文件的作用是什么?有什么缺点?
答:作用:允许在目录级别覆盖 Apache 配置(如重写规则、访问控制)。
缺点:每次请求都会读取,影响性能;不适用于高并发生产环境。
建议:生产环境设 AllowOverride None,将规则写入主配置。
7. 如何启用 URL 重写(如伪静态)?
答:1. 确保 mod_rewrite 已加载;
2. 在配置中添加:
RewriteEngine On
RewriteRule ^article/([0-9]+)$ /article.php?id=$1 [L]
8. Apache 如何与 PHP 集成?
1)先开 Apache 两个核心模块(httpd.conf 里取消注释)
apache
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
2)配置转发规则(虚拟主机里加这一行就行)
apache
<VirtualHost *:80>
ServerName www.xxx.com
DocumentRoot "/var/www/html"
# 关键:把所有.php请求转给本地9000端口的PHP-FPM
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/你的网站根目录/$1
</VirtualHost>
3)启动服务
Linux:systemctl start php-fpm
重启 Apache:systemctl restart httpd
9. 如何用 Apache 实现负载均衡?
答:使用 mod_proxy + mod_proxy_balancer:
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.10:8080
BalancerMember http://192.168.1.11:8080
</Proxy>
ProxyPass "/" "balancer://mycluster/"
10. 如何排查 403 Forbidden 错误?
答:可能原因:
- 目录权限不足(检查 chmod/chown);
- SELinux 限制(执行 setenforce 0 临时测试);
- Require all denied(检查 <Directory> 授权);
- DocumentRoot 路径错误。
13. 如何重载 Apache 配置而不中断服务?
答:使用 reload 命令:
systemctl reload httpd
16. 如何启用 HTTPS?
答:1. 安装 mod_ssl;
2. 配置 SSL 证书:
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/privkey.pem
DocumentRoot /var/www/html
</VirtualHost>
18. 如何查看 Apache 加载了哪些模块?
答:执行命令:
httpd -M
12. Apache 和 Nginx 有什么区别?
Apache 是全能老大哥,啥功能都有、配着简单,处理动态请求顺手,但人多(高并发)就容易卡、占内存;
Nginx 是高速小能手,专扛高并发、省资源,静态文件 / 转发请求贼快,动态请求一般转手给别人做。
日常生产都Nginx 放前面挡流量、处理静态、转发请求,Apache 放后面专门处理动态业务,俩搭配着用最香。
3. Apache 中常用的核心模块有哪些?至少说 5 个
mod_proxy:反向代理核心模块,配合mod_proxy_http/mod_proxy_balancer实现 HTTP 反向代理和负载均衡。
mod_rewrite:URL 重写模块,实现伪静态、域名跳转、路径重定向(如把index.php?id=1改成/article/1)。
mod_ssl:HTTPS 加密模块,配置 SSL 证书、开启 HTTPS(443 端口)。
mod_access_compat/mod_authz_core:访问控制模块,限制 IP / 域名 / 用户访问(如禁止某 IP 段访问后台)。
mod_deflate/mod_gzip:压缩模块,对静态资源(HTML/CSS/JS)做 Gzip 压缩,减少传输体积。
mod_dir:默认目录模块,配置默认首页(如index.html/index.php)。