如何在一台Ubuntu16.04服务器上将Nginx配置为Web服务器和Apache的反向代理

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

可以将同时具有 IPv4 和 IPv6 地址的 Droplet 配置为在一种协议上为 Apache 站点提供服务,而在另一种协议上为 Nginx 站点提供服务,但这目前并不实用,因为 ISP 采用 IPv6 仍然没有普及。 为第二个 Web 服务器使用不同的端口号,例如 818080 是另一种解决方案,但使用端口号(例如 http://example.com:81)共享 URL 并不总是合理的,或者理想的。

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

我们将在一个 Droplet 上托管四个域名。 Nginx 将提供两个服务:example.com(默认虚拟主机)和 sample.org。 剩下的两个,foobar.nettest.io,将由 Apache 提供服务。

先决条件

  • 一个新的 Ubuntu 16.04 Droplet。
  • 具有 sudo 权限的标准用户帐户。 您可以按照 Initial Server Setup with Ubuntu 16.04 的步骤 2 和 3 设置标准帐户。
  • 所需的域名应指向 DigitalOcean 控制面板中的 Droplet 的 IP 地址。 有关如何执行此操作的示例,请参阅 如何使用 DigitalOcean 设置主机名的第 3 步。 如果您在其他地方托管您的域的 DNS,则应改为在那里创建适当的 A 记录。

可选参考

本教程需要 Apache 和 Nginx 中的虚拟主机的基本知识,以及 SSL 证书的创建和配置。 有关这些主题的更多信息,请参阅以下文章。

第 1 步 — 安装 Apache 和 PHP-FPM

除了 Apache 和 PHP-FPM,我们还必须安装名为 libapache2-mod-fastcgi 的 PHP FastCGI Apache 模块。

首先,更新 apt 存储库以确保您拥有最新的软件包。

sudo apt-get update

接下来,安装必要的软件包:

sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

接下来,让我们更改 Apache 的默认配置。

第 2 步 — 配置 Apache 和 PHP-FPM

在这一步中,我们将 Apache 的端口号更改为 8080,并使用 mod_fastcgi 模块将其配置为与 PHP-FPM 一起使用。 编辑 Apache 配置文件并更改 Apache 的端口号。

sudo nano /etc/apache2/ports.conf

找到以下行:

Listen 80

将其更改为:

Listen 8080

保存并退出ports.conf

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


接下来我们将编辑 Apache 的默认虚拟主机文件。 此文件中的 <VirtualHost> 指令设置为仅在端口 80 上为站点提供服务,因此我们也必须对其进行更改。 打开默认的虚拟主机文件。

sudo nano /etc/apache2/sites-available/000-default.conf

第一行应该是:

<VirtualHost *:80>

将其更改为:

<VirtualHost *:8080>

保存文件并重新加载 Apache。

sudo systemctl reload apache2

验证 Apache 现在正在侦听 8080

sudo netstat -tlpn

输出应类似于以下示例,其中 apache2 侦听 :::8080

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

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

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


sudo a2dismod php7.0

我们将为 mod_fastcgi 添加一个配置块,它依赖于 mod_actionmod_action默认是禁用的,所以我们首先需要启用它。

sudo a2enmod actions

这些配置指令将对 .php 文件的请求传递到 PHP-FPM UNIX 套接字。

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

<IfModule mod_fastcgi.c> . . . </IfModule> 块中添加以下行,在该块中的现有项目下方:

 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.0-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
    Require all granted
 </Directory>

保存您对 fastcgi.conf 所做的更改并进行配置测试。

sudo apachectl -t

如果显示 Syntax OK,则重新加载 Apache。 如果您看到警告 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.,那很好。 现在对我们没有影响。

sudo systemctl reload apache2

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

第 4 步 — 验证 PHP 功能

通过创建 phpinfo() 文件并从 Web 浏览器访问它来检查 PHP 是否工作。

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

要在浏览器中查看文件,请转到 http://your_ip_address:8080/info.php。 这将为您提供 PHP 正在使用的配置设置列表。

在页面顶部,检查 Server API 是否显示 FPM/FastCGI。 在页面向下大约三分之二的地方,PHP 变量 部分将告诉您 SERVER_SOFTWARE 是 Ubuntu 上的 Apache。 这些确认 mod_fastcgi 处于活动状态并且 Apache 正在使用 PHP-FPM 处理 PHP 文件。

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

让我们为域 foobar.nettest.io 创建 Apache 虚拟主机文件。 为此,我们将首先为两个站点创建文档根目录,并在这些目录中放置一些默认文件,以便我们可以轻松地测试我们的配置。

首先,创建根目录:

sudo mkdir -v /var/www/{foobar.net,test.io}

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

echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/index.html

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

echo "<?php phpinfo(); ?>" | sudo tee /var/www/foobar.net/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php

现在为 foobar.net 域创建虚拟主机文件。

sudo nano /etc/apache2/sites-available/foobar.net.conf

将以下指令放在这个新文件中:

<VirtualHost *:8080>
    ServerName foobar.net
    ServerAlias www.foobar.net
    DocumentRoot /var/www/foobar.net
    <Directory /var/www/foobar.net>
        AllowOverride All
    </Directory>
</VirtualHost>

笔记: AllowOverride All enables .htaccess support.


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

保存并关闭文件。 然后为 test.io 创建一个类似的配置。

sudo nano /etc/apache2/sites-available/test.io.conf
<VirtualHost *:8080>
    ServerName test.io
    ServerAlias www.test.io
    DocumentRoot /var/www/test.io
    <Directory /var/www/test.io>
        AllowOverride All
    </Directory>
</VirtualHost>

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

sudo a2ensite foobar.net
sudo a2ensite test.io

再次检查 Apache 是否存在配置错误。

sudo apachectl -t

如果显示 Syntax OK,则重新加载 Apache。

sudo systemctl reload apache2

要确认站点是否正常工作,请在浏览器中打开 http://foobar.net:8080http://test.io:8080 并验证每个站点是否显示其 index.html 文件。

您应该看到以下结果:

此外,通过访问每个站点的 info.php 文件来检查 PHP 是否正常工作。 在浏览器中访问 http://foobar.net:8080/info.phphttp://test.io:8080/info.php

您应该在每个站点上看到与第 4 步中相同的 PHP 配置规范列表。 我们现在有两个网站托管在 Apache 的端口 8080

第 6 步 — 安装和配置 Nginx

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

使用包管理器安装 Nginx。

sudo apt-get install nginx

然后删除默认虚拟主机的符号链接,因为我们将不再使用它。 稍后我们将创建自己的默认站点 (example.com)。

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

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

sudo mkdir -v /usr/share/nginx/{example.com,sample.org}

正如我们对 Apache 的虚拟主机所做的那样,我们将在设置完成后再次创建 indexphpinfo() 文件进行测试。

echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php

现在为域 example.com 创建一个虚拟主机文件。

sudo nano /etc/nginx/sites-available/example.com

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

将以下内容粘贴到 example.com 的文件中:

server {
    listen 80 default_server;

    root /usr/share/nginx/example.com;
    index index.php index.html index.htm;

    server_name example.com www.example.com;
    location / {
        try_files $uri $uri/ /index.php;
    }

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

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

sudo nano /etc/nginx/sites-available/sample.org

sample.org 的服务器块应如下所示:

server {
    root /usr/share/nginx/sample.org;
    index index.php index.html index.htm;

    server_name sample.org www.sample.org;
    location / {
        try_files $uri $uri/ /index.php;
    }

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

保存并关闭文件。 然后通过创建指向 sites-enabled 目录的符号链接来启用这两个站点。

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

做一个 Nginx 配置测试:

sudo nginx -t

如果显示 OK 则重新加载 Nginx。

sudo systemctl reload nginx

现在通过访问 http://example.com/info.phphttp://sample.org/info.php 在 Web 浏览器中访问 Nginx 虚拟主机的 phpinfo() 文件。 再次查看 PHP 变量部分。

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

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

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

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

创建一个新的 Nginx 虚拟主机文件:

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

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

server {
    listen 80;
    server_name foobar.net www.foobar.net test.io www.test.io;

    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

如果显示 OK 则重新加载 Nginx。

sudo systemctl reload nginx

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

变量 SERVER_SOFTWAREDOCUMENT_ROOT 确认此请求已由 Apache 处理。 变量 HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR 由 Nginx 添加,应显示您用于访问 URL 的计算机的公共 IP 地址。

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

第 8 步 — 安装和配置 mod_rpaf

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

安装构建模块所需的包:

sudo apt-get 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

在加载 rpaf 模块的 mods-available 目录中创建一个文件。

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

将以下行添加到文件中:

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

在此目录中创建另一个文件。 这将包含配置指令。

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

添加以下代码块,确保添加您的 Droplet 的 IP 地址。

<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 README 文件。

  • RPAF_Header - 用于客户端真实 IP 地址的标头。
  • RPAF_ProxyIPs - 用于调整 HTTP 请求的代理 IP。
  • RPAF_SetHostName - 更新虚拟主机名,以便 ServerName 和 ServerAlias 工作。
  • RPAF_SetHTTPS - 根据 X-Forwarded-Proto 中包含的值设置 HTTPS 环境变量。
  • RPAF_SetPort - 设置 SERVER_PORT 环境变量。 当 Apache 位于 SSL 代理之后时很有用。

保存 rpaf.conf 并启用模块。

sudo a2enmod rpaf

这将在 mods-enabled 目录中创建文件 rpaf.loadrpaf.conf 的符号链接。 现在进行配置测试。

sudo apachectl -t

如果返回 Syntax OK,则重新加载 Apache。

sudo systemctl reload apache2

在浏览器中访问 Apache 网站的 phpinfo() 页面之一并检查 PHP 变量 部分。 REMOTE_ADDR 变量现在也将是您本地计算机的公共 IP 地址的变量。

第 9 步 — 设置 HTTPS 网站(可选)

在这一步中,我们将为托管在 Apache 上的两个域配置 SSL 证书。 Nginx 支持 SSL 终止,因此我们可以在不修改 Apache 的配置文件的情况下设置 SSL。 mod_rpaf 模块确保在 Apache 上设置所需的环境变量,以使应用程序在 SSL 反向代理后面无缝工作。

为 SSL 证书及其私钥创建一个目录。

sudo mkdir /etc/nginx/ssl

对于本文,我们将使用有效期为 10 年的自签名 SSL 证书。 为 foobar.nettest.io 生成自签名证书。

sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/foobar.net-key.pem -out /etc/nginx/ssl/foobar.net-cert.pem -days 3650 -nodes
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.io-key.pem -out /etc/nginx/ssl/test.io-cert.pem -days 3650 -nodes

每次都会提示您输入证书标识详细信息。 每次为 Common Name 输入适当的域。

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:foobar.net
Email Address []:

现在打开将请求从 Nginx 代理到 Apache 的 Apache 虚拟主机文件。

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

由于我们为每个域都有单独的证书和密钥,因此我们需要为每个域设置单独的 server { . . . } 块。 您应该删除文件的当前内容并将其替换为以下内容:

server {
    listen 80;
    listen 443 ssl;
    server_name test.io www.test.io;

    ssl on;
    ssl_certificate /etc/nginx/ssl/test.io-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/test.io-key.pem;

    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;
    listen 443 ssl;
    server_name foobar.net www.foobar.net;

    ssl on;
    ssl_certificate /etc/nginx/ssl/foobar.net-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/foobar.net-key.pem;

    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;
    }
}

我们将原始服务器块分成两个单独的块,并且我们还告诉 Nginx 侦听端口 443,这是安全站点的默认端口。

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

sudo nginx -t

如果测试成功,则重新加载 Nginx。

sudo systemctl reload nginx

现在,在浏览器中使用 https:// 前缀访问 Apache 的域之一。 首先,访问 https://foobar.net/info.php 你会看到这个:

我们在本教程中使用了自签名证书,因此浏览器可能会警告我们连接可能不受信任。 您可以通过信任该站点来安全地进行操作。


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

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

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

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

请务必使用您的 Droplet 的 IP 地址代替红色示例。 一旦端口 8080 在您的防火墙中被阻止,请测试 Apache 在其上是否无法访问。 打开您的 Web 浏览器并尝试在端口 8080 上访问 Apache 的域名之一。 例如:http://example.com:8080

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

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

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

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

首先,打开apache虚拟主机文件。

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

您需要向 each 服务器块添加两个额外的位置块,并修改现有的位置块。 (如果您在上一步中只有一个服务器块,您可以完全替换文件的内容,使其与下面显示的内容相匹配。)此外,您需要告诉 Nginx 在哪里可以找到每个站点的静态文件. 这些更改在以下代码中以红色显示:

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    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 ~ /\. {
        deny all;
    }
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    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 ~ /\. {
        deny all;
    }
}

如果您还希望 HTTPS 可用,请保留步骤 9 中的 listen 443 ssl; 行和其他 SSL 设置。


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

警告: location ~ /\.指令很重要; 这可以防止 Nginx 打印包含敏感信息的文件的内容,例如 .htaccess.htpasswd


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

sudo nginx -t

如果测试成功,则重新加载 Nginx。

sudo service nginx reload

要验证这是否有效,您可以检查 /var/log/apache2 中的 Apache 日志文件,并查看 test.iofoobar.netinfo.php 文件的 GET 请求。 使用 tail 命令查看文件的最后几行,并使用 -f 开关查看文件的更改。

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

在浏览器中访问 http://test.io/info.php,然后查看日志的输出。 您会看到 Apache 确实在回复:

 test.io:80 your_server_ip - - [01/Jul/2016: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/47.0.2526.111 Safari/537.36"

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

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

此设置的唯一警告是 Apache 将无法限制对静态文件的访问。 静态文件的访问控制需要在 Nginx 的 apache 虚拟主机文件中配置。

结论

你现在有一个 Ubuntu Droplet,Nginx 服务 example.comsample.org,Apache 服务 foobar.nettest.io。 尽管 Nginx 充当 Apache 的反向代理,但 Nginx 的代理服务是透明的,与 Apache 域的连接似乎是直接从 Apache 本身提供的。 您可以使用此方法为安全和静态站点提供服务。