跳至内容

Apache Web 服务器多站点设置

您需要什么

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

    提示

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

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

简介

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

历史事实:此服务器设置似乎起源于基于 Debian 的系统,但它完全可以适应任何运行 Apache 的 Linux 操作系统。

对于那些寻找类似的 Nginx 设置的人,查看本指南

安装 Apache

您可能需要网站的其他软件包,例如 PHP、数据库或其他软件包。与 *http* 一起安装 PHP 将为您从 Rocky Linux 仓库中获取最新版本。

请记住,您可能需要模块,例如 *php-bcmath* 或 *php-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。

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

您首先需要在 *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/

配置 *https* 使用 SSL/TLS 证书

如前所述,现在创建的每个 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}`

如果您不熟悉用于创建目录的“树”语法,则上述内容表示

“创建一个名为“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 安全”,更广为人知的 SSL/TLS 或 https)。我们的端口 80 配置部分将非常简短

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

这表示将任何常规 Web 请求发送到 https 配置而不是端口 80。显示的 Apache“重定向”选项是临时的。当测试完成并且您可以看到站点按预期运行时,您可以将其更改为“永久重定向”。

永久重定向将教会搜索引擎,很快任何来自搜索引擎的网站流量都将只转到端口 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>
<Virtual Host *: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>

因此,进一步分解此配置,在配置文件的正常部分之后,一直到 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