跳至内容

Apache Web 服务器多站点设置

您需要什么

  • 运行 Rocky Linux 的服务器
  • 了解命令行和文本编辑器。本示例使用 vi,但您可以随意使用您喜欢的编辑器。

    技巧

    如果您想了解 vi 文本编辑器,这里有一个方便的教程

  • 安装和运行 Web 服务的基本知识

简介

Rocky Linux 有多种方法可以设置网站。这只是一种方法,是在单台服务器上使用 Apache。此方法的设计适用于在一台硬件上运行多个服务器,但它也可以作为单站点服务器的基础配置。

历史事实:这种服务器设置似乎始于基于 Debian 的系统,但它完全适用于运行 Apache 的任何 Linux 操作系统。

对于那些正在为 Nginx 寻找类似设置的人,请查看此指南

安装 Apache

您很可能还需要其他软件包来托管您的网站,例如 PHP、数据库或其他软件包。与 http 一起安装 PHP 将使您从 Rocky Linux 存储库中获得最新版本。

请记住,您可能需要模块,例如 php-bcmathphp-mysqlind。您的 Web 应用程序规范将决定您需要什么。您可以根据需要安装它们。目前,您将安装 http 和 PHP,因为它们几乎是必然的。

从命令行运行

dnf install httpd php

添加额外目录

此方法使用几个额外的目录,这些目录目前在系统中不存在。您需要在 /etc/httpd/ 中添加两个目录,分别称为 "sites-available" 和 "sites-enabled"。

从命令行输入

mkdir -p /etc/httpd/sites-available /etc/httpd/sites-enabled

这将创建所需的目录。

您还需要一个目录来存放我们的站点。它可以放在任何地方,但一个很好的组织方式是创建一个 "sub-domains" 目录。将其放在 /var/www 中:mkdir /var/www/sub-domains/ 以降低复杂性。

配置

您还需要在 httpd.conf 文件的底部添加一行。为此,请输入

vi /etc/httpd/conf/httpd.conf

并转到文件底部添加

Include /etc/httpd/sites-enabled

我们实际的配置文件将位于 /etc/httpd/sites-available 中,您将创建符号链接到 /etc/httpd/sites-enabled 中。

为什么要这样做?

假设您有 10 个网站都运行在同一台服务器上,使用不同的 IP 地址。假设站点 B 进行了一些重大更新,并且您需要更改该站点的配置。还假设更改出了问题,当您重新启动 httpd 以读取更改时,httpd 无法启动。您不仅无法启动您正在工作的站点,其他站点也无法启动。使用此方法,您可以删除导致问题的站点的符号链接,然后重新启动 httpd。它将恢复正常工作,然后您可以修复损坏的站点配置。

知道电话不会响起,客户或老板不会因为服务离线而抱怨,这会减轻压力。

站点配置

此方法的另一个好处是,它允许我们在默认 httpd.conf 文件之外完全指定所有内容。默认 httpd.conf 文件加载默认设置,而您的站点配置处理所有其他事项。太棒了,对吧?另外,它也使得排查损坏的站点配置更加简单。

假设您有一个加载维基百科的网站。您将需要一个配置文件,使该站点在端口 80 上可用。

如果您想使用 SSL/TLS 来托管网站(而且,在大多数情况下,您确实需要这样做),您需要在该文件中再添加一个部分来启用端口 443。

您可以在下面的“使用 SSL/TLS 证书配置 https”部分中查看。

您首先需要在 sites-available 中创建此配置文件

vi /etc/httpd/sites-available/com.wiki.www

配置文件内容看起来将是这样的

<VirtualHost *:80>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        DocumentRoot /var/www/sub-domains/your-server-hostname/html
        DirectoryIndex index.php index.htm index.html
        Alias /icons/ /var/www/icons/
        # ScriptAlias /cgi-bin/ /var/www/sub-domains/your-server-hostname/cgi-bin/

    CustomLog "/var/log/httpd/your-server-hostname-access_log" combined
    ErrorLog  "/var/log/httpd/your-server-hostname-error_log"

        <Directory /var/www/sub-domains/your-server-hostname/html>
                Options -ExecCGI -Indexes
                AllowOverride None

                Order deny,allow
                Deny from all
                Allow from all

                Satisfy all
        </Directory>
