30.8.Apache HTTP 服务器

开源 Apache HTTP 服务器是使用最广泛的 Web 服务器。FreeBSD 在默认情况下不安装这个 Web 服务器,但它可以从 www/apache24 软件包或 port 安装。

本节介绍了如何在 FreeBSD 上配置和启动 Apache HTTP Server的 2. x 版本。有关 Apache 2.X 及其配置指令的更多详细信息,请参阅 httpd.apache.org

30.8.1. 配置和启动 Apache

在 FreeBSD 中,Apache HTTP Server 的主配置文件安装为 /usr/local/etc/apache2x/httpd.conf,其中 x 表示版本号。这个ASCII文本文件以 # 开始注释行。最常修改的指令是:

  • ServerRoot "/usr/local"

    指定 Apache 安装的默认目录层次结构。二进制文件存储在服务器根目录的 binsbin 子目录中,配置文件存储在 etc/apache2x 子目录中:

  • ServerAdmin you@example.com

    将其更改为电子邮件地址以接收服务器问题。此地址还显示在某些服务器生成的页面上,例如错误文档:

  • ServerName www.example.com:80

    允许管理员设置发送回客户端的服务器主机名。例如,可以使用 www 代替实际的主机名。如果系统没有注册 DNS 名称,请填写 IP 地址。如果服务器将侦听备用报告,请更改 80 为备用端口号:

  • DocumentRoot "/usr/local/www/apache2_x_/data"

    将从中提供文档的目录。默认情况下,所有请求都取自此目录,但符号链接和别名可用于指向其他位置。

在进行修改之前,对默认的 Apache 配置文件进行备份是一个好主意。当Apache的配置完成后,保存该文件并使用 apachectl 验证该配置。运行 apachectl configtest 应该返回 Syntax OK。

要在系统启动时启动 Apache,请将以下行添加到 /etc/rc.conf

  1. apache24_enable="YES"

如果 Apache 应使用非默认选项启动,则可以将以下行添加到 /etc/rc.conf 以指定所需的标志:

  1. apache24_flags=""

如果 apachectl 未报告配置错误,现在启动 httpd:

  1. # service apache24 start

httpd服务可以通过在网页浏览器中输入 http://localhost ,用运行 httpd 的机器的全称域名替换 localhost 来测试。显示的默认网页是 /usr/local/www/apache24/data/index.html

httpd 运行时,对 Apache 配置进行后续修改后,可以用以下命令测试 Apache 配置是否出错。

  1. # service apache24 configtest
注意
需要注意的是,configtest 不是 rc(8) 标准,并且不应该期望它适用于所有启动脚本。

30.8.2. 虚拟主机

虚拟主机允许多个网站在一台 Apache 服务器上运行。虚拟主机可以 基于IP,也可以 基于名称。基于 IP 的虚拟主机为每个网站使用不同的 IP 地址。基于名称的虚拟主机使用客户端 HTTP/1.1 标头来确定主机名,这允许网站共享相同的 IP 地址。

要设置 Apache 使用基于名字的虚拟主机,为每个网站添加一个 VirtualHost 块。例如,对于名为 www.domain.tld 的网站服务器,其虚拟域为 www.someotherdomain.tld ,在 httpd.conf 中添加以下条目。

  1. <VirtualHost *>
  2. ServerName www.domain.tld
  3. DocumentRoot /www/domain.tld
  4. </VirtualHost>
  5. <VirtualHost *>
  6. ServerName www.someotherdomain.tld
  7. DocumentRoot /www/someotherdomain.tld
  8. </VirtualHost>

对于每个虚拟主机,将 ServerNameDocumentRoot 的值替换为要使用的值。

有关设置虚拟主机的更多信息,请参阅官方 Apache 文档:http://httpd.apache.org/docs/vhosts/

30.8.3. Apache 模块

Apache 使用模块来增强基本服务器提供的功能。有关可用模块的完整列表和配置详细信息,请参阅 http://httpd.apache.org/docs/current/mod/

在 FreeBSD 中,一些模块可以使用 www/apache24 port 进行编译。在 /usr/ports/www/apache24 中键入内容,以查看哪些模块可用,哪些模块默认处于启用状态。如果模块不是用 Ports 编译的,FreeBSD Ports 集合提供了一种安装许多模块的简单方法。。本节介绍三个最常用的模块。

30.8.3.1. SSL 支持

在某个时间点,对 Apache 内部 SSL 的支持需要一个名为 mod_ssl 的辅助模块。现在情况已不再如此,Apache 的默认安装带有内置于 Web 服务器中的 SSL。有关如何启用对 SSL 网站支持的示例,请参阅已安装的文件 httpd-ssl.conf 中的 /usr/local/etc/apache24/extra 目录,在此目录中还有一个名为 ssl.conf-sample 的示例文件。建议对这两个文件进行评估,以便在 Apache Web 服务器中正确设置安全网站。

