一文学会apache httpd

一、定义

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)。
相关推荐
TracyCoder1237 小时前
ElasticSearch核心引擎Apache Lucene(五):相关性算分 (Scoring)
elasticsearch·apache·lucene
野生技术架构师7 小时前
Spring Boot 3 集成 Apache Calcite:多数据源查询的终极解决方案
spring boot·后端·apache
TracyCoder1231 天前
ElasticSearch核心引擎Apache Lucene(四):段 (Segment) 的设计与合并
elasticsearch·apache·lucene
TracyCoder1231 天前
ElasticSearch核心引擎Apache Lucene(三):数值与空间数据索引
elasticsearch·apache·lucene
Elastic 中国社区官方博客1 天前
Elasticsearch:Apache Lucene 2025 年终总结
大数据·人工智能·elasticsearch·搜索引擎·apache·lucene
TracyCoder1231 天前
ElasticSearch核心引擎Apache Lucene(二):正排索引的奥秘
elasticsearch·apache·lucene
TracyCoder1231 天前
ElasticSearch核心引擎Apache Lucene(一):倒排索引底层实现
elasticsearch·apache·lucene
麦兜*2 天前
深入解析云原生时代的高性能消息中间件:基于Apache Pulsar与Kafka架构对比的万亿级数据吞吐与低延迟实时处理实战
云原生·kafka·apache
SelectDB技术团队2 天前
上市大模型企业数据基础设施的选择:MiniMax 基于阿里云 SelectDB 版,打造全球统一AI可观测中台
数据库·数据仓库·人工智能·ai·apache