Apache HTTP服务器 实战教程


什么是Apache HTTP服务器?

Apache HTTP服务器(简称Apache)是世界领先的开源Web服务器软件。自1995年以来,它一直是互联网上最受欢迎的Web服务器之一,以其稳定性、安全性和灵活性而闻名。

Apache的主要特点:

  • 开源免费:完全开源,无许可费用
  • 跨平台支持:支持Linux、Windows、macOS等多种操作系统
  • 模块化架构:丰富的模块生态系统
  • 高度可配置:灵活的配置选项
  • 稳定性强:经过长期验证的稳定性
  • 社区支持:活跃的开发者社区

1. Apache安装与配置

1.1 Ubuntu/Debian系统安装

# 更新包列表
sudo apt update

# 安装Apache
sudo apt install apache2

# 检查Apache状态
sudo systemctl status apache2

# 启动Apache
sudo systemctl start apache2

# 设置开机自启
sudo systemctl enable apache2

# 检查Apache版本
apache2 -v

1.2 CentOS/RHEL系统安装

# 安装Apache (httpd)
sudo yum install httpd

# 或使用dnf (CentOS 8+)
sudo dnf install httpd

# 启动和设置开机自启
sudo systemctl start httpd
sudo systemctl enable httpd

# 检查状态
sudo systemctl status httpd

1.3 Docker方式安装

# 拉取Apache镜像
docker pull httpd:latest

# 运行Apache容器
docker run -d \
  --name my-apache \
  -p 80:80 \
  -p 443:443 \
  -v $(pwd)/htdocs:/usr/local/apache2/htdocs \
  -v $(pwd)/httpd.conf:/usr/local/apache2/conf/httpd.conf \
  httpd:latest

# 查看容器日志
docker logs my-apache

1.4 Docker Compose方式安装

# docker-compose.yml
version: '3.8'

services:
  apache:
    image: httpd:latest
    container_name: apache-server
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./htdocs:/usr/local/apache2/htdocs:ro
      - ./conf/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro
      - ./conf/extra:/usr/local/apache2/conf/extra:ro
      - ./logs:/usr/local/apache2/logs
      - ./ssl:/usr/local/apache2/ssl
    networks:
      - web-network

networks:
  web-network:
    driver: bridge

2. Apache基础配置

2.1 主配置文件结构

# /etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf
#
# 基本服务器配置
#

# 服务器根目录
ServerRoot "/etc/apache2"

# 服务器名称
ServerName localhost:80

# 监听端口
Listen 80

# 模块加载
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

# 用户和组
User www-data
Group www-data

# 主文档目录
DocumentRoot "/var/www/html"

# 目录权限设置
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 默认首页
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm

# 日志配置
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

2.2 虚拟主机配置

# /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    
    # 访问日志和错误日志
    LogLevel info
    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
    
    # 目录配置
    <Directory "/var/www/example.com">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
        DirectoryIndex index.html index.php
    </Directory>
    
    # 静态资源缓存
    <LocationMatch "\.(jpg|jpeg|png|gif|ico|css|js)$">
        ExpiresActive On
        ExpiresDefault "access plus 1 month"
        Header append Cache-Control "public, immutable"
    </LocationMatch>
</VirtualHost>

3. 模块化配置

3.1 常用模块配置

# 启用常用模块
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so

3.2 URL重写配置

# .htaccess 文件示例
RewriteEngine On

# 重定向www到非www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

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

# 隐藏PHP扩展名
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# SEO友好的URL重写
RewriteRule ^article/([0-9]+)/([a-zA-Z0-9-]+)/?$ article.php?id=$1&slug=$2 [L]
RewriteRule ^user/([a-zA-Z0-9-]+)/?$ profile.php?username=$1 [L]

3.3 Gzip压缩配置

# 启用压缩
<IfModule mod_deflate.c>
    # 压缩HTML、CSS、JavaScript
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-font-opentype
    AddOutputFilterByType DEFLATE font/truetype
    AddOutputFilterByType DEFLATE font/opentype
    AddOutputFilterByType DEFLATE image/svg+xml

    # 压缩级别
    DeflateCompressionLevel 6
    DeflateMemLevel 9
    DeflateWindowSize 15
</IfModule>

4. SSL/TLS配置

4.1 SSL模块配置

# 启用SSL模块
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

# SSL配置
Listen 443 ssl

# SSL全局配置
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
SSLSessionTickets Off
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLProxyCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

