在Ubuntu或Debian VPS上配置Apache Web服务器的详细指南

本文详细讲解了在Ubuntu或Debian系统上配置Apache Web服务器的完整步骤,包括文件层次结构解析、全局配置调整、虚拟主机设置、模块管理以及性能优化技巧。

在Ubuntu或Debian VPS上配置Apache Web服务器

引言

Apache是互联网上最流行的Web服务器之一,为超过一半的活跃网站提供服务。尽管有许多可用的Web服务器,但由于Apache的普遍性,理解其工作原理非常有帮助。 本文将探讨一些通用配置文件及其中的可控制选项。本文遵循Ubuntu/Debian的Apache文件布局,与其他发行版的配置层次结构有所不同。

版本兼容性:本教程已在Ubuntu 22.04 LTS、Ubuntu 24.04 LTS、Ubuntu 25.04以及Debian 11和Debian 12上验证和测试。本指南中显示的所有命令和配置均与这些版本兼容。Apache的配置结构和命令(如a2ensite、a2dissite、a2enmod和a2dismod)在所有这些Ubuntu和Debian版本中工作方式一致。

关键要点

  • 模块化配置结构:Ubuntu/Debian上的Apache采用模块化配置系统,拥有独立的目录用于站点(sites-available/和sites-enabled/)、模块(mods-available/和mods-enabled/)以及配置片段(conf-available/和conf-enabled/),使得无需编辑单一文件即可轻松启用或禁用功能。
  • 虚拟主机管理:虚拟主机允许您在单台服务器上托管多个网站。a2ensitea2dissite命令通过创建或移除符号链接来管理站点配置,而ServerNameServerAlias指令控制每个虚拟主机处理哪些域名。
  • 全局配置选项:主apache2.conf文件中的关键性能设置,如TimeoutKeepAliveMaxKeepAliveRequestsKeepAliveTimeout,会显著影响服务器性能,应根据您的流量模式和服务器资源进行调整。
  • 目录安全:Apache按照从最具体到最不具体的顺序应用目录配置,允许您设置基线安全规则(如拒绝所有访问),然后授予特定目录的访问权限。AllowOverride指令控制.htaccess文件是否可以覆盖服务器设置。
  • 模块系统:Apache的模块系统允许您通过a2enmoda2dismod命令启用或禁用模块来扩展功能。事件MPM(多处理模块)是现代Ubuntu/Debian安装中的默认模块,可高效处理并发连接。

先决条件

配置Apache Web服务器的5个步骤

  1. Apache文件层次结构
  2. 探索apache2.conf文件
  3. 设置Apache全局配置
  4. 设置Apache虚拟主机文件
  5. 启用站点和模块

步骤1:Apache文件层次结构

Apache将其主要配置文件保存在/etc/apache2文件夹中。执行以下命令将列出该文件夹内的所有文件:

1
ls -f /etc/apache2

输出

1
envars sites-available . apache2.conf .. sites-enabled mods-available ports.conf magic mods-enabled conf-enabled conf-available

此目录中有一些纯文本文件和子目录。以下是一些需要熟悉的有用位置:

  • apache2.conf:这是服务器的主配置文件。几乎所有配置都可以在此文件中完成,但为了简单起见,建议使用单独的指定文件。此文件将配置默认值,并作为服务器读取配置细节的中心接入点。
  • ports.conf:此文件用于指定虚拟主机应监听的端口。如果您正在配置SSL,请务必检查此文件是否正确。有关详细的SSL设置说明,请参阅我们的指南:如何在Ubuntu上使用Let’s Encrypt保护Apache
  • sites-available/和sites-enabled/sites-available目录包含虚拟主机文件配置。此文件夹内的配置将确定哪些请求提供哪些内容。这是通过链接到sites-enabled目录来实现的,该目录存储已激活的虚拟主机配置文件。当Apache启动或重新加载时,它会读取sites-enabled目录内的配置文件和链接,以编译完整的配置。
  • conf-available/和conf-enabled/:这些目录存放与虚拟主机配置文件无关的配置片段。
  • mods-enabled/和mods-available/:这些目录定义可以可选加载的模块。目录包含两个组件:以.load结尾的文件(包含加载特定模块的片段)和以.conf结尾的文件(存储这些模块的配置)。

