Apache HTTP Server 2.4 Windows 版完整配置与运维手册

本文基于 Apache 2.4 官方文档,完全适配 Windows 系统,从安装、基础配置、监听绑定、虚拟主机、URL 重写、SSL、缓存、日志、性能调优到安全加固,形成一份可直接落地的 Windows 运维文档。

一、Windows 下 Apache 2.4 入门与安装

1.1 下载与环境说明

Apache 官方不提供 EXE 安装包,Windows 版本以压缩包形式分发:

1.2 目录结构(Windows 典型路径)

解压到无空格、无中文路径,例如:

复制代码
C:\Apache24\
├── bin\       httpd.exe、服务管理工具
├── conf\      主配置目录
├── htdocs\    默认网站根目录
├── logs\      日志目录
└── modules\   模块文件(*.so)

1.3 安装为 Windows 服务

管理员身份打开 CMD,进入 bin 目录:

复制代码
cd C:\Apache24\bin

安装服务:

复制代码
httpd -k install

启动服务:

复制代码
httpd -k start

停止 / 重启 / 卸载:

复制代码
httpd -k stop
httpd -k restart
httpd -k uninstall

验证安装:

打开浏览器,访问 http://localhost/。如果看到 "It works!" 的默认页面,就说明 Apache 已经成功安装并运行了。

二、监听与绑定(Bind)配置

文件:conf/httpd.conf

2.1 Listen 指令(监听端口)

复制代码
# 监听所有网卡 80 端口
Listen 0.0.0.0:80

# 监听 IPv6
Listen [::]:80

# 自定义端口
Listen 8080

# HTTPS 监听
Listen 443 https

2.2 ServerName 避免启动警告

复制代码
ServerName localhost:80

三、主配置结构与配置段

3.1 核心路径配置(Windows 路径用 /\\

复制代码
Define SRVROOT "C:/Apache24"
ServerRoot "${SRVROOT}"

DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

3.2 常用配置段说明

  • <Directory>:目录权限
  • <Files>:文件匹配
  • <Location>:URL 路径匹配
  • <VirtualHost>:虚拟主机
  • <IfModule>:模块加载判断

示例:

复制代码
<Files ".env">
    Require all denied
</Files>

四、日志配置(Logs)

4.1 错误日志

复制代码
ErrorLog "${SRVROOT}/logs/error.log"
LogLevel warn

报警级别: debug, info, notice, warn, error, crit,alert, emerg.

4.2 访问日志(通用 Combined 格式)

复制代码
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "${SRVROOT}/logs/access.log" combined

日志文件默认在:

复制代码
C:\Apache24\logs\

五、URL 映射(URL Mapping)

5.1 别名 Alias

将 url中的/static 映射到 D 盘某目录:

复制代码
Alias "/static" "D:/web/static"
<Directory "D:/web/static">
    Require all granted
</Directory>

5.2 脚本别名 ScriptAlias

复制代码
ScriptAlias "cgi-bin"  "${SRVROOT}/cgi-bin/"
<Directory "${SRVROOT}/cgi-bin/">
    require all granted
</Directory>

5.3 默认首页

复制代码
DirectoryIndex index.html index.php index.htm

六、URL 重写(mod_rewrite)

6.1 启用模块

复制代码
LoadModule rewrite_module modules/mod_rewrite.so

6.2 常用规则示例

1)HTTP 强制跳转 HTTPS

复制代码
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

注解:

  1. RewriteEngine On

    • 功能 :开启 Apache 的 mod_rewrite 重写引擎。
    • 作用:这是使用所有重写规则的前提。如果没有这一行,下面的规则将不会生效。
  2. RewriteCond %{HTTPS} off

    • 功能 :设置重写的条件(Condition)。
    • 含义 :检查当前访问的协议是否为 off(即非 HTTPS,也就是 HTTP)。
    • 逻辑:只有当用户使用的是 HTTP 访问时,才会执行下一行的跳转规则。如果用户已经在使用 HTTPS,则不执行任何操作,避免死循环。
  3. RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

    • 功能 :定义具体的重写/跳转规则

    • ^(.*)$ :这是一个正则表达式,用于匹配用户请求的整个路径(URI)。(.*) 会把匹配到的内容(比如 /index.html/about)保存为变量 $1
      为啥没有域名呢?

      因为在 Apache 的 RewriteRule 规则中,它只负责处理"路径",不负责处理"域名" 。域名(如 www.example.com)是由 Apache 的其他部分(虚拟主机配置)处理的,当请求到达 RewriteRule 时,域名已经被"剥离"掉了,只剩下路径。

    • https://%{HTTP_HOST}$1 :这是跳转的目标地址。

      • https://:强制使用加密协议。
      • %{HTTP_HOST}:自动获取当前访问的域名(如 example.com)。
      • $1:填入刚才匹配到的路径部分。
    • [R=301,L] :这是规则的标志(Flags)。

      • R=301:表示执行301 永久重定向。这会告诉浏览器和搜索引擎(如 Google、百度),该页面已永久移动到新的安全地址,有利于 SEO。
      • L:表示这是最后一条(Last)规则。一旦匹配成功并执行了跳转,服务器就不再处理后面的其他规则了。

