模块管理
模块管理
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_rewrite | URL 重写 | SEO 友好 URL、重定向 |
mod_alias | URL 别名 | 简单重定向、路径映射 |
mod_dir | 目录处理 | 默认文档、尾部斜杠 |
mod_mime | MIME 类型 | 文件类型识别 |
mod_headers | HTTP 头操作 | 安全头、CORS |
mod_env | 环境变量 | 设置/传递环境变量 |
mod_setenvif | 条件环境变量 | 基于请求设置变量 |
2.2 安全模块
| 模块 | 功能 | 常用场景 |
|---|
mod_ssl | SSL/TLS 支持 | HTTPS 配置 |
mod_auth_basic | 基本认证 | 简单密码保护 |
mod_auth_digest | 摘要认证 | 更安全的认证 |
mod_authn_file | 文件认证 | 基于文件的用户认证 |
mod_authz_host | 主机访问控制 | IP/域名限制 |
mod_security | Web 应用防火墙 | WAF、入侵检测 |
2.3 代理与缓存模块
| 模块 | 功能 | 常用场景 |
|---|
mod_proxy | 代理核心 | 反向代理基础 |
mod_proxy_http | HTTP 代理 | 代理 HTTP 请求 |
mod_proxy_balancer | 负载均衡 | 多后端分发 |
mod_proxy_wstunnel | WebSocket 代理 | WebSocket 支持 |
mod_cache | 缓存核心 | 响应缓存 |
mod_cache_disk | 磁盘缓存 | 文件系统缓存 |
2.4 性能模块
| 模块 | 功能 | 常用场景 |
|---|
mod_deflate | 压缩 | gzip 压缩响应 |
mod_expires | 过期控制 | 浏览器缓存 |
mod_brotli | Brotli 压缩 | 更高效的压缩 |
mod_http2 | HTTP/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. 注意事项
- 模块依赖:某些模块依赖其他模块,需按顺序加载
- 版本兼容:确保模块版本与 Apache 版本兼容
- 性能影响:每个加载的模块都会消耗内存和 CPU
- 安全风险:只加载必要的模块,减少攻击面
- 配置冲突:某些模块可能有配置冲突
9. 扩展阅读
10. 总结
Apache 模块系统是其强大功能的基础:
- 模块化设计:按需加载,灵活扩展
- 丰富生态:官方和第三方模块覆盖各种需求
- 动态加载:无需重新编译即可添加功能
- 安全可控:通过模块精简减少攻击面
合理管理模块是优化 Apache 性能和安全的关键步骤。