如何在一台 Ubuntu 16.04 服务器上将 Nginx 配置为 Apache 的 Web 服务器和反向代理如何在一台 Ubuntu 16.04 服务器上将 Nginx 配置为 Apache 的 Web 服务器和反向代理如何在一台 Ubuntu 16.04 服务器上将 Nginx 配置为 Apache 的 Web 服务器和反向代理如何在一台 Ubuntu 16.04 服务器上将 Nginx 配置为 Apache 的 Web 服务器和反向代理
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在一台 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 存储库以确保您拥有最新的软件包。

  1. sudo apt-get update

接下来,安装必要的包:

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

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

第 2 步 — 配置 Apache 和 PHP-FPM

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

  1. 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 上提供站点服务,因此我们也必须更改它。打开默认的虚拟主机文件。

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

第一行应该是:

<VirtualHost *:80>

将其更改为:

<VirtualHost *:8080>

保存文件并重新加载 Apache。

  1. sudo systemctl reload apache2

验证 Apache 现在正在侦听 8080。

  1. 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 安装上尝试本教程,请先使用以下命令禁用它:

  1. sudo a2dismod php7.0

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

  1. sudo a2enmod actions

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

  1. 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 所做的更改并进行配置测试。

  1. sudo apachectl -t

如果显示 Syntax OK,请重新加载 Apache。如果您看到警告 Could not reliable determine the servers fully qualified domain name, using 127.0.1.1。全局设置 ServerName 指令以抑制此消息。,没关系。它现在不影响我们。

  1. sudo systemctl reload apache2

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

第 4 步 — 验证 PHP 功能

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

  1. 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 虚拟主机文件。为此,我们将首先为两个站点创建文档根目录,并在这些目录中放置一些默认文件,以便我们可以轻松地测试我们的配置。

首先,创建根目录:

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

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

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

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

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

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

  1. 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 创建一个类似的配置。

  1. 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 目录中创建一个指向虚拟主机文件的符号链接。

  1. sudo a2ensite foobar.net
  1. sudo a2ensite test.io

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

  1. sudo apachectl -t

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

  1. 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。

  1. sudo apt-get install nginx

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

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

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

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

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

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

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

  1. 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 创建一个虚拟主机文件。

  1. 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 目录的符号链接来启用这两个站点。

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

做一个 Nginx 配置测试:

  1. sudo nginx -t

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

  1. 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 虚拟主机文件:

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

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

  1. sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

做一个配置测试:

  1. sudo nginx -t

如果显示OK,请重新加载Nginx。

  1. 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 的存储库中,但已过时且不支持某些配置指令。相反,我们将从源代码安装它。

安装构建模块所需的包:

  1. sudo apt-get install unzip build-essential apache2-dev

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

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

提取它:

  1. unzip stable.zip

切换到工作目录。

  1. cd mod_rpaf-stable

然后编译并安装模块。

  1. make
  1. sudo make install

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

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

将以下行添加到文件中:

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

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

  1. 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 并启用该模块。

  1. sudo a2enmod rpaf

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

  1. sudo apachectl -t

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

  1. sudo systemctl reload apache2

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

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

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

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

  1. sudo mkdir /etc/nginx/ssl

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

  1. 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
  1. 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 虚拟主机文件。

  1. 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,这是安全站点的默认端口。

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

  1. sudo nginx -t

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

  1. 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 命令来阻止它。

  1. 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 虚拟主机文件。

  1. 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。

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

  1. sudo nginx -t

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

  1. sudo service nginx reload

要验证这是否有效,您可以检查 /var/log/apache2 中的 Apache 日志文件,并查看对 test 的 info.php 文件的 GET 请求。 io 和 foobar.net。使用 tail 命令查看文件的最后几行,并使用 -f 开关查看文件的变化。

  1. 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 本身。您可以使用此方法为安全和静态站点提供服务。

©2015-2025 艾丽卡 support@alaica.com