补充:

1. URL 的结构拆解

在 HTTP 协议中,一个完整的 URL 是这样的:
http://www.example.com:80/news/123.html

Apache 在内部处理时,会把它拆分成不同的变量:

  • 协议http
  • 主机名/域名www.example.com(对应变量 %{HTTP_HOST}
  • 端口80
  • URI/路径/news/123.html(这就是 RewriteRule 匹配的对象)

当你写 RewriteRule ^(.*)$ ... 时,正则表达式 ^(.*)$ 匹配的对象仅仅是 URI/路径 部分。

2. 为什么后面又要写 %{HTTP_HOST}

既然 ^(.*)$ 抓不到域名,那为什么我们在跳转目标里又要写 https://%{HTTP_HOST}$1 呢?

  • ^(.*)$ :负责抓取路径(比如 /news/123.html),并存为 $1
  • %{HTTP_HOST} :这是一个系统变量。它的作用是告诉 Apache:"去查一下刚才那个请求的域名是什么,把它填在这里"。

💡 举例说明

假设你的域名是 example.com

  • 用户访问http://example.com/news/article1
  • 触发条件RewriteCond 检测到是 HTTP (off)。
  • 执行跳转RewriteRule 捕获路径 /news/article1$1
  • 最终结果 :浏览器地址栏变为 https://example.com/news/article1

2)伪静态 /path → index.php?path=

复制代码
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

3)支持 .htaccess

Apache Web 服务器 的一种分布式配置文件 。它允许你在不修改服务器主配置文件 (如 httpd.conf)的情况下,直接控制该目录及其子目录下的网站行为。它在虚拟主机(共享主机)环境中非常流行,因为普通用户通常没有权限修改服务器的主配置,但可以通过上传 .htaccess 文件来实现各种高级功能。

.htaccess 的功能非常强大,最常见的用途包括:

  1. URL 重写(伪静态)

    这是它最核心的功能。通过 mod_rewrite 模块,它可以把复杂的动态 URL(如 product.php?id=123)转换成简洁、对搜索引擎友好的静态 URL(如 product/123),或者实现 HTTP 强制跳转 HTTPS

  2. 自定义错误页面

    当用户访问不存在的页面时,你可以配置它显示一个自定义的、友好的 404 页面,而不是服务器默认的枯燥报错信息。

    • 例如:ErrorDocument 404 /errors/404.html
  3. 访问控制与安全

    • IP 限制:允许或禁止特定 IP 地址访问你的网站。
    • 目录密码保护:为特定文件夹设置密码,只有输入正确的用户名和密码才能访问。
    • 防盗链:防止其他网站直接引用你服务器上的图片或文件,节省你的带宽。
  4. 优化与缓存

    它可以设置文件的缓存策略,告诉浏览器哪些文件需要缓存、缓存多久,从而提升网站的加载速度。

  5. 禁止目录列表

    如果一个文件夹里没有首页文件(如 index.html),默认情况下 Apache 会列出该文件夹下的所有文件。使用 .htaccess 可以禁止这种行为,防止文件结构泄露。

    • 例如:Options -Indexes

    <Directory "${SRVROOT}/htdocs">
    AllowOverride All
    </Directory>

七、虚拟主机(Virtual Hosts)

#Include conf/extra/这个目录里是放什么的
conf/extra/ 目录是 Apache 用来存放特定功能的扩展配置文件 的地方。

简单来说,Apache 的主配置文件 httpd.conf 就像一个总指挥部 ,而 conf/extra/ 目录就像是各个专项部门 (如安保部、交通部、后勤部)的独立办公室。为了保持主配置文件的整洁和易读,Apache 将一些复杂或特定功能的配置单独拆分出来,放在这个目录下。主配置文件通过 Include 指令来调用它们。

7.1 启用配置

