Product SiteDocumentation Site

11.2. Web 服务器(HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Bookworm at version 2.4.59.

11.2.1. 安装 Apache

所有需要的只是安装 apache2 软件包。它包含所有的模块,包括 Multi-Processing Modules (MPMs) ,它影响 Apache 如何处理很多请求的并行处理,以前这在另外的 apache2-mpm-* 软件包中提供。它还拉取 apache2-utils,其中包含的命令行应用将在后面讨论。
使用 MPM 显著地影响 Apache 处理并发请求的方式。通过 worker MPM,它使用 threads(线程)(轻量进程),而通过 prefork MPM,它使用预先创建的进程池。通过 event(事件) MPM,它也使用线程,但非活动连接(显著地由 HTTP keep-alive 特性保持打开的那些)交回给专用的管理线程。
The Falcot administrators also install libapache2-mod-php so as to include the PHP 8.2 support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php-fpm.
Apache 是模块化的服务器,而它的很多特性由主程序在初始化时装载的外部模块来实施。默认配置只启用最常用的模块,但启用新的模块不过是运行 a2enmod module的简单事情;要禁止模块,命令是a2dismod module。这些程序实际上只创建(或删除)/etc/apache2/mods-enabled/中的符号链接,它们指向真实文件(存储在 /etc/apache2/mods-available/中)。
通过其默认设置,web 服务器监听端口 80 (如在 /etc/apache2/ports.conf 中所配置的),并且为来自 /var/www/html/ 目录的页面提供服务(如在 /etc/apache2/sites-enabled/000-default.conf中所配置的)。

11.2.2. 为 SSL 添加支持

Apache 2.4 包括用于保护开箱即用的 HTTP(HTTPS)所需的 SSL 模块(mod_ssl)。它只需要用 a2enmod ssl 来启用,然后所需的指令必须添加到配置文件中。配置示例提供在 /etc/apache2/sites-available/default-ssl.conf 中。
如果想要生成受信任的证书,可以按照 第 10.2.1 节 “创建免费的受信任证书” 这一节,然后调整后面的变量:
SSLCertificateFile      /etc/letsencrypt/live/DOMAIN/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMAIN/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromise of the server's secret key does not result in the compromise of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command. Unfortunately the version packaged for Debian had serious issues and even security implications and is therefor not part of Debian Stable since the Bullseye release.

11.2.3. 配置虚拟主机

虚拟主机是 web 服务器额外的身份。
Apache 考虑两个不同种类的虚拟主机:基于 IP 地址(或端口)的那些,和依赖于 web 服务器域名的那些。第一种方法需要为每个网站分配不同的 IP 地址(或端口),而第二种可以工作在单一 IP 地址(或端口)上,并且网站由 HTTP 客户端发送的主机名来区分(只工作在 HTTP 协议的 1.1 版本下——幸运的是版本足够老,所有的客户端都已经使用了)。
IPv4 地址(增加的)稀缺性通常偏爱第二种方法;然而虚拟主机也需要提供 HTTPS 的话会变得更复杂,因为 SSL 协议不总是为基于名称的虚拟主机而提供;允许这样组合的 SNI 扩展(Server Name Indication(服务器名称指示))并不被所有浏览器处理。当几个 HTTPS 网站需要在相同的服务器上运行时,它们通常或者由在不同的端口上,或者在不同的 IP 地址上运行来区分(IPv6 在这里会有帮助)。
Apache 2 的默认配置启用基于名称的虚拟主机。此外,默认虚拟主机在 /etc/apache2/sites-enabled/000-default.conf 文件中定义;如果没有发现与客户端发送的请求相匹配的主机的话,这个虚拟主机将被使用。
每一个额外的虚拟主机都由 /etc/apache2/sites-available/ 中存储的文件来描述。这样,为 falcot.org 域设置网站就是创建后面的文件,然后通过 a2ensite www.falcot.org 启用虚拟主机这样简单的事情。

例 11.13. /etc/apache2/sites-available/www.falcot.org.conf 文件

<VirtualHost *:80>
ServerName   www.falcot.org
ServerAlias  falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
迄今为止配置的 Apache 服务器对所有虚拟主机使用了相同的日志文件(尽管可以通过在虚拟主机的定义中添加 CustomLog 指令来更改)。这样,很好理解去定制这个日志文件的格式来使它包含虚拟主机的名称。这可以通过创建为所有日志文件定义了新格式的 /etc/apache2/conf-available/customlog.conf 文件来进行,并通过 a2enconf customlog 来启用。还必须从 /etc/apache2/sites-available/000-default.conf 文件中删除(或注释掉) CustomLog 行。

例 11.14. /etc/apache2/conf-available/customlog.conf 文件

# New log format including (virtual) host name
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Now let's use this "vhost" format by default
CustomLog /var/log/apache2/access.log vhost

11.2.4. 常用指令

这一节简要地回顾了一些通常使用的 Apache 配置指令。
主要配置文件通常包括几个 Directory(目录) 块;它们允许为依赖于所服务的文件的位置的服务器指定不同行为。这样的块通常包括 OptionsAllowOverride 指令。

例 11.15. 目录块

<Directory /srv/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
DirectoryIndex 指令包含当客户端请求匹配目录时尝试的文件列表。列表中存在的第一个文件被使用,并作为响应来发送。
Options 指令后面是被启用的选项列表。None 值禁止了所有的选项;相应地,All 全部启用它们,除了MultiViews。可用选项包括:
  • ExecCGI 指示可以执行 CGI 脚本。
  • FollowSymlinks 告诉服务器可以跟随符号链接,并且响应应该包含这个链接目标的内容。
  • SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and its target have the same owner.
  • Includes 启用 Server Side Includes(服务器一侧包含)(缩写为 SSI)。这些指令嵌入 HTML 页面中,并对每个请求动态执行。
  • IncludesNOEXEC 允许 Server Side Includes(服务器一侧执行)(缩写为 SSI),但禁止 exec 命令并对文本/标记文件限制 include 指令。
  • Indexes 告诉服务器如果由客户端发送的 HTTP 请求指向没有索引文件的目录(也就是DirectoryIndex 指令提到的文件不存在于这个目录中时),那么列出目录的内容。
  • MultiViews 启用了内容协商;这可以被服务器使用,来返回与浏览器中配置的所需语言相匹配的 web 页面。
AllowOverride 指令列出可以由 .htaccess 文件的方式启用或禁止的所有选项。这个选项通常用于限制 ExecCGI,从而管理员选择哪些用户在 web 服务器身份(www-data 用户)下允许运行程序。

11.2.4.1. 需要身份认证

In some circumstances, access to part of a website needs to be restricted, so only legitimate users who provide a username and a password are granted access to the contents. These feature are provided by the mod_auth* modules.

例 11.16. .htaccess 文件需要授权

Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
/etc/apache2/authfiles/htpasswd-private 文件包含用户和密码的列表;它通常由 htpasswd 命令来操作。例如后面的命令用于添加用户或更改他们的密码:
# htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user

11.2.4.2. 限制访问

Require 指令控制对目录(递归地,及其子目录)的访问限制。
它可以基于很多标准用来限制访问;我们会停在描述根据客户端的 IP 地址来限制访问上,但它的功能比这个更强大,特别是在 RequireAll 块中组合几个 Require 指令的时候。

例 11.17. 只允许来自本地网络

需要 ip 192.168.0.0/16

11.2.5. 日志分析程序

日志分析程序频繁地安装在 web 服务器上;因为前者为管理员提供了后者使用方式的精确概念。
Falcot 公司的管理员选择 AWStatsAdvanced Web Statistics)来分析他们的 Apache 日志文件。
第一个配置步骤是定制 /etc/awstats/awstats.conf 文件。Falcot 公司的管理员只更改后面的参数,而保持其它不变:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
所有这些参数由模板文件中的注释来存档。特别是,LogFileLogFormat 参数描述了日志文件以及其包含的信息;SiteDomainHostAliases 列出了获知主网站的各个名称。
对于高流量网站,DNSLookup 通常应该不设置为 1;对于较小的网站,如上面描述的 Falcot 公司的网站,这个设置允许得到可读性更好的报告,它除了包括原始 IP 地址,还包括全部的机器名称。
AWStats 还启用其它虚拟主机;每台虚拟主机需要自己的配置文件,如/etc/awstats/awstats.www.falcot.org.conf

例 11.18. 用于虚拟主机的 AWStats 配置文件

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats uses many icons stored in the /usr/share/awstats/icon/ directory. In order for these icons to be available on the web site, the Apache configuration needs to be adapted to include the following directive (check out /usr/share/doc/awstats/examples/apache.conf for a more detailed example):
Alias /awstats-icon/ /usr/share/awstats/icon/
After a few minutes (and once the script has been run a few times), the results are available online: