如何在一台 Ubuntu 20.04 服务器上将 Nginx 配置为 Web 服务器和反向代理

作者选择了电子前沿基金会作为Write for DOnations计划的一部分接受捐赠

介绍

Apache 和 Nginx 是两种流行的开源 Web 服务器,通常与 PHP 一起使用。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个 Web 服务器的一般解决方案是使用多个 IP 地址或不同的端口号。

可以将同时具有 IPv4 和 IPv6 地址的服务器配置为在一种协议上为 Apache 站点提供服务,在另一种协议上为 Nginx 站点提供服务,但这目前并不实用,因为 ISP 对 IPv6 的采用仍然不普遍。拥有像一个不同的端口号818080第二web服务器是另一种解决方案,但与端口号分享的网址(例如)并不总是合理的或理想的。http://your_domain:81

在本教程中,您将 Nginx 配置为 Web 服务器和 Apache 的反向代理——所有这些都在单个服务器上。

根据 Web 应用程序,可能需要更改代码以保持 Apache 反向代理感知,尤其是在配置 SSL 站点时。为了避免这种情况,您将安装一个名为 Apache 的模块mod_rpaf,它会重写某些环境变量,因此 Apache 似乎是直接处理来自 Web 客户端的请求。

我们将在一台服务器上托管四个域名。Nginx 将提供两个服务:(默认虚拟主机)和. 剩下的两个将由 Apache 提供服务。我们还将配置 Apache 以使用 PHP-FPM 为 PHP 应用程序提供服务,这提供了比.nginx1.your_domainnginx2.your_domainapache1.your_domainapache2.your_domainmod_php

先决条件

要完成本教程,您需要具备以下条件:

第 1 步 – 安装 Apache 和 PHP-FPM

让我们从安装 Apache 和 PHP-FPM 开始。

除了 Apache 和 PHP-FPM,我们还将安装 PHP FastCGI Apache 模块libapache2-mod-fastcgi,以支持 FastCGI Web 应用程序。

首先,更新您的软件包列表以确保您拥有最新的软件包。

  • sudo apt update

接下来,安装 Apache 和 PHP-FPM 包:

  • sudo apt install apache2 php-fpm

FastCGI Apache 模块在 Ubuntu 的存储库中不可用,所以从kernel.org下载它并使用dpkg命令安装它

  • wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  • sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

接下来,让我们更改 Apache 的默认配置以使用 PHP-FPM。

第 2 步 – 配置 Apache 和 PHP-FPM

在这一步中,我们将8080使用mod_fastcgi模块将 Apache 的端口号更改为并配置它以与 PHP-FPM 一起使用重命名Apache的ports.conf配置文件:

  • sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

创建一个ports.conf端口设置为的新文件8080

  • echo "Listen 8080" | sudo tee /etc/apache2/ports.conf

注意: Web 服务器通常127.0.0.1:8080在配置反向代理时设置为侦听,但这样做会将 PHP 的环境变量SERVER_ADDR的值设置为环回 IP 地址而不是服务器的公共 IP。我们的目标是设置 Apache,使其网站不会在其前面看到反向代理。因此,我们将其配置为侦听8080所有 IP 地址。

接下来,我们将为 Apache 创建一个虚拟主机文件。<VirtualHost>此文件中指令将设置为仅在端口上为站点提供服务8080

禁用默认虚拟主机:

  • sudo a2dissite 000-default

然后使用现有的默认站点创建一个新的虚拟主机文件:

  • sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

现在打开新的配置文件:

  • sudo nano /etc/apache2/sites-available/001-default.conf

将侦听端口更改为8080

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

保存文件并激活新的配置文件:

  • sudo a2ensite 001-default

然后重新加载Apache:

  • sudo systemctl reload apache2

安装net-tools包含以下netstat命令

  • sudo apt install net-tools

验证 Apache 现在正在侦听8080

  • sudo netstat -tlpn

输出应类似于以下示例,并apache2监听8080

Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd tcp6 0 0 :::8080 :::* LISTEN 4678/apache2 tcp6 0 0 :::22 :::* LISTEN 1086/sshd

一旦您确认 Apache 正在侦听正确的端口,您就可以配置对 PHP 和 FastCGI 的支持。

第 3 步 – 配置 Apache 以使用 mod_fastcgi

Apachemod_php默认使用 PHP 页面,但它需要额外的配置才能使用 PHP-FPM。

注意:如果您在使用 的现有 LAMP 安装上尝试本教程mod_php,请先使用 禁用它sudo a2dismod php7.4

我们将为 添加一个配置块mod_fastcgi,这取决于mod_actionmod_action默认情况下是禁用的,所以我们首先需要启用它:

  • sudo a2enmod actions

重命名现有的 FastCGI 配置文件:

  • sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

创建一个新的配置文件:

  • sudo nano /etc/apache2/mods-enabled/fastcgi.conf

将以下指令添加到文件中以将文件请求传递.php到 PHP-FPM UNIX 套接字:

/etc/apache2/mods-enabled/fastcgi.conf
<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi
  AddType application/x-httpd-fastphp .php
  Action application/x-httpd-fastphp /php-fcgi
  Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
  FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

保存更改并执行配置测试:

  • sudo apachectl -t

注意:如果您看到警告,您现在可以放心地忽略它。我们稍后会配置服务器名称。Could not reliably determine the server's fully /
qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/
to suppress this message.

重新加载Apache,只要Syntax OK显示:

  • sudo systemctl reload apache2

现在让我们确保我们可以从 Apache 提供 PHP。

第 4 步 – 验证 PHP 功能

让我们通过创建一个phpinfo()文件并从 Web 浏览器访问它来确保 PHP 正常工作

创建文件/var/www/html/info.php,其中包含对phpinfo函数的调用

  • echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

请注意,如果您遵循先决条件部分中的初始服务器设置,那么您可能启用了 Apache 防火墙。让我们继续并确保我们可以访问8080当前无法访问的端口上的 IP 我们将在步骤 10 中限制对该端口的公共访问

首先允许端口8080通过防火墙:

  • sudo ufw allow 8080

由于我们要保护我们的 Apache 域,让我们继续确保端口上的 TLS 流量443可以进入。

允许Apache Full允许端口上的流量80443

  • sudo ufw allow "Apache Full"

现在检查您的防火墙状态:

  • sudo ufw status

如果您遵循先决条件,则输出将如下所示:

Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere 8080 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6) 8080 (v6) ALLOW Anywhere (v6)

您将看到该端口8080Apache Full允许与任何其他防火墙规则一起使用。现在让我们查看我们的info.php页面。

info.php在浏览器中查看,请转到这将为您提供 PHP 正在使用的配置设置列表。你会看到类似这样的输出:http://your_server_ip:8080/info.php

phpinfo 服务器 API

phpinfo PHP 变量

在页面的顶部,检查服务器APIFPM / FastCGI的在页面下方大约三分之二处,PHP 变量部分会告诉您SERVER_SOFTWARE是 Ubuntu 上的 Apache。这些确认mod_fastcgi是活动的,并且 Apache 正在使用 PHP-FPM 来处理 PHP 文件。

第 5 步 – 为 Apache 创建虚拟主机

让我们为域. 为此,我们将首先为两个站点创建文档根目录,并在这些目录中放置一些默认文件,以便我们可以轻松测试我们的配置。apache1.your_domainapache2.your_domain

首先,创建文档根目录:

  • sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain

然后index为每个站点创建一个文件:

  • echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
  • echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html

然后phpinfo()为每个站点创建一个文件,以便我们可以测试 PHP 是否配置正确。

  • echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
  • echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php

现在创建虚拟主机文件apache1.your_domain

  • sudo nano /etc/apache2/sites-available/apache1.your_domain.conf

将以下代码添加到文件中以定义主机:

/etc/apache2/sites-available/apache1.your_domain.conf
    <VirtualHost *:8080>
        ServerName apache1.your_domain
        ServerAlias www.apache1.your_domain
        DocumentRoot /var/www/apache1.your_domain
        <Directory /var/www/apache1.your_domain>
            AllowOverride All
        </Directory>
    </VirtualHost>

该生产线AllowOverride All.htaccess提供支持。

这些只是最基本的指令。有关在 Apache 中设置虚拟主机的完整指南,请参阅如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

保存并关闭文件。然后为. 首先创建文件:apache2.your_domain

  • sudo nano /etc/apache2/sites-available/apache2.your_domain.conf

然后将配置添加到文件中:

your_domain.conf’>/etc/apache2/sites-available/apache2。your_domain .conf
    <VirtualHost *:8080>
        ServerName apache2.your_domain
        ServerAlias www.apache2.your_domain
        DocumentRoot /var/www/apache2.your_domain
        <Directory /var/www/apache2.your_domain
            AllowOverride All
        </Directory>
    </VirtualHost>

保存文件并退出编辑器。

现在两个 Apache 虚拟主机都已设置,使用a2ensite命令启用站点这将创建一个指向sites-enabled目录中虚拟主机文件的符号链接

  • sudo a2ensite apache1.your_domain
  • sudo a2ensite apache2.your_domain

再次检查 Apache 是否有配置错误:

  • sudo apachectl -t

Syntax OK如果没有错误,您将看到显示。如果您看到其他任何内容,请检查配置并重试。

一旦您的配置无错误,重新加载 Apache 以应用更改:

  • sudo systemctl reload apache2

为了确认该网站是工作,开放在浏览器中,验证每个站点显示的文件。http://apache1.your_domain:8080http://apache2.your_domain:8080index.html

您将看到以下结果:

apache1 索引页

apache2 索引页

此外,通过访问info.php每个站点文件来确保 PHP 正常工作访问在您的浏览器中。http://apache1.your_domain:8080/info.phphttp://apache2.your_domain:8080/info.php

您将在每个站点上看到与在步骤 4 中看到的相同的 PHP 配置规范列表

我们现在在端口 Apache 上托管了两个网站8080接下来让我们配置 Nginx。

第 6 步 – 安装和配置 Nginx

在这一步中,我们将安装 Nginx 并配置域作为 Nginx 的虚拟主机。有关在 Nginx 中设置虚拟主机的完整指南,请参阅如何在 Ubuntu 20.04 上设置 Nginx 服务器块(虚拟主机)nginx1.your_domainnginx2.your_domain

使用apt包管理器安装 Nginx

  • sudo apt install nginx

然后删除默认虚拟主机的符号链接,因为我们将不再使用它:

  • sudo rm /etc/nginx/sites-enabled/default

我们稍后将创建我们自己的默认站点 ( )。nginx1.your_domain

现在我们将使用与 Apache 相同的过程为 Nginx 创建虚拟主机。首先为两个网站创建文档根目录:

  • sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain

我们将 Nginx 网站保留在 中/usr/share/nginx,这是 Nginx 默认需要它们的地方。您可以将它们/var/www/html与 Apache 站点放在一起,但这种分离可以帮助您将站点与 Nginx 相关联。

正如您对 Apache 的虚拟主机所做的那样,在设置完成后创建indexphpinfo()测试文件:

  • echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
  • echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
  • echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
  • echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php

现在为域创建一个虚拟主机文件nginx1.your_domain

  • sudo nano /etc/nginx/sites-available/nginx1.your_domain

Nginx 调用server {. . .}配置文件服务器块的区域为主要虚拟主机创建一个服务器块,. 配置指令使得这个用于处理HTTP不匹配任何其他虚拟主机请求的默认虚拟主机。nginx1.your_domaindefault_server

your_domain’>/etc/nginx/sites-available/nginx1. your_domain
server {
    listen 80 default_server;

    root /usr/share/nginx/nginx1.your_domain;
    index index.php index.html index.htm;

    server_name nginx1.your_domain www.nginx1.your_domain;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

保存并关闭文件。现在为 Nginx 的第二个域创建一个虚拟主机文件nginx2.your_domain

  • sudo nano /etc/nginx/sites-available/nginx2.your_domain

将以下内容添加到文件中:

your_domain’>/etc/nginx/sites-available/nginx2. your_domain
server {
    root /usr/share/nginx/nginx2.your_domain;
    index index.php index.html index.htm;

    server_name nginx2.your_domain www.nginx2.your_domain;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

保存并关闭文件。

通过创建指向sites-enabled目录的符号链接来启用两个站点

  • sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
  • sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain

测试 Nginx 配置以确保没有配置问题:

  • sudo nginx -t

如果没有错误,则重新加载 Nginx:

  • sudo systemctl reload nginx

现在phpinfo()通过访问http://nginx1在 Web 浏览器中访问两个 Nginx 虚拟主机文件您的/info.php 和http://nginx2您的域名/info.php。再次查看 PHP 变量部分。

[“SERVER_SOFTWARE”]应该是nginx,表示这些文件是由 Nginx 直接提供的。[“DOCUMENT_ROOT”]应指向您在此步骤之前为每个 Nginx 站点创建的目录。

至此,我们已经安装了 Nginx 并创建了两个虚拟主机。接下来,我们将配置 Nginx 来代理针对托管在 Apache 上的域的请求。

步骤 7 — 为 Apache 的虚拟主机配置 Nginx

让我们在server_name指令中创建一个具有多个域名的额外 Nginx 虚拟主机对这些域名的请求将被代理到 Apache。

创建一个新的 Nginx 虚拟主机文件以将请求转发到 Apache:

  • sudo nano /etc/nginx/sites-available/apache

添加以下代码块;它指定了两个 Apache 虚拟主机域的名称并将它们的请求代理到 Apache。请记住在以下位置使用公共 IP 地址proxy_pass

/etc/nginx/sites-available/apache
server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;

    location / {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

保存文件并通过创建符号链接启用这个新的虚拟主机:

  • sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

测试配置以确保没有错误:

  • sudo nginx -t

如果没有错误,请重新加载 Nginx:

  • sudo systemctl reload nginx

打开浏览器并访问浏览器中的 URL 向下滚动到PHP 变量部分并检查显示的值。http://apache1.your_domain/info.php

变量SERVER_SOFTWAREDOCUMENT_ROOT确认这个请求是由 Apache 处理的。变量HTTP X REAL_IPHTTP X FORWARDED_FOR由Nginx的增加了,应当显示您正在使用访问URL的计算机的公共IP地址(如果你直接端口访问Apache的8080,你不会看到这些变量)。

我们已成功设置 Nginx 以将特定域的请求代理到 Apache。接下来,让我们配置 Apache 以设置REMOTE_ADDR变量,就好像它直接处理这些请求一样。

步骤 8 — 安装和配置 mod_rpaf

在此步骤中,您将安装一个名为的 Apache 模块mod_rpaf,该模块根据反向代理提供的值重写REMOTE_ADDRHTTPSHTTP_PORT的值。如果没有这个模块,一些 PHP 应用程序需要更改代码才能从代理后面无缝工作。该模块存在于 Ubuntu 的存储库中,libapache2-mod-rpaf但它已经过时并且不支持某些配置指令。相反,我们将从源代码安装它。

移动到您的主目录并安装构建模块所需的包:

  • sudo apt install unzip build-essential apache2-dev

从 GitHub 下载最新的稳定版本:

  • wget https://github.com/gnif/mod_rpaf/archive/stable.zip

解压下载的文件:

  • unzip stable.zip

切换到包含文件的新目录:

  • cd mod_rpaf-stable

编译并安装模块:

  • make
  • sudo make install

接下来,在mods-available将加载rpaf模块目录中创建一个文件

  • sudo nano /etc/apache2/mods-available/rpaf.load

将以下代码添加到文件中以加载模块:

/etc/apache2/mods-available/rpaf.load
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

保存文件并退出编辑器。

在此目录中创建另一个名为的文件,该文件rpaf.conf将包含以下配置指令mod_rpaf

  • sudo nano /etc/apache2/mods-available/rpaf.conf

将以下代码块添加到 configure mod_rpaf,确保指定服务器的 IP 地址:

/etc/apache2/mods-available/rpaf.conf
    <IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           your_server_ip 
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
    </IfModule>

以下是每个指令的简要说明。有关更多信息,请参阅mod_rpaf 自述文件。

  • RPAF_Header – 用于客户端真实 IP 地址的标头。
  • RPAF_ProxyIPs – 要为其调整 HTTP 请求的代理 IP。
  • RPAF_SetHostName – 更新虚拟主机名称ServerNameServerAlias工作。
  • RPAF_SetHTTPSHTTPS根据中包含的值设置环境变量X-Forwarded-Proto
  • RPAF_SetPort – 设置SERVER_PORT环境变量。当 Apache 位于 SSL 代理后面时很有用。

保存rpaf.conf并启用模块:

  • sudo a2enmod rpaf

这将创建文件的符号链接rpaf.load,并rpaf.confmods-enabled目录中。现在做一个配置测试:

  • sudo apachectl -t

如果没有错误,请重新加载 Apache:

  • sudo systemctl reload apache2

在浏览器中访问phpinfo()页面检查PHP 变量部分。REMOTE_ADDR变量现在也将是你的本地计算机的公网IP地址。http://apache1.your_domain/info.phphttp://apache2.your_domain/info.php

现在让我们为每个站点设置 TLS/SSL 加密。

步骤 9 — 使用 Let’s Encrypt 设置 HTTPS 网站(可选)

在此步骤中,我们将为 Apache 上托管的两个域配置 TLS/SSL 证书。我们将通过 [Let’s Encrypt]( https://letsencrypt.org ]获取证书。Nginx 支持 SSL 终止,因此我们可以在不修改 Apache 的配置文件的情况下设置 SSL。该mod_rpaf模块确保在 Apache 上设置所需的环境变量以使应用程序在 SSL 反向代理后无缝运行。

首先,我们将server {...}两个域分开,以便每个域都可以拥有自己的 SSL 证书。/etc/nginx/sites-available/apache在编辑器中打开文件

  • sudo nano /etc/nginx/sites-available/apache

修改文件,使其看起来像这样,在它们自己的块中:apache1.your_domainapache2.your_domainserver

/etc/nginx/sites-available/apache
    server {
        listen 80;
        server_name apache1.your_domain www.apache1.your_domain;

        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    server {
        listen 80;
        server_name apache2.your_domain www.apache2.your_domain;

        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

我们将使用Certbot生成我们的 TLS/SSL 证书。它的 Nginx 插件将负责重新配置 Nginx 并在必要时重新加载配置。

certbot使用 snapd安装

  • sudo snap install --classic certbot

安装后,使用该 certbot命令为生成证书apache1.your_domainwww.apache1.your_domain

  • sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain

此命令告诉 Certbot 使用nginx插件,-d用于指定我们希望证书有效的名称。

现在为第二个域执行命令:

  • sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache2.your_domain -d www.apache2.your_domain

使用https://前缀在浏览器中访问 Apache 的域之一访问https://apache1.your_domain/info.phphttps://apache2.your_domain/info.php

查看PHP 变量部分。变量SERVER_PORT已设置为443并且HTTPS设置为on,就好像通过 HTTPS 直接访问 Apache。设置这些变量后,PHP 应用程序无需专门配置为在反向代理后工作。

现在让我们禁用对 Apache 的直接访问。

步骤 10 — 阻止对 Apache 的直接访问(可选)

由于 Apache 正在侦听8080公共 IP 地址上的端口,因此每个人都可以访问它。可以通过在防火墙规则集中使用以下 IPtables 命令来阻止它。

  • sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset

请务必使用您服务器的 IP 地址代替突出显示的示例。一旦端口8080在防火墙中被阻止,请测试 Apache 在其上是否无法访问。打开您的网络浏览器并尝试在端口 上访问 Apache 的域名之一8080例如:http://apache1你的域名:8080

浏览器应显示“无法连接”或“网页不可用”错误消息。有了 IPtablestcp-reset选项,局外人将看不到端口8080和没有任何服务的端口之间的区别

注意:默认情况下,IPtables 规则不会在系统重启后继续存在。有多种方法可以保留 IPtables 规则,但最简单的方法是iptables-persistent在 Ubuntu 的存储库中使用。浏览本文以了解有关如何配置 IPTables 的更多信息。

现在让我们配置 Nginx 为 Apache 站点提供静态文件。

第 11 步 – 使用 Nginx 提供静态文件(可选)

当 Nginx 代理对 Apache 域的请求时,它会将对该域的每个文件请求发送到 Apache。Nginx 在提供静态文件(如图像、JavaScript 和样式表)方面比 Apache 更快。因此,让我们将 Nginx 的apache虚拟主机文件配置为直接提供静态文件,但将 PHP 请求发送到 Apache。

/etc/nginx/sites-available/apache在编辑器中打开文件

  • sudo nano /etc/nginx/sites-available/apache

您需要向location每个服务器块添加两个附加块,并修改现有location部分。此外,您需要告诉 Nginx 在哪里可以找到每个站点的静态文件。

如果您决定不使用 SSL 和 TLS 证书,请修改您的文件,使其看起来像这样:

/etc/nginx/sites-available/apache
server {
    listen 80;
    server_name apache2.your_domain www.apache2.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
}

server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
}

如果您还希望 HTTPS 可用,请改用以下配置:

/etc/nginx/sites-available/apache
server {
    listen 80;
    server_name apache2.your_domain www.apache2.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

try_files指令使 Nginx 在文档根目录中查找文件并直接为它们提供服务。如果文件有.php扩展名,则请求将传递给 Apache。即使在文档根目录中找不到该文件,请求也会传递给 Apache,以便永久链接等应用程序功能正常工作。

警告:location ~ /\.ht指令非常重要;这会阻止 Nginx 提供包含敏感信息的 Apache 配置文件的内容,例如.htaccess.htpasswd

保存文件并执行配置测试:

  • sudo nginx -t

如果测试成功,请重新加载 Nginx:

  • sudo service nginx reload

为了验证一切正常,你可以检查Apache的日志文件/var/log/apache2,看到GET的请求info.php的文件使用命令查看文件的最后几行,并使用开关观察文件的变化:apache2.your_domainapache1.your_domaintail-f

  • sudo tail -f /var/log/apache2/other_vhosts_access.log

现在访问在您的浏览器中,然后查看日志的输出。您会看到 Apache 确实在回复(您的端口将是取决于您是否保护了实例):apache1.your_domain/info.phpapache2.your_domain/info.php80443

Output
apache2.your_domain:80 your_server_ip - - [27/Aug/2020:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"

然后访问index.html每个站点页面,您将看不到来自 Apache 的任何日志条目。Nginx 正在为他们服务。

完成对日志文件的观察后,按CTRL+C停止拖尾。

使用此设置,Apache 将无法限制对静态文件的访问。静态文件的访问控制需要在 Nginx 的apache虚拟主机文件中配置,但这超出了本教程的范围。

结论

您现在拥有一台带有 Nginx 服务和 的Ubuntu 服务器,以及 Apache 服务. 尽管 Nginx 充当 Apache 的反向代理,但 Nginx 的代理服务是透明的,与 Apache 域的连接似乎直接由 Apache 本身提供。您可以使用此方法为安全和静态站点提供服务。nginx1.your_domainnginx2.your_domainapache1.your_domainapache2.your_domain

觉得文章有用?

点个广告表达一下你的爱意吧 !😁