涉及conf/extra/ 目录,是 Apache 用来存放特定功能的扩展配置文件的地方。为了保持主配置文件的整洁和易读,Apache 将一些复杂或特定功能的配置单独拆分出来,放在这个目录下。主配置文件通过 Include 指令来调用它们。

httpd.conf 中取消注释:

复制代码
Include conf/extra/httpd-vhosts.conf

7.2 httpd-vhosts.conf 示例

复制代码
<VirtualHost *:80>
    ServerName www.site1.com
    DocumentRoot "C:/web/site1"
    ErrorLog "logs/site1-error.log"
    CustomLog "logs/site1-access.log" combined
</VirtualHost>

<VirtualHost *:80>
    ServerName www.site2.com
    DocumentRoot "C:/web/site2"
    ErrorLog "logs/site2-error.log"
    CustomLog "logs/site2-access.log" combined
</VirtualHost>

Windows 本地测试需修改:

复制代码
C:\Windows\System32\drivers\etc\hosts

添加

复制代码
127.0.0.1 www.site1.com
127.0.0.1 www.site2.com

八、SSL / HTTPS 配置

8.1 启用模块

复制代码
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

8.2典型SSL配置

复制代码
<VirtualHost *:443>
    ServerName site.com
    DocumentRoot "C:/web/site"

    SSLEngine on
    SSLCertificateFile "C:/ssl/site.crt"
    SSLCertificateKeyFile "C:/ssl/site.key"
    SSLCertificateChainFile "C:/ssl/chain.crt"

    # 安全套件
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
</VirtualHost>

九、缓存配置(Caching)

9.1磁盘缓存

复制代码
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

CacheEnable disk /
CacheRoot "C:/Apache24/cache"
CacheDirLevels 2
CacheDirLength 1
CacheDefaultExpire 3600

9.2 浏览器缓存(静态资源)

复制代码
<FilesMatch "\.(jpg|png|css|js|gif|ico)$">
    Header set Cache-Control "max-age=86400"
</FilesMatch>

需加载头模块

复制代码
LoadModule headers_module modules/mod_headers.so

十、内容协商(Content Negotiation)

根据浏览器语言自动返回对应页面:

复制代码
LoadModule negotiation_module modules/mod_negotiation.so

<Directory "${SRVROOT}/htdocs">
    Options +MultiViews
</Directory>

可放置:

  • index.html.en
  • index.html.zh-cn

Apache 会自动匹配。

十一、动态模块 DSO

Windows 下所有扩展均为 DSO 模式,通过 LoadModule 加载:

复制代码
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule rewrite_module modules/mod_rewrite.so

无需编译,直接启用即可。

十二、性能调优(Windows 专用)

文件:conf/extra/httpd-mpm.conf

12.1 MPM WinNT(Windows 专属多处理模块)

复制代码
<IfModule mpm_winnt_module>
    ThreadsPerChild 150
    MaxConnectionsPerChild 0
</IfModule>

优化建议:

  • 并发高:ThreadsPerChild 250~500
  • 内存小:ThreadsPerChild 80~120

解释代码

  1. ThreadsPerChild 150
  • 含义每个子进程允许创建的最大线程数
  • 核心作用 :这是决定你网站并发能力最关键的参数。
  • 工作机制
    • 在 Windows 下,Apache 启动后通常只生成 1 个 子进程。
    • 这个子进程会一次性启动 150 个线程。
    • 每个线程可以处理一个用户的请求。
  • 实际效果 :设置为 150,意味着你的服务器同一时间最多可以处理 150 个 并发连接。
    • 如果第 151 个用户访问,他必须等待,直到前面的某个线程处理完任务空闲下来。
    • 注意:默认值通常是 64 或 150。如果你的网站访问量很大,这个值可能需要调大(例如 1000 或更高),但也要考虑服务器内存限制。
  1. MaxConnectionsPerChild 0
  • 含义每个子进程在销毁前允许处理的最大连接数
  • 核心作用:控制进程的生命周期,防止内存泄漏。
  • 数值解读
    • 设置为 0 (当前配置):表示不限制。子进程会一直运行,永远不会因为处理了太多请求而自动重启。
    • 设置为非 0 值 (例如 10000):表示当一个子进程累计处理了 10000 个请求后,Apache 会"杀掉"这个旧进程,并重新生成一个新的子进程来代替它。
  • 为什么要限制? :如果 Apache 或你的 PHP 代码存在微小的内存泄漏(即处理完请求后没有完全释放内存),长时间运行会导致内存被耗尽。设置一个非 0 的值可以让进程定期"重生",释放内存,保持服务器健康。

