Apache HTTP Server 教程

1. 核心概念

Apache HTTP Server(通常简称为 Apache)是一款开源的、功能强大的 Web 服务器软件,由 Apache 软件基金会维护。它是世界上使用最广泛的 Web 服务器之一,以其稳定性、可靠性和丰富的功能而闻名。

1.1 基本概念

  • Web 服务器:处理 HTTP 请求,提供静态资源和动态内容。
  • 虚拟主机:在单个 Apache 实例上托管多个网站。
  • 模块:Apache 的功能扩展,通过模块系统提供各种功能。
  • 配置文件:控制 Apache 行为的文本文件。
  • MPM:多处理模块(Multi-Processing Module),决定 Apache 如何处理并发连接。
  • .htaccess 文件:目录级配置文件,用于覆盖主配置。
  • 虚拟主机:基于 IP、端口或域名的虚拟主机。

1.2 工作原理

  • 多处理模块:Apache 支持多种 MPM,如 prefork、worker 和 event。
  • 请求处理:接收 HTTP 请求,根据配置处理,返回响应。
  • 模块系统:通过加载不同的模块,提供各种功能,如 SSL、认证、缓存等。
  • 配置解析:启动时解析配置文件,生成运行时配置。

2. 安装配置

2.1 安装 Apache

2.1.1 Ubuntu/Debian

# 更新软件包列表
apt update

# 安装 Apache
apt install apache2

# 启动 Apache
systemctl start apache2

# 启用 Apache 开机自启
systemctl enable apache2

# 查看 Apache 状态
systemctl status apache2

2.1.2 CentOS/RHEL

# 安装 Apache
yum install httpd

# 启动 Apache
systemctl start httpd

# 启用 Apache 开机自启
systemctl enable httpd

# 查看 Apache 状态
systemctl status httpd

2.1.3 Windows

Apache 官方网站 下载 Windows 版本,解压后按照说明安装。

2.2 基本配置

Apache 的主配置文件位置因操作系统而异:

  • Ubuntu/Debian: /etc/apache2/apache2.conf
  • CentOS/RHEL: /etc/httpd/conf/httpd.conf
  • Windows: conf/httpd.conf

2.2.1 主配置文件结构

# 全局配置
ServerRoot "/etc/apache2"
Listen 80
User www-data
Group www-data
ServerAdmin webmaster@localhost
ServerName localhost

# 模块加载
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so
LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
# 更多模块...

# 目录配置
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

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

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

# 包含其他配置文件
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

2.2.2 虚拟主机配置

Ubuntu/Debian 系统中,虚拟主机配置文件通常位于 /etc/apache2/sites-available/ 目录,然后通过符号链接到 /etc/apache2/sites-enabled/ 目录。

配置示例

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

2.3 配置检查和重载

# 检查配置文件语法
apache2ctl configtest  # Ubuntu/Debian
httpd -t  # CentOS/RHEL

# 重载配置文件
systemctl reload apache2  # Ubuntu/Debian
systemctl reload httpd  # CentOS/RHEL

# 重启 Apache
systemctl restart apache2  # Ubuntu/Debian
systemctl restart httpd  # CentOS/RHEL

# 停止 Apache
systemctl stop apache2  # Ubuntu/Debian
systemctl stop httpd  # CentOS/RHEL

3. 基本使用

3.1 静态网站托管

配置示例

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

3.2 虚拟主机管理

3.2.1 创建虚拟主机

# 创建网站目录
mkdir -p /var/www/example.com

# 创建 index.html 文件
echo "<h1>Hello, World!</h1>" > /var/www/example.com/index.html

# 创建虚拟主机配置文件
nano /etc/apache2/sites-available/example.com.conf

# 启用虚拟主机
a2ensite example.com.conf

# 重载配置文件
systemctl reload apache2

3.2.2 禁用虚拟主机

# 禁用虚拟主机
a2dissite example.com.conf

# 重载配置文件
systemctl reload apache2

3.3 模块管理

3.3.1 启用模块

# 启用模块
a2enmod rewrite  # 启用重写模块
a2enmod ssl  # 启用 SSL 模块
a2enmod headers  # 启用头部模块