SSL 配置完成后,必须在主 http.conf 中取消注释以下行,以便在下次重新启动或重新加载 Apache 时激活更改:

  1. #Include etc/apache24/extra/httpd-ssl.conf
警告
SSL 版本 2 和版本 3 存在已知的漏洞问题。强烈建议启用 TLS 版本 1.2 和 1.3 以代替较旧的 SSL 选项。这可以通过在 ssl.conf 中设置以下选项来完成:
  1. SSLProtocol all -SSLv3 -SSLv2 +TLSv1.2 +TLSv1.3
  2. SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

要在 Web 服务器中完成 SSL 的配置,请取消注释以下行,以确保在重新启动或重新加载期间将配置拉入 Apache:

  1. # Secure (SSL/TLS) connections
  2. Include etc/apache24/extra/httpd-ssl.conf

以下行也必须在 httpd.conf 中取消注释,才能完全支持 Apache 中的 SSL:

  1. LoadModule authn_socache_module libexec/apache24/mod_authn_socache.so
  2. LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
  3. LoadModule ssl_module libexec/apache24/mod_ssl.so

下一步是与证书颁发机构合作,以便在系统上安装相应的证书。这将为站点设置信任链,并防止出现任何自签名证书警告。

30.8.3.2. mod_perl

mod_perl 模块使得在 Perl 中编写 Apache 模块成为可能。此外,服务器中嵌入的持久性解释器避免了启动外部解释器的开销和 Perl 启动时间的损失。

可以使用 www/mod_perl2 包或 port 安装 mod_perl。有关使用此模块的文档,请参见 http://perl.apache.org/docs/2.0/index.html

30.8.3.3. mod_php

PHP:超文本预处理器(PHP)是一种通用的脚本语言,特别适合 Web 开发。它能够嵌入到 HTML 中,其语法借鉴了 C,Java™ 和 Perl,旨在允许 Web 开发人员快速编写动态生成的网页。

通过安装适当的 port,可以添加对 Apache 的 PHP 和使用该语言编写的任何其他特性的支持。

对于所有受支持的版本,请使用 pkg 命令搜索软件包数据库:

  1. # pkg search php

将显示一个列表,包括它们提供的版本和其他功能。这些组件是完全模块化的,这意味着通过安装适当的 port 来启用功能。要安装适用于 Apache 的 PHP 版本 7.4,请发出以下命令:

  1. # pkg install mod_php74

如果需要安装任何依赖包,它们也将被安装。

默认情况下,PHP 将不启用。需要将以下行添加到位于 /usr/local/etc/apache24 中的 Apache 配置文件中,以使其处于活动状态:

  1. <FilesMatch "\.php$">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>
  4. <FilesMatch "\.phps$">
  5. SetHandler application/x-httpd-php-source
  6. </FilesMatch>

此外,配置文件中的 DirectoryIndex 配置文件也需要更新,Apache 需要重新启动或重新加载才能使更改生效。

也可以使用 pkg 安装对许多 PHP 功能的支持。例如,要安装对 XML 或 SSL 的支持,请安装其各自的 port:

  1. # pkg install php74-xml php74-openssl

与以前一样,需要重新加载 Apache 配置才能使更改生效,即使它只是模块安装也是如此。

要执行正常重新启动以重新加载配置,请发出以下命令:

  1. # apachectl graceful

安装完成后,有两种方法可以获取已安装的 PHP 支持模块和构建的环境信息。首先是安装完整的 PHP 二进制文件并运行命令以获取信息:

  1. # pkg install php74
  2. # php -i |less

有必要将输出传递给分页器,例如 moreless 为了更容易地消化输出量。

最后,要对 PHP 的全局配置进行任何更改,有一个记录良好的文件安装在 /usr/local/etc/php.ini 中。在安装时,此文件将不存在,因为有两个版本可供选择,一个是 php.ini-development,另一个是 php.ini-production。这些是帮助管理员进行部署的起点。

30.8.3.4. HTTP2 支持

默认情况下,在安装带有 pkg 的 port 时,包括对 HTTP2 协议的 Apache 支持。新版本的 HTTP 比以前的版本有许多改进,包括利用与网站的单个连接,减少 TCP 连接的整体往返。此外,数据包标头数据被压缩,默认情况下 HTTP2 需要加密。

当 Apache 配置为仅使用 HTTP2 时,Web 浏览器将需要安全、加密的 HTTPS 连接。当 Apache 配置为同时使用这两个版本时,如果在连接过程中出现任何问题,HTTP1.1 将被视为回退选项。

虽然此更改确实需要管理员进行更改,但它们是积极的,相当于为每个人提供更安全的 Internet。仅当前未实现 SSL 和 TLS 的站点需要进行这些更改。

