强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Apache HTTP Server 完全指南 / 模块管理

模块管理

Apache 的模块化架构是其灵活性的核心。通过加载不同的模块,可以扩展 Apache 的功能。

1. 模块类型

1.1 静态模块与动态模块

类型描述优点缺点
静态模块编译进 Apache 二进制文件性能好,无加载开销需重新编译
动态模块运行时加载(DSO)灵活,无需重新编译略有性能开销

1.2 查看已加载模块

# 查看编译的静态模块
apachectl -l
# 或
httpd -l

# 查看所有加载的模块(静态+动态)
apachectl -M
# 或
httpd -M

# 输出示例:
# core_module (static)
# so_module (static)
# http_module (static)
# mpm_event_module (shared)
# ssl_module (shared)
# rewrite_module (shared)
# proxy_module (shared)

1.3 动态模块管理

# 加载动态模块
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so

# 条件加载
<IfModule !mod_ssl.c>
    # SSL 模块未加载时的配置
</IfModule>

Debian/Ubuntu 模块管理:

# 启用模块
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http

# 禁用模块
sudo a2dismod status
sudo a2dismod info

# 列出可用模块
ls /etc/apache2/mods-available/

# 列出已启用模块
ls /etc/apache2/mods-enabled/

# 重新加载配置
sudo systemctl reload apache2

2. 常用模块一览

2.1 核心功能模块

模块功能常用场景
mod_rewriteURL 重写SEO 友好 URL、重定向
mod_aliasURL 别名简单重定向、路径映射
mod_dir目录处理默认文档、尾部斜杠
mod_mimeMIME 类型文件类型识别
mod_headersHTTP 头操作安全头、CORS
mod_env环境变量设置/传递环境变量
mod_setenvif条件环境变量基于请求设置变量

2.2 安全模块

模块功能常用场景
mod_sslSSL/TLS 支持HTTPS 配置
mod_auth_basic基本认证简单密码保护
mod_auth_digest摘要认证更安全的认证
mod_authn_file文件认证基于文件的用户认证
mod_authz_host主机访问控制IP/域名限制
mod_securityWeb 应用防火墙WAF、入侵检测

2.3 代理与缓存模块

模块功能常用场景
mod_proxy代理核心反向代理基础
mod_proxy_httpHTTP 代理代理 HTTP 请求
mod_proxy_balancer负载均衡多后端分发
mod_proxy_wstunnelWebSocket 代理WebSocket 支持
mod_cache缓存核心响应缓存
mod_cache_disk磁盘缓存文件系统缓存

2.4 性能模块

模块功能常用场景
mod_deflate压缩gzip 压缩响应
mod_expires过期控制浏览器缓存
mod_brotliBrotli 压缩更高效的压缩
mod_http2HTTP/2 支持现代协议支持

2.5 监控与日志模块

模块功能常用场景
mod_status服务器状态监控面板
mod_info服务器信息配置查看
mod_log_config日志配置自定义日志
mod_log_forensic取证日志安全审计

3. mod_rewrite 基础

3.1 启用 mod_rewrite

# Debian/Ubuntu
sudo a2enmod rewrite
sudo systemctl reload apache2

# CentOS/RHEL
# 确保 httpd.conf 中有:
# LoadModule rewrite_module modules/mod_rewrite.so

3.2 基本配置

# 启用重写引擎
RewriteEngine On

# 简单重定向
RewriteRule ^old-page\.html$ /new-page.html [R=301,L]

# 条件重写
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

# URL 路由
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

3.3 常见用法示例

# 强制 HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 移除 www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

# 添加 www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# 自定义 404 页面
ErrorDocument 404 /custom-404.html

# 禁止目录列表
Options -Indexes

# 禁止图片盗链
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F,NC]

4. mod_proxy 基础

4.1 启用 mod_proxy

# 启用必要的模块
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl reload apache2

4.2 基本反向代理

# 简单反向代理
<VirtualHost *:80>
    ServerName app.example.com
    
    ProxyPreserveHost On
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

# 路径代理
<VirtualHost *:80>
    ServerName www.example.com
    
    # 主站
    DocumentRoot /var/www/html
    
    # API 代理
    ProxyPass /api http://localhost:3000/api
    ProxyPassReverse /api http://localhost:3000/api
    
    # 管理后台代理
    ProxyPass /admin http://localhost:8080/admin
    ProxyPassReverse /admin http://localhost:8080/admin
</VirtualHost>

4.3 负载均衡

# 负载均衡配置
<Proxy balancer://mycluster>
    BalancerMember http://192.168.1.101:8080 loadfactor=1
    BalancerMember http://192.168.1.102:8080 loadfactor=2
    BalancerMember http://192.168.1.103:8080 loadfactor=1
    
    # 均衡算法
    ProxySet lbmethod=byrequests
    # byrequests - 按请求数
    # bytraffic - 按流量
    # bybusyness - 按繁忙度
</Proxy>

<VirtualHost *:80>
    ServerName www.example.com
    
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
    
    # 负载均衡管理界面
    <Location /balancer-manager>
        SetHandler balancer-manager
        Require ip 127.0.0.1
    </Location>
</VirtualHost>

5. mod_ssl 基础

5.1 启用 mod_ssl

# Debian/Ubuntu
sudo a2enmod ssl
sudo systemctl reload apache2

# 生成自签名证书(测试用)
sudo openssl req -x509 -nodes -days 365 \
    -newkey rsa:2048 \
    -keyout /etc/ssl/private/selfsigned.key \
    -out /etc/ssl/certs/selfsigned.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Test/CN=localhost"

5.2 基本 SSL 配置

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/html
    
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/www.example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/www.example.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.pem
    
    # 安全协议
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    
    # 密码套件
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder on
    
    # HSTS
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

6. 模块开发基础

6.1 编写简单模块

/* mod_example.c */
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"

/* 模块声明 */
module AP_MODULE_DECLARE_DATA example_module;

/* 处理函数 */
static int example_handler(request_rec *r) {
    if (strcmp(r->handler, "example")) {
        return DECLINED;
    }
    
    ap_set_content_type(r, "text/html");
    ap_rprintf(r, "<h1>Hello from mod_example!</h1>");
    ap_rprintf(r, "<p>URI: %s</p>", r->uri);
    
    return OK;
}

/* 注册钩子 */
static void register_hooks(apr_pool_t *p) {
    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* 模块定义 */
module AP_MODULE_DECLARE_DATA example_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir config */
    NULL,                  /* merge per-dir config */
    NULL,                  /* create per-server config */
    NULL,                  /* merge per-server config */
    NULL,                  /* command apr_table_t */
    register_hooks         /* register hooks */
};

6.2 编译和安装模块

# 使用 apxs 编译
apxs -cia mod_example.c

# 手动编译
apxs -c mod_example.c
sudo apxs -i mod_example.c

# 添加到配置
echo "LoadModule example_module modules/mod_example.so" | \
    sudo tee /etc/apache2/mods-available/example.load

# 启用模块
sudo a2enmod example
sudo systemctl restart apache2

6.3 测试模块

# 配置使用模块
<Location "/example">
    SetHandler example
</Location>
# 测试访问
curl http://localhost/example
# <h1>Hello from mod_example!</h1>
# <p>URI: /example</p>

7. 模块配置最佳实践

7.1 最小化模块加载

# 只加载必要的模块
# 注释掉不需要的模块

# 通常需要的模块
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module modules/mod_dir.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so

# 按需加载
#LoadModule info_module modules/mod_info.so
#LoadModule status_module modules/mod_status.so

7.2 模块版本管理

# 查看模块版本
apachectl -M 2>&1 | grep module_name

# 检查模块依赖
ldd /usr/lib/apache2/modules/mod_ssl.so

# 更新模块
sudo apt update
sudo apt upgrade libapache2-mod-*

7.3 模块安全配置

# 禁用危险模块功能
<IfModule mod_status.c>
    # 只允许内部访问
    <Location "/server-status">
        SetHandler server-status
        Require ip 127.0.0.1
        Require ip ::1
    </Location>
</IfModule>

<IfModule mod_info.c>
    <Location "/server-info">
        SetHandler server-info
        Require ip 127.0.0.1
    </Location>
</IfModule>

8. 注意事项

  1. 模块依赖:某些模块依赖其他模块,需按顺序加载
  2. 版本兼容:确保模块版本与 Apache 版本兼容
  3. 性能影响:每个加载的模块都会消耗内存和 CPU
  4. 安全风险:只加载必要的模块,减少攻击面
  5. 配置冲突:某些模块可能有配置冲突

9. 扩展阅读

10. 总结

Apache 模块系统是其强大功能的基础:

  • 模块化设计:按需加载,灵活扩展
  • 丰富生态:官方和第三方模块覆盖各种需求
  • 动态加载:无需重新编译即可添加功能
  • 安全可控:通过模块精简减少攻击面

合理管理模块是优化 Apache 性能和安全的关键步骤。