</VirtualHost>

创建后,您需要使用 Shift+:+W+Q (保存)来保存它。

在示例中,加载维基百科站点发生在 your-server-hostname 的 "html" 子目录中,这意味着您在 /var/www 中创建的路径(上面)将需要一些额外的目录来满足此要求。

mkdir -p /var/www/sub-domains/your-server-hostname/html

这将使用一个命令创建整个路径。接下来,您想将文件安装到此目录中,这些文件将实际运行网站。这可能是您自己制作的,也可能是您下载的可安装 Web 应用程序(在这种情况下是维基百科)。

将文件复制到您创建的路径

cp -Rf wiki_source/* /var/www/sub-domains/your-server-hostname/html/

使用 SSL/TLS 证书配置 https

如前所述,如今创建的每个 Web 服务器都应该运行 SSL/TLS(安全套接字层)。

此过程从生成私钥和 CSR(证书签名请求)开始,并将 CSR 提交给证书颁发机构以购买 SSL/TLS 证书。生成这些密钥的过程相当广泛。

如果您不熟悉 SSL/TLS 密钥生成,请参阅:生成 SSL 密钥

您也可以使用此替代过程,使用来自 Let's Encrypt 的 SSL 证书

SSL/TLS 密钥和证书的存放位置

由于您已经有了密钥和证书文件,您需要将它们逻辑地存放在 Web 服务器的文件系统中。正如您在示例配置文件中看到的,您将 Web 文件存放在 /var/www/sub-domains/your-server-hostname/html 中。

您需要将证书和密钥文件与域名放在一起,但要放在文档根目录之外,在本例中是 html 文件夹。

您永远不想冒险将证书和密钥暴露给 Web。那将是糟糕的!

相反,您将为我们的 SSL/TLS 文件创建一个目录结构,该结构位于文档根目录之外。

mkdir -p /var/www/sub-domains/your-server-hostname/ssl/{ssl.key,ssl.crt,ssl.csr}`

如果您不熟悉创建目录的 "tree" 语法,上面的意思是

"创建一个名为 "ssl" 的目录,并在其中创建三个名为 ssl.key、ssl.crt 和 ssl.csr 的子目录。"

提前说明:将证书签名请求 (CSR) 文件存储在树状结构中并非必需,但它简化了一些事情。如果您将来需要从不同的提供商重新颁发证书,保留 CSR 的副本是个好主意。问题是,您可以将它存储在哪里以便记住,并将其存储在您网站的树状结构中是合乎逻辑的。

假设您已将密钥、csr 和 crt(证书)文件名命名为您的站点名称,并且它们存储在 /root 中,您将把它们复制到相应的位置。

cp /root/com.wiki.www.key /var/www/sub-domains/your-server-hostname/ssl/ssl.key/
cp /root/com.wiki.www.csr /var/www/sub-domains/your-server-hostname/ssl/ssl.csr/
cp /root/com.wiki.www.crt /var/www/sub-domains/your-server-hostname/ssl/ssl.crt/

站点配置 - https

一旦您生成了密钥并购买了 SSL/TLS 证书,您就可以继续使用您的密钥进行网站配置了。

首先,分解配置文件的开头。例如,即使您仍然希望在端口 80(标准 http 端口)上侦听传入请求,您也不希望任何这些请求实际到达端口 80。

您希望它们转到端口 443(或 "http secure",更广为人知的名称是 SSL/TLS 或 https)。我们的端口 80 配置部分将非常简洁。

<VirtualHost *:80>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        Redirect / https://your-server-hostname/
</VirtualHost>

这表示将任何常规 Web 请求重定向到 https 配置。所示的 Apache "Redirect" 选项是暂时的。当测试完成后,并且您看到站点按预期运行,您可以将其更改为 "Redirect permanent"。

永久重定向将告知搜索引擎,并且很快,来自搜索引擎的任何流量到您的站点都将仅转到端口 443(https),而不会先经过端口 80(http)。

接下来,您需要在配置文件中定义 https 部分。

信息

从 Apache 2.4.8 开始,SSLCertificateChainFile 指令已弃用。SSLCertificateFile 指令的扩展名包括了提供商的 CA 证书。

<VirtualHost *:80>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        Redirect / https://your-server-hostname/
</VirtualHost>
<VirtualHost *:443>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        DocumentRoot /var/www/sub-domains/your-server-hostname/html
        DirectoryIndex index.php index.htm index.html
        Alias /icons/ /var/www/icons/
        # ScriptAlias /cgi-bin/ /var/www/sub-domains/your-server-hostname/cgi-bin/

    CustomLog "/var/log/`http`d/your-server-hostname-access_log" combined
    ErrorLog  "/var/log/`http`d/your-server-hostname-error_log"

        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1
        SSLHonorCipherOrder on
        SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384
:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS

        SSLCertificateFile /var/www/sub-domains/your-server-hostname/ssl/ssl.crt/com.wiki.www.crt
        SSLCertificateKeyFile /var/www/sub-domains/your-server-hostname/ssl/ssl.key/com.wiki.www.key

        <Directory /var/www/sub-domains/your-server-hostname/html>
                Options -ExecCGI -Indexes
                AllowOverride None

                Order deny,allow
                Deny from all
                Allow from all

                Satisfy all
        </Directory>
</VirtualHost>

关于密码套件的说明

本文档最初是为 Rocky Linux 8 编写的。从那时起,已经发生了巨大的变化。例如,您可能希望完全省略 SSLHonorCipherOrder onSSLCipherSuite 行,让服务器的默认配置来处理。如果您维护一个更新的服务器(换句话说,您定期运行 dnf upgrade),那么这应该可以处理密码套件的安全性和更新,而无需单独的配置操作。这样,您将避免在配置中使用已弃用或不安全的密码套件。如果您因为某些原因需要在配置中操作这些,请仔细研究您的条目。

因此,进一步分解此配置,在正常配置部分下方,一直到 SSL/TLS 部分。

  • SSLEngine on - 表示使用 SSL/TLS
  • SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - 表示使用所有可用的协议,除了那些有漏洞的协议。您应该定期研究当前可接受使用的协议。
  • SSLHonorCipherOrder on - 这处理了下一行关于密码套件的内容,并表示按显示的顺序处理它们。这也是一个需要定期审查密码套件的领域。
  • SSLCertificateFile - 正如其名称所示:新购买并应用的证书文件及其位置,包括提供商的证书颁发机构 (CA) 文件。
  • SSLCertificateKeyFile - 在创建证书签名请求时生成的密钥。

将所有内容上线,如果启动 Web 服务时没有错误,并且访问您的网站显示 https 而没有错误,那么您就可以开始了。

上线

请记住,我们的 httpd.conf 文件在文件末尾包含了 /etc/httpd/sites-enabled。当 httpd 重启时,它将加载 sites-enabled 目录中的任何配置文件。问题是,我们所有的配置文件都在 sites-available 中。

这是有意为之,以便您可以在 httpd 无法重启时删除相关内容。要启用我们的配置文件,您需要创建一个指向该文件在 sites-enabled 中的符号链接,并启动或重启 Web 服务。为此,您可以使用此命令。

ln -s /etc/httpd/sites-available/your-server-hostname /etc/httpd/sites-enabled/

这将创建指向 sites-enabled 中配置文件的链接。

现在,只需使用 systemctl start httpd 启动 httpd。或者,如果它已经在运行,则重启它:systemctl restart httpd,假设 Web 服务重新启动,您现在可以开始对您的站点进行一些测试了。

作者:Steven Spencer

贡献者:Ezequiel Bruni, Ganna Zhyrnova