32.8. Apache HTTP 服务器¶
开源的 Apache HTTP 服务器是使用最广泛的 Web 服务器。FreeBSD 在默认情况下不安装这个 Web 服务器,但它可以通过软件包或 port www/apache24 安装。
本节介绍了如何在 FreeBSD 上配置和启动 Apache HTTP 服务器的 2. x 版本。有关 Apache 2.X 及其配置指令的更多详细信息,请参阅 httpd.apache.org。
32.8.1. 配置和启动 Apache¶
在 FreeBSD 中,Apache HTTP 服务器的主配置文件安装为 /usr/local/etc/apache2x/httpd.conf,其中 x 表示版本号。这个 ASCII 文本文件以 #
开始注释行。最常修改的指令是:
ServerRoot “/usr/local”
指定 Apache 安装的默认目录层次结构。二进制文件存储在服务器根目录的 bin 和 sbin 子目录中,配置文件存储在 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:
apache24_enable="YES"
如果 Apache 要以非默认选项启动,则可以将以下行添加到 /etc/rc.conf 以指定所需的参数:
apache24_flags=""
如果 apachectl 未报告配置错误,现在启动 httpd
:
# service apache24 start
httpd 服务可以通过在网页浏览器中输入 http://localhost
,用运行 httpd
的机器的完全限定域名替换 localhost
来测试。显示的默认网页是 /usr/local/www/apache24/data/index.html。
在 httpd
运行时,对 Apache 配置进行后续修改后,可以用以下命令测试 Apache 配置是否出错:
# service apache24 configtest
注意
需要注意的是,
configtest
不是 rc(8) 的标准,并且不应该期望它适用于所有启动脚本。
32.8.2. 虚拟主机¶
虚拟主机允许多个网站在一台 Apache 服务器上运行。虚拟主机可以 基于 IP,也可以 基于名称。基于 IP 的虚拟主机为每个网站使用不同的 IP 地址。基于名称的虚拟主机使用客户端 HTTP/1.1 标头来确定主机名,这允许网站共享相同的 IP 地址。
要设置 Apache 使用基于名字的虚拟主机,为每个网站添加一个 VirtualHost
块。例如,对于名为 www.domain.tld
的网站服务器,其虚拟域为 www.someotherdomain.tld
,在 httpd.conf 中添加以下条目:
<VirtualHost *>
ServerName www.domain.tld
DocumentRoot /www/domain.tld
</VirtualHost>
<VirtualHost *>
ServerName www.someotherdomain.tld
DocumentRoot /www/someotherdomain.tld
</VirtualHost>
对于每个虚拟主机,将 ServerName
和 DocumentRoot
的值替换为要使用的值。
有关设置虚拟主机的更多信息,请参阅官方 Apache 文档:http://httpd.apache.org/docs/vhosts/。
32.8.3. Apache 模块¶
Apache 使用模块来增强基本服务器提供的功能。有关可用模块的完整列表和配置详细信息,请参阅 http://httpd.apache.org/docs/current/mod/。
在 FreeBSD 中,一些模块可以使用 www/apache24 port 进行编译。在 /usr/ports/www/apache24 中键入内容,以查看哪些模块可用,哪些模块默认处于启用状态。如果模块不是用 ports 编译的,FreeBSD ports 提供了一种安装许多模块的简单方法。本节介绍三个最常用的模块。
32.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 时激活更改:
#Include etc/apache24/extra/httpd-ssl.conf
警告
SSL 版本 2 和版本 3 存在已知的漏洞问题。强烈建议启用 TLS 版本 1.2 和 1.3 以代替较旧的 SSL 选项。这可以通过在 ssl.conf 中设置以下选项来完成:
SSLProtocol all -SSLv3 -SSLv2 +TLSv1.2 +TLSv1.3
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
要在 Web 服务器中完成 SSL 的配置,请取消注释以下行,以确保在重新启动或重新加载期间将配置拉入 Apache:
# Secure (SSL/TLS) connections
Include etc/apache24/extra/httpd-ssl.conf
也必须在 httpd.conf 中取消以下行的注释,才能完全支持 Apache 中的 SSL:
LoadModule authn_socache_module libexec/apache24/mod_authn_socache.so
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
下一步是与证书颁发机构合作,以便在系统上安装相应的证书。这将为站点设置信任链,并防止出现任何自签名证书警告。
32.8.3.2. mod_perl¶
mod_perl 模块使得在 Perl 中编写 Apache 模块成为可能。此外,服务器中嵌入的持久性解释器避免了启动外部解释器的开销和 Perl 启动时间的损失。
可以使用软件包或 port www/mod_perl2 安装 mod_perl
。有关使用此模块的文档,请参见 http://perl.apache.org/docs/2.0/index.html。
32.8.3.3. mod_php¶
PHP:超文本预处理器(PHP)是一种通用的脚本语言,特别适合 Web 开发。它能够嵌入到 HTML 中,其语法借鉴了 C、Java™ 和 Perl,旨在允许 Web 开发人员快速编写动态生成的网页。
通过安装适当的 port,可以添加对 Apache 的 PHP 和使用该语言编写的任何其他特性的支持。
对于所有受支持的版本,请使用 pkg
命令搜索软件包数据库:
# pkg search php
将显示一个列表,包括它们提供的版本和其他功能。这些组件是完全模块化的,这意味着通过安装适当的 port 来启用功能。要安装适用于 Apache 的 PHP 版本 7.4,请执行以下命令:
# pkg install mod_php74
如果需要安装任何依赖包,它们也将被安装。
默认情况下,将不启用 PHP。需要将以下行添加到位于 /usr/local/etc/apache24 中的 Apache 配置文件中,以使其处于活动状态:
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
此外,配置文件中的 DirectoryIndex
配置文件也需要更新,Apache 需要重新启动或重新加载才能使更改生效。
也可以使用 pkg
安装对许多 PHP 功能的支持。例如,要安装对 XML 或 SSL 的支持,请安装其各自的 port:
# pkg install php74-xml php74-openssl
与上文一样,需要重新加载 Apache 配置才能使更改生效,即使它只是模块安装也是如此。
要执行正常重新启动以重新加载配置,请执行以下命令:
# apachectl graceful
安装完成后,有两种方法可以获取已安装的 PHP 支持模块和构建的环境信息。首先是安装完整的 PHP 二进制文件并运行命令以获取信息:
# pkg install php74
# php -i |less
有必要将输出传递给分页器,例如 more
或 less
为了更容易地控制输出量。
最后,要对 PHP 的全局配置进行任何更改,有一个记录良好的文件安装在 /usr/local/etc/php.ini 中。在安装时,此文件将不存在,因为有两个版本可供选择,一个是 php.ini-development,另一个是 php.ini-production。这些是帮助管理员进行部署的起点。
32.8.3.4. HTTP2 支持¶
默认情况下,在使用 pkg
安装 port 时,包括了对 HTTP2 协议的 Apache 支持。新版本的 HTTP 比以前的版本有许多改进,包括利用与网站的单个连接,减少 TCP 连接的整体往返。此外,数据包标头数据被压缩,默认情况下 HTTP2 需要加密。
当 Apache 配置为仅使用 HTTP2 时,Web 浏览器将需要安全、加密的 HTTPS 连接。当 Apache 配置为同时使用这两个版本时,如果在连接过程中出现任何问题,HTTP1.1 将被视为回退选项。
虽然此更改确实需要管理员进行更改,但它们是积极的,相当于为每个人提供更安全的互联网。仅当前未实现 SSL 和 TLS 的站点需要进行这些更改。
注意
更多操作此配置取决于前面的部分,包括 TLS 支持。建议在继续此配置之前遵循这些说明。
通过取消注释 /usr/local/etc/apache24/httpd.conf 中的行来启用 http2 模块,然后用 mpm_event 替换 mpm_prefork 模块,因为后者不支持 HTTP2,从而启动该过程。
LoadModule http2_module libexec/apache24/mod_http2.so
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
注意
有一个单独的 port mod_http2 可用。它的存在是为了提供比随 port apache24 捆绑安装的模块更快的安全性和错误修复。它不是 HTTP2 支持所必需的,但可用。安装后,应在 Apache 配置中使用 mod_h2.so 代替 mod_http2.so。
在 Apache 中实现 HTTP2 有两种方法;一种方法是针对系统上运行的所有站点和每个 VirtualHost 的全局方法。若要全局启用 HTTP2,请在 ServerName 指令下添加以下行:
Protocols h2 http/1.1
注意
要通过纯文本启用 HTTP2,请在 httpd.conf 中使用 h2h2chttp/1.1。
此处使用 h2c 将允许明文 HTTP2 数据在系统上传递,但不建议这样做。此外,如果系统需要,在此处使用 http/1.1 将允许回退到协议的 HTTP1.1 版本。
要为单个虚拟主机启用 HTTP2,请在 httpd.conf 或 httpd-ssl.conf 的 VirtualHost 指令中添加相同的行。
使用 apachectl
命令重新加载配置,并在访问其中一个托管页面后使用以下任一方法测试配置:
# grep "HTTP/2.0" /var/log/httpd-access.log
这将返回类似于以下内容的内容:
192.168.1.205 - - [18/Oct/2020:18:34:36 -0400] "GET / HTTP/2.0" 304 -
192.0.2.205 - - [18/Oct/2020:19:19:57 -0400] "GET / HTTP/2.0" 304 -
192.0.0.205 - - [18/Oct/2020:19:20:52 -0400] "GET / HTTP/2.0" 304 -
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:// 进行连接。
32.8.4. 动态网站¶
除了 mod_perl 和 mod_php 外,还有其他语言可用于创建动态 Web 内容。其中包括 Django 和 Ruby on Rails。
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,并指定项目目录的完整路径:
<Location "/">
SetHandler python-program
PythonPath "['/dir/to/the/django/packages/'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonAutoReload On
PythonDebug On
</Location>
有关如何使用 Django 的更多信息,请参阅 https://docs.djangoproject.com。
Ruby on Rails 是另一个开源的 Web 框架,它提供了一个完整的开发堆栈。它经过优化,使 Web 开发人员更有效率,并能够快速编写功能强大的应用程序。在 FreeBSD 上,它可以使用软件包或 port www/rubygem-rails 进行安装。
有关如何使用 Ruby on Rails 的更多信息,请参阅 http://guides.rubyonrails.org。