4.2 HTTPS虚拟主机配置

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    
    # SSL证书配置
    SSLEngine on
    SSLCertificateFile /path/to/certificate.crt
    SSLCertificateKeyFile /path/to/private.key
    SSLCertificateChainFile /path/to/chain.crt
    
    # SSL安全配置
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder on
    SSLSessionTickets off
    
    # OCSP装订
    SSLUseStapling on
    SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
    SSLStaplingForceURL "http://ocsp.example.com"
    
    # 安全头部
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    
    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
</VirtualHost>

4.3 Let's Encrypt配置

# 安装Certbot
sudo apt install certbot python3-certbot-apache

# 获取SSL证书
sudo certbot --apache -d example.com -d www.example.com

# 自动续期
sudo crontab -e
# 添加以下行
0 12 * * * /usr/bin/certbot renew --quiet --apache

5. 反向代理配置

5.1 基本反向代理

# 启用代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

# 基本反向代理配置
<VirtualHost *:80>
    ServerName api.example.com
    
    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    
    # 代理头部设置
    RequestHeader unset Accept-Encoding
    ProxyPassReverse /api/ http://localhost:3000/api/
    
    # 错误处理
    ProxyErrorOverride On
</VirtualHost>

5.2 负载均衡配置

# 启用负载均衡模块
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule status_module modules/mod_status.so

# 负载均衡配置
<Proxy "balancer://mycluster">
    BalancerMember "http://192.168.1.10:3000" loadfactor=3 route=node1
    BalancerMember "http://192.168.1.11:3000" loadfactor=2 route=node2
    BalancerMember "http://192.168.1.12:3000" loadfactor=1 route=node3
    ProxySet lbmethod=byrequests
    ProxySet hcmethod=GET
    ProxySet hcuri=/health
</Proxy>

<VirtualHost *:80>
    ServerName app.example.com
    
    ProxyPreserveHost On
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
    
    # 会话持久化
    ProxyHTMLEnable On
    ProxyHTMLURLMap http://192.168.1.10:3000 / 
    ProxyHTMLURLMap http://192.168.1.11:3000 /
    ProxyHTMLURLMap http://192.168.1.12:3000 /
    
    # 健康检查页面
    <Location "/balancer-manager">
        SetHandler balancer-manager
        Require ip 127.0.0.1
        Require ip 192.168.1.0/24
    </Location>
</VirtualHost>

5.3 WebSocket支持

# 启用WebSocket代理模块
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

<VirtualHost *:80>
    ServerName ws.example.com
    
    # WebSocket代理
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]
    
    # HTTP代理
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    
    # 保持连接
    ProxyPreserveHost On
    ProxyAddHeaders On
    ProxyPassReverse /ws ws://localhost:8080/ws
</VirtualHost>

6. 安全配置

6.1 基本安全配置

# 安全相关的配置
ServerTokens Prod
ServerSignature Off

# 隐藏Apache版本
TraceEnable Off

# 安全头部
<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'"
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</IfModule>

# 防止敏感文件访问
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

<FilesMatch "\.(env|ini|log|sh|sql|bak|backup|swp|swo)$">
    Require all denied
</FilesMatch>

6.2 访问控制

# IP访问控制
<Directory "/var/www/admin">
    Require ip 192.168.1.0/24
    Require ip 10.0.0.0/8
    Require all denied
</Directory>

# 基本身份认证
<Directory "/var/www/protected">
    AuthType Basic
    AuthName "Restricted Area"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Directory>

# 基于用户的认证
<Location "/admin">
    AuthType Basic
    AuthName "Admin Area"
    AuthUserFile /etc/apache2/.htpasswd
    Require user admin
    Require ip 192.168.1.100
</Location>

6.3 请求限制

# 启用请求限制模块
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule evasive20_module modules/mod_evasive20.so

# 请求超时设置
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500

# 请求大小限制
LimitRequestBody 10485760  # 10MB
LimitRequestFields 100
LimitRequestFieldSize 8190
LimitRequestLine 8190

# DDoS防护
<IfModule mod_evasive20.c>
    DOSHashTableSize    2048
    DOSPageCount        2
    DOSPageInterval     1
    DOSSiteCount        50
    DOSSiteInterval     1
    DOSBlockingPeriod   600
</IfModule>

7. 性能优化

7.1 MPM配置优化

# prefork MPM配置(适用于PHP等非线程安全模块)
<IfModule mpm_prefork_module>
    StartServers             2
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      150
    MaxConnectionsPerChild   0
</IfModule>

# worker MPM配置(适用于线程安全模块)
<IfModule mpm_worker_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

# event MPM配置(推荐用于现代系统)
<IfModule mpm_event_module>
    StartServers             2
    MinSpareThreads         25
    MaxSpareThreads        75
    ThreadLimit             64
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

7.2 缓存配置

# 启用缓存模块
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule cache_socache_module modules/mod_cache_socache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

# 磁盘缓存配置
<IfModule mod_cache_disk.c>
    CacheRoot /var/cache/apache2/mod_cache_disk
    CacheEnable disk /
    CacheDirLevels 2
    CacheDirLength 1
    CacheDefaultExpire 3600
    CacheMaxExpire 86400
    CacheLastModifiedFactor 0.1
    CacheIgnoreHeaders Set-Cookie
</IfModule>

# 缓存静态资源
<FilesMatch "\.(jpg|jpeg|png|gif|ico|css|js|pdf|txt|zip|rar)$">
    ExpiresActive On
    ExpiresDefault "access plus 1 month"
    Header append Cache-Control "public, immutable"
</FilesMatch>

7.3 HTTP/2配置

# 启用HTTP/2模块
LoadModule http2_module modules/mod_http2.so

# HTTP/2全局配置
Protocols h2 http/1.1
H2Direct on
H2ModernTLSOnly on

# 虚拟主机HTTP/2配置
<VirtualHost *:443>
    ServerName example.com
    
    # 启用HTTP/2
    Protocols h2 http/1.1
    
    # HTTP/2特定配置
    H2Push on
    H2PushPriority "text/css" "after"
    H2PushPriority "application/javascript" "after"
    H2PushResource "/css/style.css" critical
    H2PushResource "/js/app.js" critical
    
    # SSL配置
    SSLEngine on
    SSLCertificateFile /path/to/certificate.crt
    SSLCertificateKeyFile /path/to/private.key
    SSLCertificateChainFile /path/to/chain.crt
</VirtualHost>

8. 监控与日志

8.1 详细日志配置

# 自定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_with_time
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{User-agent}i" agent

# 虚拟主机日志配置
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    
    # 访问日志
    CustomLog logs/example_access.log combined_with_time
    # 或使用syslog
    # CustomLog "|/usr/bin/logger -t httpd -p local6.info" combined
    
    # 错误日志
    ErrorLog logs/example_error.log
    LogLevel warn
</VirtualHost>

# 条件日志记录
SetEnvIf Request_URI "^/api/" api_request
CustomLog logs/api_access.log combined env=api_request

8.2 服务器状态监控

# 服务器状态模块
LoadModule status_module modules/mod_status.so

<Location "/server-status">
    SetHandler server-status
    Require ip 127.0.0.1
    Require ip 192.168.1.0/24
    
    # 显示详细信息
    # ExtendedStatus On
</Location>

# 服务器信息页面
<Location "/server-info">
    SetHandler server-info
    Require ip 127.0.0.1
    Require ip 192.168.1.0/24
</Location>

8.3 性能监控脚本

#!/bin/bash
# apache_monitor.sh - Apache性能监控脚本

APACHE_STATUS_URL="http://localhost/server-status?auto"

# 检查Apache进程
if pgrep apache2 > /dev/null || pgrep httpd > /dev/null; then
    echo "Apache is running"
else
    echo "Apache is not running"
    exit 1
fi

# 检查配置
if apache2ctl configtest > /dev/null 2>&1 || httpd -t > /dev/null 2>&1; then
    echo "Apache configuration is valid"
else
    echo "Apache configuration has errors"
    exit 1
fi

# 获取服务器状态信息
if curl -s $APACHE_STATUS_URL > /dev/null; then
    TOTAL_ACCESS=$(curl -s $APACHE_STATUS_URL | grep "Total Accesses:" | awk '{print $3}')
    TOTAL_KBYTES=$(curl -s $APACHE_STATUS_URL | grep "Total kBytes:" | awk '{print $3}')
    UPTIME=$(curl -s $APACHE_STATUS_URL | grep "Uptime:" | awk '{print $2}')
    REQ_PER_SEC=$(curl -s $APACHE_STATUS_URL | grep "ReqPerSec:" | awk '{print $2}')
    
    echo "Total Requests: $TOTAL_ACCESS"
    echo "Total KB Transferred: $TOTAL_KBYTES"
    echo "Uptime: $UPTIME seconds"
    echo "Requests per Second: $REQ_PER_SEC"
fi

# 检查错误日志
ERROR_COUNT=$(grep -c "$(date '+%d/%b/%Y')" /var/log/apache2/error.log 2>/dev/null || grep -c "$(date '+%d/%b/%Y')" /var/log/httpd/error_log 2>/dev/null)
echo "Errors today: $ERROR_COUNT"