总结与建议

这段配置的意思是:

"在 Windows 系统下,Apache 启动一个子进程,该进程同时开启 150 个线程来处理请求。并且,这个进程将永久运行,除非手动重启,不会因为处理了过多请求而自动重置。"

apache的windows版本,它通常只启动一个子进程,与LINUX/Unix系统下的apache有本质的区别。Linux下apache启动父进程来管理多个子进程,window的apache的设计机制主进程负责管理服务和绑定端口,单个子进程(主进程启动唯一的子进程。多线程:这个子进程内部创建大量的线程)。

优化建议:

  • 如果是生产环境(正式网站) :建议将 MaxConnectionsPerChild 设置为一个较大的数字(如 1000020000),以防止潜在的内存泄漏导致服务器变慢。
  • 如果是高并发环境 :如果网站经常有超过 150 人同时在线操作,需要适当调大 ThreadsPerChild 的值。

12.2 通用性能优化

复制代码
HostnameLookups Off
EnableSendfile On
KeepAlive On
KeepAliveTimeout 3
TimeOut 10

启用 Gzip 压缩:

复制代码
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json

十三、安全加固(Security Tips)

13.1 隐藏版本号

复制代码
ServerTokens Prod
ServerSignature Off

13.2 禁止访问敏感目录

复制代码
<Directory "${SRVROOT}/cgi-bin">
    Require all granted
</Directory>

# 默认拒绝所有
<Directory />
    Require all denied
    AllowOverride None
</Directory>

13.3限制请求大小

复制代码
LimitRequestBody 10485760

13.4禁止列目录

复制代码
Options -Indexes
完整可直接粘贴的安全加固段(Windows 专用)

你直接复制粘贴到 httpd.conf 末尾即可:

复制代码
# ==============================
# 安全加固配置 Security Tips
# ==============================

# 隐藏版本号
ServerTokens Prod
ServerSignature Off

# 禁止根目录访问,提高安全性
<Directory />
    Require all denied
    AllowOverride None
    Options None
</Directory>

# 禁止目录浏览
Options -Indexes

# 限制请求体大小(10MB)
LimitRequestBody 10485760

# 禁止访问 .htaccess、.env 等敏感文件
<FilesMatch "\.(htaccess|htpasswd|ini|phps|sql|bak|env|log)$">
    Require all denied
</FilesMatch>

# 关闭反向DNS查询,提升速度+安全
HostnameLookups Off

# 禁用符号链接(如不需要可开启)
# Options -FollowSymLinks
四、修改后必须执行

管理员 CMD:

复制代码
httpd -t

检查无误后重启(cmd):

复制代码
httpd -k restart
如果你用了虚拟主机

虚拟主机里的安全规则写在:

复制代码
C:\Apache24\conf\extra\httpd-vhosts.conf

每个 <VirtualHost> 内部都可以单独加权限控制。

14环境变量(env)

设置环境变量供脚本使用:

复制代码
SetEnv APP_ENV production
SetEnv PATH "C:/PHP"

十六、Windows 常见问题排查

  1. 端口被占用(80/443)

    cmd

    复制代码
    netstat -ano | findstr ":80"
  2. 启动报错:系统找不到指定文件路径含中文 / 空格,或 VC++ 运行库未装

  3. 403 禁止访问目录权限不足,Apache 服务用户无读取权限

  4. 404 无法访问DocumentRoot 路径错误或文件不存在

  5. 配置不生效 未重启服务:httpd -k restart

相关推荐
zzzyyy5382 小时前
进程优先级
linux·运维·服务器
腾科IT教育2 小时前
华为云计算运维工程师怎么考?2026年报考攻略
运维·华为云·华为认证·hcip考试·华为hcip考试
Bert.Cai2 小时前
Linux head命令详解
linux·运维
Huy-C2 小时前
云计算案例排错(云上4)
linux·运维·云计算
数据知道2 小时前
claw-code 源码分析:从 REPL 到服务端——CLI / HTTP(SSE) / LSP 多入口如何共享同一颗 runtime 心?
python·网络协议·http·ai·里氏替换原则·claude code
大新软件技术部2 小时前
Linux 服务器下dotnetcore 程序监控
linux·运维·服务器
程序猿编码2 小时前
Linux内核级隐身术:进程与端口隐藏技术剖析
linux·运维·服务器·linux内核·进程
952362 小时前
网络原理 - HTTP / HTTPS
网络·http·https