注意
更多操作此配置取决于前面的部分,包括 TLS 支持。建议在继续此配置之前遵循这些说明。

通过取消注释 /usr/local/etc/apache24/httpd.conf 中的行来启用 http2 模块,然后用 mpm_event 替换 mpm_prefork 模块,因为前者不支持 HTTP2,从而启动该过程。

  1. LoadModule http2_module libexec/apache24/mod_http2.so
  2. LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
注意
有一个单独的 mod_http2 port 可用。它的存在是为了提供比随捆绑的 apache24 port 安装的模块更快的安全性和错误修复。它不是 HTTP2 支持所必需的,但可用。安装后,应在 Apache 配置中使用 mod_h2.so 代替 mod_http2.so

在 Apache 中实现 HTTP2 有两种方法;一种方法是针对系统上运行的所有站点和每个 VirtualHost 的全局方法。若要全局启用 HTTP2,请在 ServerName 指令下添加以下行:

  1. Protocols h2 http/1.1
注意
要通过纯文本启用 HTTP2,请在 httpd.conf 中使用 h2h2chttp/1.1。

在这里使用 h2c 将允许明文 HTTP2 数据在系统上传递,但不建议这样做。此外,如果系统需要,在此处使用 http/1.1 将允许回退到协议的 HTTP1.1 版本。

要为单个 VirtualHosts 启用 HTTP2,请在 httpd.confhttpd-ssl.conf 的 VirtualHost 指令中添加相同的行。

使用 apachectl 命令重新加载配置,并在访问其中一个托管页面后使用以下任一方法测试配置:

  1. # grep "HTTP/2.0" /var/log/httpd-access.log

这将返回类似于以下内容的内容:

  1. 192.168.1.205 - - [18/Oct/2020:18:34:36 -0400] "GET / HTTP/2.0" 304 -
  2. 192.0.2.205 - - [18/Oct/2020:19:19:57 -0400] "GET / HTTP/2.0" 304 -
  3. 192.0.0.205 - - [18/Oct/2020:19:20:52 -0400] "GET / HTTP/2.0" 304 -
  4. 192.0.2.205 - - [18/Oct/2020:19:23:10 -0400] "GET / HTTP/2.0" 304 -

另一种方法是使用 Web 浏览器的内置站点调试器或 tcpdump;但是,使用任一方法都超出了本文档的讨论范围。

通过使用 mod_proxy_http2.so 模块支持 HTTP2 反向代理连接。配置 ProxyPass 或 RewriteRules [P] 语句时,它们应使用 h2:// 进行连接。

30.8.4. 动态网站

除了 mod_perl 和 mod_php 外,还有其他语言可用于创建动态 Web 内容。其中包括 Django 和 Ruby on Rails。

30.8.4.1. Django

Django是一个BSD许可的框架,旨在允许开发人员快速编写高性能,优雅的 Web 应用程序。它提供了一个对象关系映射器,以便将数据类型开发为 Python 对象。为这些对象提供了丰富的动态数据库访问 API,开发人员无需编写 SQL。它还提供了一个可扩展的模板系统,以便将应用程序的逻辑与 HTML 表示形式分开。

Django 依赖于 mod_python 和 SQL 数据库引擎。在 FreeBSD 中,www/py-django port 会自动安装 mod_python 并支持 PostgreSQL、MySQL 或 SQLite 数据库,默认值为 SQLite。要更改数据库引擎,请在 /usr/ports/www/py-django 中键入 make config 内容,然后安装 port。

安装 Django 后,应用程序将需要一个项目目录以及 Apache 配置才能使用嵌入式 Python 解释器。此解释器用于为站点上的特定 URL 调用应用程序。

若要将 Apache 配置为将某些 URL 的请求传递到 Web 应用程序,请将以下内容添加到 httpd.conf,并指定项目目录的完整路径:

  1. <Location "/">
  2. SetHandler python-program
  3. PythonPath "['/dir/to/the/django/packages/'] + sys.path"
  4. PythonHandler django.core.handlers.modpython
  5. SetEnv DJANGO_SETTINGS_MODULE mysite.settings
  6. PythonAutoReload On
  7. PythonDebug On
  8. </Location>

有关如何使用 Django 的更多信息,请参阅 https://docs.djangoproject.com

30.8.4.2. Ruby on Rails

Ruby on Rails 是另一个开源 Web 框架,它提供了一个完整的开发堆栈。它经过优化,使 Web 开发人员更有效率,并能够快速编写功能强大的应用程序。在 FreeBSD 上,它可以使用 www/rubygem-rails 软件包或 port 进行安装。

有关如何使用 Ruby on Rails 的更多信息,请参阅 http://guides.rubyonrails.org