如何在一台 Ubuntu 16.04 服务器上将 Nginx 配置为 Apache 的 Web 服务器和反向代理
介绍
Apache 和 Nginx 是两种流行的开源 Web 服务器,通常与 PHP 一起使用。当托管具有不同要求的多个网站时,在同一台虚拟机上运行它们会很有用。在单个系统上运行两个 Web 服务器的一般解决方案是使用多个 IP 地址或不同的端口号。
同时具有 IPv4 和 IPv6 地址的 Droplet 可以配置为在一个协议上为 Apache 站点提供服务,在另一个协议上为 Nginx 站点提供服务,但这目前并不实用,因为 ISP 对 IPv6 的采用仍然不普遍。为第二个 Web 服务器使用不同的端口号,如 81
或 8080
是另一种解决方案,但共享带有端口号的 URL(例如 http://example. com:81
) 并不总是合理或理想的。
本教程将向您展示如何将 Nginx 配置为 Web 服务器和 Apache 的反向代理——所有这些都在一个 Droplet 上。根据 Web 应用程序,可能需要更改代码以保持 Apache 反向代理感知,尤其是在配置 SSL 站点时。为避免这种情况,我们将安装一个名为 mod_rpaf 的 Apache 模块,它会重写某些环境变量,使 Apache 看起来直接处理来自 Web 客户端的请求。
我们将在一个 Droplet 上托管四个域名。 Nginx 将提供两个服务:example.com
(默认虚拟主机)和 sample.org
。剩下的两个,foobar.net
和 test.io
,将由 Apache 提供服务。
先决条件
- 新的 Ubuntu 16.04 Droplet。
- 具有
sudo
权限的标准用户帐户。您可以按照 Ubuntu 16.04 初始服务器设置的第 2 步和第 3 步设置标准帐户。 - 所需的域名应指向您在 DigitalOcean 控制面板中的 Droplet 的 IP 地址。有关如何执行此操作的示例,请参阅如何使用 DigitalOcean 设置主机名的步骤 3。如果您将域的 DNS 托管在别处,则应该在那里创建适当的 A 记录。
可选参考
本教程需要 Apache 和 Nginx 虚拟主机的基本知识,以及 SSL 证书的创建和配置。有关这些主题的更多信息,请参阅以下文章。
- 在 Apache 上设置虚拟主机
- 在 Nginx 上设置虚拟主机
- 使用 Nginx 在一个 IP 上设置多个 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 的默认虚拟主机文件。此文件中的
指令设置为仅在端口 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_action
。 mod_action
默认是禁用的,所以我们首先需要启用它。
- sudo a2enmod actions
这些配置指令将对 .php
文件的请求传递给 PHP-FPM UNIX 套接字。
- sudo nano /etc/apache2/mods-enabled/fastcgi.conf
在
块,在该块中现有项目的下方:
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 reliable determine the servers fully qualified domain name, using 127.0.1.1。全局设置 ServerName 指令以抑制此消息。
,没关系。它现在不影响我们。
- 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 正在使用的配置设置列表。


在页面顶部,检查服务器 API 是否显示 FPM/FastCGI。在页面下方大约三分之二处,PHP 变量部分将告诉您 SERVER_SOFTWARE 是 Ubuntu 上的 Apache。这些确认 mod_fastcgi
处于活动状态并且 Apache 正在使用 PHP-FPM 来处理 PHP 文件。
第 5 步 — 为 Apache 创建虚拟主机
让我们为域 foobar.net
和 test.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
启用 .htaccess
支持。
这些只是最基本的指令。有关在 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:8080
和 http://test.io: 8080
并验证每个站点是否显示其 index.html 文件。
您应该会看到以下结果:


此外,通过访问每个站点的 info.php 文件来检查 PHP 是否正常工作。访问 http://foobar.net:8080/info.php
和 http://test.io:8080/info .php
在您的浏览器中。
您应该会在每个站点上看到与您在第 4 步中看到的相同的 PHP 配置规范列表。我们现在有两个网站托管在 Apache 的 8080
端口
第 6 步 — 安装和配置 Nginx
在此步骤中,我们将安装 Nginx 并将域 example.com
和 sample.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 的虚拟主机所做的那样,我们将再次创建 index
和 phpinfo()
文件以在设置完成后进行测试。
- 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.php
,在 Web 浏览器中访问 Nginx 虚拟主机的 phpinfo()
文件和 http://sample.org/info.php
。再次查看 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_SOFTWARE 和 DOCUMENT_ROOT 确认这个请求是由 Apache 处理的。变量 HTTP_X_REAL_IP 和 HTTP_X_FORWARDED_FOR 是由 Nginx 添加的,应该显示您用来访问 URL 的计算机的公共 IP 地址。
我们已成功设置 Nginx 以将特定域的请求代理到 Apache。接下来,让我们配置 Apache 以设置 REMOTE_ADDR
变量,就像它直接处理这些请求一样。
第 8 步 — 安装和配置 mod_rpaf
在这一步中,我们将安装一个名为 mod_rpaf 的 Apache 模块,它根据反向代理提供的值重写 REMOTE_ADDR、HTTPS 和 HTTP_PORT 的值。如果没有这个模块,一些 PHP 应用程序将需要更改代码才能在代理后面无缝运行。此模块作为 libapache2-mod-rpaf
存在于 Ubuntu 的存储库中,但已过时且不支持某些配置指令。相反,我们将从源代码安装它。
安装构建模块所需的包:
- 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
自述文件。
- 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.load
和 rpaf.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.net
和 test.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 设置为打开,就好像 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
您需要向每个服务器块添加两个额外的位置块,并修改现有的位置块。 (如果您只有一个来自前面步骤的服务器块,您可以完全替换文件的内容,使其与下面显示的内容匹配。)此外,您需要告诉 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 可用,请保留 listen 443 ssl;
行和第 9 步中的其他 SSL 设置。
try_files
指令使 Nginx 在文档根目录中查找文件并直接为它们提供服务。如果该文件具有 .php
扩展名,请求将传递给 Apache。即使在文档根目录中找不到该文件,该请求也会传递给 Apache,以便永久链接等应用程序功能正常运行。
警告:location ~ /\.
指令非常重要;这可以防止 Nginx 打印包含敏感信息的文件内容,例如 .htaccess
和 .htpasswd
。
保存文件并执行配置测试。
- sudo nginx -t
如果测试成功,请重新加载 Nginx。
- sudo service nginx reload
要验证这是否有效,您可以检查 /var/log/apache2
中的 Apache 日志文件,并查看对 test 的
和 info.php
文件的 GET 请求。 iofoobar.net
。使用 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.com
和 sample.org
,Apache 服务于 foobar.net
和 test .io
。尽管 Nginx 充当 Apache 的反向代理,但 Nginx 的代理服务是透明的,与 Apache 域的连接似乎直接来自 Apache 本身。您可以使用此方法为安全和静态站点提供服务。