# 重载配置文件
systemctl reload apache2

3.3.2 禁用模块

# 禁用模块
a2dismod rewrite  # 禁用重写模块

# 重载配置文件
systemctl reload apache2

3.4 .htaccess 文件

配置示例

# 启用重写引擎
RewriteEngine On

# 重写规则
RewriteRule ^old-path/(.*)$ /new-path/$1 [R=301,L]

# 自定义错误页面
errorDocument 404 /404.html
errorDocument 500 /500.html

# 访问控制
Order Deny,Allow
Deny from all
Allow from 192.168.1.0/24

# 缓存控制
<FilesMatch "\.(css|js|jpg|jpeg|png|gif)$">
    Header set Cache-Control "max-age=86400, public"
</FilesMatch>

4. 高级功能

4.1 SSL/TLS 配置

配置示例

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.pem

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

4.2 反向代理

配置示例

# 启用代理模块
a2enmod proxy proxy_http

# 配置反向代理
<VirtualHost *:80>
    ServerName example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

    <Location />
        Require all granted
    </Location>
</VirtualHost>

4.3 负载均衡

配置示例

# 启用代理模块
a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests

# 配置负载均衡
<VirtualHost *:80>
    ServerName example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    <Proxy "balancer://mycluster">
        BalancerMember http://localhost:3000
        BalancerMember http://localhost:3001
        BalancerMember http://localhost:3002
        ProxySet lbmethod=byrequests
    </Proxy>

    ProxyPreserveHost On
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/

    <Location />
        Require all granted
    </Location>
</VirtualHost>

4.4 缓存配置

配置示例

# 启用缓存模块
a2enmod cache cache_disk

# 配置缓存
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    # 配置磁盘缓存
    CacheEnable disk /
    CacheRoot /var/cache/apache2
    CacheDirLevels 2
    CacheDirLength 1
    CacheMaxFileSize 1000000
    CacheMinFileSize 1

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

4.5 URL 重写

配置示例

# 启用重写模块
a2enmod rewrite

# 配置重写规则
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted

        # 重写规则
        RewriteEngine On
        RewriteBase /
        
        # 去除 .php 扩展名
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME}\.php -f
        RewriteRule ^(.*)$ $1.php [L]
        
        # 重定向到 HTTPS
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </Directory>
</VirtualHost>

5. 最佳实践

5.1 配置最佳实践

  • 使用模块化配置:将不同功能的配置分离到不同的文件中。
  • 使用虚拟主机:为每个网站使用单独的虚拟主机配置。
  • 限制 .htaccess 使用:尽量在主配置文件中配置,减少 .htaccess 的使用。
  • 设置合理的权限:确保文件和目录权限合理,避免安全风险。
  • 启用日志:配置详细的日志,便于故障排查。
  • 使用环境变量:使用环境变量管理配置,便于不同环境的部署。

5.2 性能优化

  • 选择合适的 MPM:根据服务器硬件和流量特性,选择合适的 MPM。
  • 调整 MPM 参数:根据服务器硬件,调整 MPM 的参数,如最大连接数、进程数等。
  • 启用压缩:启用 mod_deflate 模块,压缩传输数据。
  • 启用缓存:启用 mod_cache 模块,缓存静态资源。
  • 优化静态资源:对静态资源设置合理的缓存头。
  • 使用 CDN:对于静态资源,使用 CDN 加速。
  • 启用 HTTP/2:启用 HTTP/2,提高传输效率。

5.3 安全最佳实践

  • 更新 Apache:及时更新 Apache 到最新版本,修复安全漏洞。
  • 禁用不必要的模块:禁用不需要的模块,减少攻击面。
  • 配置 SSL/TLS:使用强密码套件,启用 HTTP/2 和 HSTS。
  • 限制访问:使用 Require 指令限制对敏感路径的访问。
  • 隐藏版本信息:在配置中隐藏 Apache 版本信息。
  • 设置合理的文件权限:确保文件和目录权限合理,避免安全风险。
  • 使用防火墙:配置防火墙,限制对 Apache 端口的访问。
  • 定期备份:定期备份 Apache 配置文件和网站数据。
  • 使用 mod_security:启用 mod_security 模块,提供 Web 应用防火墙功能。

