前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在一个Ubuntu 16.04服务器上将Nginx配置为Web服务器和Apache的反向代理

如何在一个Ubuntu 16.04服务器上将Nginx配置为Web服务器和Apache的反向代理

原创
作者头像
苏子晨
修改2018-08-14 15:42:04
4.2K0
修改2018-08-14 15:42:04
举报
文章被收录于专栏:云计算教程系列

介绍

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

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

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

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

准备

  • 一个新的Ubuntu 16.04 CVM。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 具有sudo权限的标准用户帐户。
  • 域名。如果您在其他地方托管域名的DNS,则应该在那里创建适当的A记录。如果你没有域名,建议您先去这里注册一个域名,您需要将域名解析到您的服务器,您可以使用腾讯云云解析进行快速设置。

可选参考

本教程需要Apache和Nginx中虚拟主机的基本知识,以及SSL证书的创建和配置。有关这些主题的更多信息,请参阅以下文章。Apache基础教程:软件安装和故障排查Nginx的安装和配置疑难解答如何在Ubuntu上使用SSL来保护Nginx

第一步 - 安装Apache和PHP-FPM

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

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

代码语言:javascript
复制
sudo apt-get update

接下来,安装必要的包:

代码语言:javascript
复制
sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

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

第二步 - 配置Apache和PHP-FPM

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

代码语言:javascript
复制
sudo nano /etc/apache2/ports.conf

找到以下行:

代码语言:javascript
复制
Listen 80

将其更改为:

代码语言:javascript
复制
Listen 8080

保存并退出ports.conf

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

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

代码语言:javascript
复制
sudo nano /etc/apache2/sites-available/000-default.conf

第一行应该是:

代码语言:javascript
复制
<VirtualHost *:80>

将其更改为:

代码语言:javascript
复制
<VirtualHost *:8080>

保存文件并重新加载Apache。

代码语言:javascript
复制
sudo systemctl reload apache2

验证Apache现在正在侦听8080。

代码语言:javascript
复制
sudo netstat -tlpn

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

代码语言:javascript
复制
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的支持。

第三步 - 配置Apache以使用mod_fastcgi

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

注意 :如果您在使用mod_php的现有LAMP安装上尝试本教程,请先使用以下命令将其禁用:

代码语言:javascript
复制
sudo a2dismod php7.0

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

代码语言:javascript
复制
sudo a2enmod actions

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

代码语言:javascript
复制
sudo nano /etc/apache2/mods-enabled/fastcgi.conf

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

代码语言:javascript
复制
 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所做的更改并进行配置测试。

代码语言:javascript
复制
sudo apachectl -t

如果显示语法OK,则重新加载Apache。 如果您看到警告无法可靠地确定服务器的完全限定域名,请使用127.0.1.1。 全局设置'ServerName'指令以禁止显示此消息。这没关系。 它现在不影响我们。

代码语言:javascript
复制
sudo systemctl reload apache2

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

第四步 - 验证PHP功能

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

代码语言:javascript
复制
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文件。

第五步 - 为Apache创建虚拟主机

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

代码语言:javascript
复制
sudo mkdir -v /var/www/{foobar.net,test.io}

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

代码语言:javascript
复制
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是否正确配置。

代码语言:javascript
复制
echo "<?php phpinfo(); ?>"| sudo tee /var/www/foobar.net/info.php
echo "<?php phpinfo(); ?>"| sudo tee /var/www/test.io/info.php

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

代码语言:javascript
复制
sudo nano /etc/apache2/sites-available/foobar.net.conf

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

代码语言:javascript
复制
<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中设置虚拟主机的完整教程,请参阅如何在CentOS 7上设置Apache虚拟主机

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

代码语言:javascript
复制
sudo nano /etc/apache2/sites-available/test.io.conf
代码语言:javascript
复制
<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命令启用站点。这将在启用站点的目录中创建指向虚拟主机文件的符号链接。

代码语言:javascript
复制
sudo a2ensite foobar.net
sudo a2ensite test.io

再次检查Apache的配置错误。

代码语言:javascript
复制
sudo apachectl -t

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

代码语言:javascript
复制
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端口上托管了两个网站。

第六步 - 安装和配置Nginx

在这一步中,我们将安装Nginx并配置域example.com和sample.orgNginx的虚拟主机。

使用包管理器安装Nginx。

代码语言:javascript
复制
sudo apt-get install nginx

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