# 检查进程数
PROCESS_COUNT=$(pgrep apache2 | wc -l 2>/dev/null || pgrep httpd | wc -l 2>/dev/null)
echo "Apache processes: $PROCESS_COUNT"

9. 最佳实践

9.1 安全加固配置

# 全面的安全加固配置
ServerTokens Prod
ServerSignature Off
TraceEnable Off

# 安全头部
<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>

# 防止敏感文件访问
<FilesMatch "^.">
    Require all denied
</FilesMatch>

<FilesMatch "\.(env|ini|log|sh|sql|bak|backup|conf|yml|yaml)$">
    Require all denied
</FilesMatch>

# 限制请求方法
<LimitExcept GET POST HEAD>
    Require all denied
</LimitExcept>

9.2 性能优化配置

# 性能优化配置
<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadLimit             64
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild 10000
</IfModule>

# 启用压缩
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
</IfModule>

# 启用缓存
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
ExpiresByType application/font-woff2 "access plus 1 year"
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType font/opentype "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"

# 保持连接
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

9.3 部署最佳实践

#!/bin/bash
# apache_deployment.sh - Apache部署脚本

CONFIG_DIR="/etc/apache2"
BACKUP_DIR="/etc/apache2/backups"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

echo "Backing up current configuration..."
cp -r $CONFIG_DIR/sites-available $BACKUP_DIR/sites-available_$DATE
cp -r $CONFIG_DIR/conf-available $BACKUP_DIR/conf-available_$DATE
cp $CONFIG_DIR/apache2.conf $BACKUP_DIR/apache2.conf_$DATE

# 验证配置
echo "Testing configuration..."
if apache2ctl configtest; then
    echo "Configuration test passed"
    
    # 优雅重启
    echo "Restarting Apache..."
    systemctl reload apache2
    
    # 验证服务状态
    sleep 2
    if systemctl is-active --quiet apache2; then
        echo "Apache restarted successfully"
        # 清理旧备份(保留最近5个)
        ls -t $BACKUP_DIR | tail -n +6 | xargs -I {} rm -rf $BACKUP_DIR/{}
    else
        echo "Apache restart failed, attempting recovery..."
        systemctl start apache2
        if ! systemctl is-active --quiet apache2; then
            echo "Recovery failed, restoring backup..."
            cp $BACKUP_DIR/apache2.conf_$DATE $CONFIG_DIR/apache2.conf
            systemctl restart apache2
            exit 1
        fi
    fi
else
    echo "Configuration test failed, restoring backup..."
    cp $BACKUP_DIR/apache2.conf_$DATE $CONFIG_DIR/apache2.conf
    exit 1
fi

echo "Deployment completed successfully"

9.4 应用场景配置示例

# API网关配置示例
<VirtualHost *:443>
    ServerName api.example.com
    
    # SSL配置
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/api.example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/api.example.com.key
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    
    # 反向代理配置
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    
    # 请求限制
    <Location "/">
        # 限流配置(需要mod_evasive或其他限流模块)
        # 每个IP每秒最多100个请求
    </Location>
    
    # API特定头部
    Header always set X-API-Version "1.0"
    Header always set X-RateLimit-Limit "1000"
    Header always set X-RateLimit-Remaining "999"
    
    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/api_error.log
    CustomLog ${APACHE_LOG_DIR}/api_access.log combined
</VirtualHost>

# 静态文件服务器配置示例
<VirtualHost *:80>
    ServerName static.example.com
    DocumentRoot /var/www/static
    
    # 静态资源优化
    <Directory "/var/www/static">
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
        
        # 启用缓存
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
        Header append Cache-Control "public, immutable"
    </Directory>
    
    # 压缩配置
    <LocationMatch "\.(html|htm|css|js|xml|json)$">
        SetOutputFilter DEFLATE
    </LocationMatch>
    
    # 安全配置
    <FilesMatch "\.(env|ini|log|sh|sql|bak|backup|conf)$">
        Require all denied
    </FilesMatch>
    
    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/static_error.log
    CustomLog ${APACHE_LOG_DIR}/static_access.log combined
</VirtualHost>

总结

Apache HTTP服务器是一个功能强大、稳定可靠的Web服务器软件。通过合理的配置,可以实现高性能的Web服务、反向代理、负载均衡等功能。掌握Apache的核心概念和配置技巧,能够帮助开发者构建安全、高效、可扩展的Web应用架构。在实际部署中,需要注意安全配置、性能优化和监控维护,确保系统的稳定运行。