6. 实用应用案例

6.1 企业网站托管

场景:托管企业官网,提供静态内容和动态应用。

配置

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/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:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder off
    SSLSessionTickets off

    # 启用 HTTP/2
    Protocols h2 http/1.1

    # 启用 HSTS
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" always

    <Directory /var/www/example.com>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # 静态资源缓存
    <FilesMatch "\.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>

    # 动态内容
    <Location /api>
        ProxyPass http://localhost:8000
        ProxyPassReverse http://localhost:8000
        ProxyPreserveHost On
    </Location>
</VirtualHost>

6.2 PHP 应用托管

场景:托管基于 PHP 的应用,如 WordPress、Drupal 等。

配置

# 启用 PHP 模块
a2enmod php7.4  # 根据 PHP 版本调整

<VirtualHost *:80>
    ServerName wordpress.example.com
    DocumentRoot /var/www/wordpress
    ErrorLog ${APACHE_LOG_DIR}/wordpress_error.log
    CustomLog ${APACHE_LOG_DIR}/wordpress_access.log combined

    <Directory /var/www/wordpress>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # PHP 配置
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    # 上传文件大小限制
    php_value upload_max_filesize 20M
    php_value post_max_size 20M
    php_value max_execution_time 30
    php_value max_input_time 30
</VirtualHost>

6.3 多网站托管

场景:在单个 Apache 实例上托管多个网站。

配置

# 网站 1
<VirtualHost *:80>
    ServerName site1.com
    DocumentRoot /var/www/site1
    ErrorLog ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined

    <Directory /var/www/site1>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

# 网站 2
<VirtualHost *:80>
    ServerName site2.com
    DocumentRoot /var/www/site2
    ErrorLog ${APACHE_LOG_DIR}/site2_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_access.log combined

    <Directory /var/www/site2>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

# 网站 3(HTTPS)
<VirtualHost *:443>
    ServerName site3.com
    DocumentRoot /var/www/site3
    ErrorLog ${APACHE_LOG_DIR}/site3_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/site3_ssl_access.log combined

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/site3.com.crt
    SSLCertificateKeyFile /etc/ssl/private/site3.com.key

    <Directory /var/www/site3>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName site3.com
    Redirect permanent / https://site3.com/
</VirtualHost>

7. 总结

Apache HTTP Server 是一款功能强大、稳定可靠的 Web 服务器软件,广泛应用于各种场景,从简单的静态网站托管到复杂的企业级应用。

通过本教程的学习,您应该已经掌握了 Apache 的核心概念、安装配置、基本使用、高级功能和最佳实践。在实际应用中,您可以根据具体的需求,灵活配置 Apache,以满足不同场景的要求。

7.1 核心优势

  • 稳定性:经过多年的发展和验证,具有良好的稳定性和可靠性。
  • 功能丰富:支持虚拟主机、SSL/TLS、反向代理、负载均衡等多种功能。
  • 模块系统:通过模块系统,可以灵活扩展功能。
  • 配置灵活:丰富的配置选项,可以满足各种需求。
  • 跨平台:支持多种操作系统,如 Linux、Windows、macOS 等。
  • 开源免费:开源软件,免费使用。
  • 广泛的社区支持:拥有庞大的用户社区和丰富的文档资源。

7.2 应用前景

随着互联网的发展,Web 服务器的需求仍然很大。Apache 作为一款成熟的 Web 服务器软件,在以下场景中仍然有着广泛的应用前景:

  • 企业网站:托管企业官网、内部系统等。
  • 电子商务网站:托管在线商店、支付系统等。
  • 内容管理系统:托管 WordPress、Drupal、Joomla 等 CMS。
  • Web 应用:托管基于 PHP、Python、Ruby 等语言的 Web 应用。
  • API 服务:作为 API 服务的前端服务器。
  • 反向代理:作为后端服务的反向代理。

通过不断学习和实践 Apache 的功能和最佳实践,您可以充分发挥 Apache 的优势,构建高性能、可靠、安全的 Web 服务。

« 上一篇 Nginx 教程 下一篇 » Caddy 教程