Apache配置不是在单个整体文件中进行的,而是通过模块化设计进行的,可以根据需要添加和修改新文件。

步骤2:探索apache2.conf文件

Apache服务器的主要配置细节保存在/etc/apache2/apache2.conf文件中。 此文件分为三个主要部分:

  1. 全局Apache服务器进程的配置
  2. 默认服务器的配置
  3. 虚拟主机的配置。

使用您首选的文本编辑器打开此文件。以下示例使用nano:

1
sudo nano /etc/apache2/apache2.conf

在Ubuntu和Debian中,此文件用于配置全局定义。默认服务器和虚拟主机的配置是通过使用Include指令来处理的。 Include指令允许Apache在语句出现的位置将其他配置文件读入当前文件。其结果是Apache在启动时动态生成一个总体的配置文件。 在此文件中可以找到许多不同的IncludeIncludeOptional语句。这些指令加载模块定义、ports.conf文档、conf-enabled/目录中的特定配置文件以及sites-enabled/目录中的虚拟主机定义:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
...
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
...
Include ports.conf
...
IncludeOptional conf-enabled/*.conf
...
IncludeOptional sites-enabled/*.conf
...

步骤3:设置Apache全局配置

您可能希望修改全局配置中的一些选项:

Timeout 默认情况下,此参数设置为300。这意味着服务器最多有300秒的时间来完成每个请求。 可以安全地将此参数降低到30到60秒之间。

KeepAlive 如果将此选项设置为On,将允许每个连接保持打开状态,以处理来自同一客户端的多个请求。 如果设置为Off,每个请求都必须建立新连接,根据您的设置和流量情况,这可能会导致显著的开销。

MaxKeepAliveRequests 这控制每个连接在处理多少个独立请求后终止。保持较高的数值将使Apache能够更有效地为每个客户端提供服务。 默认设置为100。将此值设置为0将允许Apache为每个连接提供无限数量的请求。

KeepAliveTimeout 此设置指定在完成上一个请求后等待下一个请求的时间。如果达到超时阈值,则连接将终止。 这意味着下次请求内容时,服务器将建立一个新的连接来处理构成客户端正在访问的页面内容的请求。默认设置为5。

检查此配置文件的内容后,可以按CTRL+X退出。

多处理模块(MPM) 多处理模块(MPM)扩展了Apache的模块化设计。MPM负责监听、定向和处理不同的网络请求。您可以使用以下命令交叉引用Apache安装的编译模块:

1
apache2ctl -L

输出

1
2
3
4
5
6
7
8
9
Compiled in modules:
  core.c
  mod_so.c
  mod_watchdog.c
  http_core.c
  mod_log_config.c
  mod_logio.c
  mod_version.c
  mod_unixd.c

您可以使用a2query -M命令检查服务器上的MPM类型:

1
a2query -M

输出

1
event

输出显示此服务器上使用了event MPM。您的安装可能有多个选择,但只能选择一个。

步骤4:更新Apache虚拟主机文件

默认的虚拟主机声明可以在sites-available/目录中名为000-default.conf的文件中找到。通过检查此文件,您可以了解虚拟主机文件的一般格式。 使用以下命令打开文件:

1
sudo nano /etc/apache2/sites-available/000-default.conf

/etc/apache2/sites-available/000-default.conf内容示例

1
2
3
4
5
6
7
8
9
<VirtualHost *:80>

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

默认虚拟主机配置为处理端口80(标准HTTP端口)上的任何请求。这在声明头中定义,其中写着*:80,表示任何接口上的端口80。 但是,这并不意味着它一定会处理服务器在此端口上的每个请求。Apache使用与请求匹配的最具体的虚拟主机定义。如果存在更具体的定义,它可以覆盖此定义。检查文件后,可以按CTRL+X退出。

Apache虚拟主机配置 以下选项在虚拟主机定义中设置,位于任何其他较低级别的子声明之外。它们适用于整个虚拟主机。 首先,打开conf-available/目录中的security.conf文件:

1
sudo nano /etc/apache2/conf-available/security.conf

此文件包含ServerSignature指令,该指令允许您指定在出现服务器问题时应使用的联系电子邮件。您可以将默认选项从On更改为EMail以显示服务器管理员电子邮件地址。确保您愿意在调整此设置后接收邮件:

1
2
3

ServerSignature EMail

CTRL+X退出文件。编辑配置文件后,将提示您确认更改。按Y保存对文件的更改,或按N放弃更改。 在虚拟主机文件中,您可以添加ServerName指令,该指令指定此请求应处理的域名或IP地址。此选项将增加虚拟主机的特异性,如果它与ServerName值匹配,则允许其覆盖默认定义。 运行以下命令打开虚拟主机文件,请务必将your_domain变量替换为您的实际域名:

1
sudo nano /etc/apache2/sites-available/your_domain.conf

your_domain附加到ServerName指令:

1
2
3

ServerName your_domain

同样,您也可以使用ServerAlias指令使虚拟主机应用于多个名称。这提供了访问相同内容的替代路径。一个很好的用例是添加相同的域名,前面加上www

1
2
3

ServerAlias www.your_domain.com

DocumentRoot指令指定此虚拟主机请求的内容将位于何处。在Ubuntu上,默认虚拟主机设置为从/var/www/目录提供内容:

1
2
3

DocumentRoot /var/www/your_domain/public_html

目录定义 在虚拟主机定义中,有针对服务器如何处理文件系统内不同目录的定义。Apache将按照从最短到最长的顺序应用所有这些指令,因此同样有机会覆盖先前的选项。 使用此命令打开apache2.conf文件:

1
sudo nano /etc/apache2/apache2.conf

/etc/apache2/apache2.conf目录定义示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

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

第一个目录定义应用于根目录/的规则。这将为您的虚拟主机提供基线配置,因为它适用于文件系统上提供的所有文件。请注意此文件中包含的目录配置选项以及一些有用的注释。此默认配置拒绝访问所有内容,除非在后续目录定义中另有规定。 Require指令可以限制或开放对服务器内不同资源的访问。AllowOverride指令用于决定是否允许.htaccess文件覆盖设置(如果它放置在内容目录中)。默认情况下不允许这样做,但在各种情况下启用它很有用。有关保护Apache服务器的更多信息,请参阅我们的初始服务器设置指南

Alias和ScriptAlias语句 目录定义有时前面有AliasScriptAlias指令。 使用此命令打开虚拟主机配置文件,并将your_domain变量替换为您的域名:

1
sudo nano /etc/apache2/sites-available/your_domain.conf

Alias指令将URL路径映射到目录路径。例如,在处理对your_domain请求的虚拟主机中,当导航到your_domain.com/content/时,以下内容将允许访问/usr/local/apache/content/内的内容:

1
Alias "/content/" "/usr/local/apache/content/"

ScriptAlias指令的工作方式相同,但用于定义将包含可执行组件的目录:

1
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"

请记住使用前面部分讨论的访问权限定义目录。完成对文件的编辑后,按CTRL+X退出文件。如果您对此文件进行了任何更改,请按Y保存对文件的更改,或按N将文件保留为更改配置之前的状态。

步骤5:启用站点和模块

一旦您拥有满足要求的虚拟主机文件,就可以使用Apache附带的工具将其转换为实时网站。 要在sites-enabled目录中创建指向sites-available目录中现有文件的符号链接,请发出以下命令。请务必将your_domain替换为您自己的虚拟主机站点配置文件的名称:

1
sudo a2ensite your_domain

启用站点后,发出以下命令告诉Apache重新加载其配置文件,使更改生效:

1
sudo systemctl restart apache2

还有一个用于禁用虚拟主机的配套命令。它通过从sites-enabled目录中移除符号链接来操作。例如,在您的虚拟主机站点启用的情况下,您可以禁用默认的000-default站点:

1
sudo a2dissite 000-default

模块可以通过分别使用a2enmoda2dismod命令来启用或禁用。它们的工作方式与这些命令的a2ensitea2dissite版本相同。例如,要启用info模块,可以使用以下命令:

1
sudo a2enmod info

同样,您可以使用a2dismod命令禁用模块:

1
sudo a2dismod info

请记住,在修改配置文件以及启用或禁用模块后,要重新启动Apache。

常见问题解答

1. 如何测试Apache配置的语法错误? 在重新启动Apache之前,您可以使用apache2ctl命令测试配置的语法错误:

1
sudo apache2ctl configtest

此命令将检查您的配置文件并报告任何语法错误。如果配置有效,您将看到Syntax OK。如果有错误,输出将指示哪个文件和行号包含问题。

2. 如何在同一个Apache服务器上设置多个虚拟主机? 您可以通过在/etc/apache2/sites-available/目录中为每个域名创建单独的配置文件来设置多个虚拟主机。每个虚拟主机文件应具有唯一的ServerName指令。创建每个配置文件后,使用a2ensite启用它并重新启动Apache:

1
2
3
sudo a2ensite example.com.conf
sudo a2ensite anotherdomain.com.conf
sudo systemctl restart apache2

Apache将根据请求中的域名提供正确的内容,使用最匹配的虚拟主机配置。

3. 哪些Apache模块对基本VPS托管至关重要? 对于基本Web托管,最常用的模块包括:

  • rewrite:启用URL重写和重定向(对许多Web应用程序至关重要)
  • ssl:为HTTPS提供SSL/TLS支持
  • headers:允许您修改HTTP请求和响应头
  • expires:使用Expires头控制浏览器缓存

您可以使用以下命令检查当前启用了哪些模块:

1
apache2ctl -M

要启用模块,请使用sudo a2enmod module_name,然后重新启动Apache。

4. 配置更改后Apache无法启动,如何排查? 如果Apache在更改配置后无法启动,请按照以下步骤操作:

  1. 检查配置语法:
    1
    
    sudo apache2ctl configtest
    
  2. 检查Apache错误日志以获取特定错误消息:
    1
    
    sudo tail -n 50 /var/log/apache2/error.log
    
  3. 检查systemd服务状态以获取详细的错误信息:
    1
    
    sudo systemctl status apache2
    
  4. 如果您最近启用了模块或站点,请尝试暂时禁用它:
    1
    2
    3
    
    sudo a2dismod problematic_module
    sudo a2dissite problematic_site
    sudo systemctl restart apache2
    

最常见的问题包括配置文件中的语法错误、端口冲突或缺少必需的模块。

5. 如何提高VPS上的Apache性能? 可以进行一些配置调整来提高Apache性能:

  • 调整MPM设置:如果使用事件MPM(Ubuntu/Debian上的默认设置),您可以在/etc/apache2/mods-available/mpm_event.conf中调整MaxRequestWorkersThreadsPerChildServerLimit
  • 启用压缩:启用deflate模块以压缩响应:
    1
    
    sudo a2enmod deflate
    
  • 优化KeepAlive设置:在apache2.conf中,根据您的流量模式调整KeepAliveMaxKeepAliveRequestsKeepAliveTimeout
  • 启用浏览器缓存:使用expires模块为静态内容设置适当的缓存头。
  • 禁用不必要的模块:移除未使用的模块以减少内存占用:
    1
    
    sudo a2dismod unused_module
    

在进行性能更改后,请务必测试并监控服务器的资源使用情况。

结论

Apache功能多样且非常模块化,因此配置需求将根据您的设置而有所不同。在回顾了上面的一些通用用例后,您应该对主要配置文件的用途以及它们如何相互作用有了很好的了解。如果您需要了解特定的配置选项,提供的文件有很好的注释,并且Apache提供了优秀的文档。现在配置文件应该不再那么令人生畏,您应该会感到更舒适地进行实验和修改它们以满足您的需求。

其他资源

要继续学习Apache和Web服务器管理,请探索以下相关的DigitalOcean教程:

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计