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**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session apache24_enable="YES" 如果 Apache 要以非默认选项启动,则可以将以下行添加到 **/etc/rc.conf** 以指定所需的参数: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session apache24_flags="" 如果 apachectl 未报告配置错误,现在启动 ``httpd``: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service apache24 start httpd 服务可以通过在网页浏览器中输入 ``http://localhost``\ ,用运行 ``httpd`` 的机器的完全限定域名替换 ``localhost`` 来测试。显示的默认网页是 **/usr/local/www/apache24/data/index.html**\ 。 在 ``httpd`` 运行时,对 Apache 配置进行后续修改后,可以用以下命令测试 Apache 配置是否出错: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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** 中添加以下条目: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ServerName www.domain.tld DocumentRoot /www/domain.tld ServerName www.someotherdomain.tld DocumentRoot /www/someotherdomain.tld 对于每个虚拟主机,将 ``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 时激活更改: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session #Include etc/apache24/extra/httpd-ssl.conf .. **警告** SSL 版本 2 和版本 3 存在已知的漏洞问题。强烈建议启用 TLS 版本 1.2 和 1.3 以代替较旧的 SSL 选项。这可以通过在 **ssl.conf** 中设置以下选项来完成: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session SSLProtocol all -SSLv3 -SSLv2 +TLSv1.2 +TLSv1.3 SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 要在 Web 服务器中完成 SSL 的配置,请取消注释以下行,以确保在重新启动或重新加载期间将配置拉入 Apache: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # Secure (SSL/TLS) connections Include etc/apache24/extra/httpd-ssl.conf 也必须在 **httpd.conf** 中取消以下行的注释,才能完全支持 Apache 中的 SSL: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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`` 命令搜索软件包数据库: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # pkg search php 将显示一个列表,包括它们提供的版本和其他功能。这些组件是完全模块化的,这意味着通过安装适当的 port 来启用功能。要安装适用于 Apache 的 PHP 版本 7.4,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # pkg install mod_php74 如果需要安装任何依赖包,它们也将被安装。 默认情况下,将不启用 PHP。需要将以下行添加到位于 **/usr/local/etc/apache24** 中的 Apache 配置文件中,以使其处于活动状态: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session SetHandler application/x-httpd-php SetHandler application/x-httpd-php-source 此外,配置文件中的 ``DirectoryIndex`` 配置文件也需要更新,Apache 需要重新启动或重新加载才能使更改生效。 也可以使用 ``pkg`` 安装对许多 PHP 功能的支持。例如,要安装对 XML 或 SSL 的支持,请安装其各自的 port: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # pkg install php74-xml php74-openssl 与上文一样,需要重新加载 Apache 配置才能使更改生效,即使它只是模块安装也是如此。 要执行正常重新启动以重新加载配置,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # apachectl graceful 安装完成后,有两种方法可以获取已安装的 PHP 支持模块和构建的环境信息。首先是安装完整的 PHP 二进制文件并运行命令以获取信息: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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,从而启动该过程。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 指令下添加以下行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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`` 命令重新加载配置,并在访问其中一个托管页面后使用以下任一方法测试配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # grep "HTTP/2.0" /var/log/httpd-access.log 这将返回类似于以下内容的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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。 32.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**\ ,并指定项目目录的完整路径: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 有关如何使用 Django 的更多信息,请参阅 https://docs.djangoproject.com\ 。 32.8.4.2. Ruby on Rails ~~~~~~~~~~~~~~~~~~~~~~~ Ruby on Rails 是另一个开源的 Web 框架,它提供了一个完整的开发堆栈。它经过优化,使 Web 开发人员更有效率,并能够快速编写功能强大的应用程序。在 FreeBSD 上,它可以使用软件包或 port `www/rubygem-rails `__ 进行安装。 有关如何使用 Ruby on Rails 的更多信息,请参阅 http://guides.rubyonrails.org\ 。