代码语言:javascript
复制
sudo rm /etc/nginx/sites-enabled/default

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

代码语言:javascript
复制
sudo mkdir -v /usr/share/nginx/{example.com,sample.org}

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

代码语言:javascript
复制
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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/example.com

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/sample.org

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

代码语言:javascript
复制
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目录的符号链接来启用这两个站点。

代码语言:javascript
复制
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配置测试:

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo systemctl reload nginx

现在,访问http://example.com/info.phphttp://sample.org/info.php,在Web浏览器中访问Nginx虚拟主机的phpinfo()文件。 再看一下PHP Variables部分。

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

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

第七步 - 为Apache的虚拟主机配置Nginx

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

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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/apache

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

代码语言:javascript
复制
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;
    }
}

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

代码语言:javascript
复制
sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

进行配置测试:

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo systemctl reload nginx

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

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

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

第八步 - 安装和配置mod_rpaf

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

安装构建模块所需的包:

代码语言:javascript
复制
sudo apt-get install unzip build-essential apache2-dev

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

代码语言:javascript
复制
wget https://github.com/gnif/mod_rpaf/archive/stable.zip

用以下内容提取:

代码语言:javascript
复制
unzip stable.zip

切换到工作目录。

代码语言:javascript
复制
cd mod_rpaf-stable

然后编译并安装模块。

代码语言:javascript
复制
make
sudo make install

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

代码语言:javascript
复制
sudo nano /etc/apache2/mods-available/rpaf.load

将以下行添加到文件中:

代码语言:javascript
复制
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

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

代码语言:javascript
复制
sudo nano /etc/apache2/mods-available/rpaf.conf

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

代码语言:javascript
复制
<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 - 更新vhost名称,以便ServerName和ServerAlias工作。
  • RPAF_SetHTTPS -HTTPS根据包含的值设置环境变量X-Forwarded-Proto
  • RPAF_SetPort - 设置SERVER_PORT环境变量。当Apache位于SSL代理之后时非常有用。

保存rpaf.conf并启用该模块。

代码语言:javascript
复制
sudo a2enmod rpaf

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

代码语言:javascript
复制
sudo apachectl -t

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

代码语言:javascript
复制
sudo systemctl reload apache2

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

第九步 - 设置HTTPS网站(可选)

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

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

代码语言:javascript
复制
sudo mkdir /etc/nginx/ssl

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

代码语言:javascript
复制
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

每次都会提示您输入证书标识详细信息。 每次为公共名称输入适当的域。

代码语言:javascript
复制
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 []:

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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/apache

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

代码语言:javascript
复制
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,它是安全站点的默认端口。

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

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo systemctl reload nginx

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

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

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

第十步 - 阻止对Apache的直接访问(可选)

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

代码语言:javascript
复制
sudo iptables -I INPUT -p tcp --dport 8080!-s your_server_ip -j REJECT --reject-with tcp-reset

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

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

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

第十一步 - 使用Nginx提供静态文件(可选)

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

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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/apache

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

代码语言:javascript
复制
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;第九步中的行和其他SSL设置。

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

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

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

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo service nginx reload

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

代码语言:javascript
复制
sudo tail -f /var/log/apache2/other_vhosts_access.log

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

代码语言:javascript
复制
 test.io:80 your_server_ip --[01/Jul/2016:18:18:34-0400]"GET /info.php HTTP/1.0"20020414"-""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 CVM,其中Nginx服务于example.comsample.org,以及Apache服务foobar.nettest.io. 虽然Nginx充当Apache的反向代理,但Nginx的代理服务是透明的,与Apache域的连接似乎直接来自Apache本身。 您可以使用此方法来提供安全和静态站点。

更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Configure Nginx as a Web Server and Reverse Proxy for Apache on One Ubuntu 16.04 Server》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步 - 安装Apache和PHP-FPM
  • 第二步 - 配置Apache和PHP-FPM
  • 第三步 - 配置Apache以使用mod_fastcgi
  • 第四步 - 验证PHP功能
  • 第五步 - 为Apache创建虚拟主机
  • 第六步 - 安装和配置Nginx
  • 第七步 - 为Apache的虚拟主机配置Nginx
  • 第八步 - 安装和配置mod_rpaf
  • 第九步 - 设置HTTPS网站(可选)
  • 第十步 - 阻止对Apache的直接访问(可选)
  • 第十一步 - 使用Nginx提供静态文件(可选)
  • 结论
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档