介绍
reverse proxy 是采用 HTTP(S)请求并透明地将其分发到一个或多个后端服务器的代理服务器类型,反向代理服务器是有用的,因为许多现代的Web应用程序使用后端应用程序服务器来处理接入的HTTP请求,这些服务器不应该被用户直接访问,而且通常只支持基本的HTTP功能。
您可以使用反向代理服务器来防止这些潜在的应用程序服务器被直接访问,它们还可以用于将来自入口请求的负载分配到多个不同的应用程序服务器,从而提高性能,并提供安全性,可以用应用程序服务器不提供的功能填补漏洞,如缓存,压缩或SSL加密。
在本教程中,您将使用mod_proxy
扩展来设置Apache作为一个基本的反向代理,以重定向接入连接到在同一网络上运行的一个或多个后端服务器。
前提条件
要遵循本教程,您将需要:
- 一台 Ubuntu 20.04 服务器安装了 此初始服务器设置教程,包括一个
sudo
非root用户和防火墙 - Apache 2 安装在您的服务器上,按照 如何在 Ubuntu 20.04 上安装 Apache Web Server 的 步骤 1 和 2。
步骤 1 – 启用必要的Apache模块
Apache有许多可用但未在新安装中启用的模块,首先,您需要启用您将在本教程中使用的模块。
您需要的模块是mod_proxy
本身和其几个附加模块,这些模块可以扩展其功能,以支持不同的网络协议。
mod_proxy
:用于重定向连接的主要代理模块. 它允许Apache作为向底层应用程序服务器的网关mod_proxy_http
:添加了对HTTP连接的代理支持mod_proxy_balancer
和mod_lbmethod_byrequests
:这些为多个后端服务器添加了负载平衡功能
要启用这四个模块,执行以下命令:
1sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
要执行这些更改,请重新启动 Apache:
1sudo systemctl restart apache2
Apache 现在已经准备好作为 HTTP 请求的反向代理服务器。在下一步的可选步骤中,您将创建两个基本的后端服务器,这些服务器将有助于验证配置是否正常工作,但如果您已经拥有自己的后端应用程序,您可以跳过 步骤 3。
步骤 2 — 创建后端测试服务器(推荐)
运行一些后端服务器可以帮助测试您的Apache配置是否正常工作. 在这里,您将创建两个测试服务器,通过打印一行文本来响应HTTP请求。
<$>[注] **注:**在现实世界的设置中,后端服务器通常都返回相同类型的内容。
这个步骤概述了如何使用Flask创建测试服务器,因为一个最小的应用程序只需要几行代码。你不需要知道Python来设置这些,但如果你想学习,你可以查看我们的系列在 如何在Python中编码 。
首先使用apt
更新包索引列表:
1sudo apt update
然后安装pip
,推荐的Python包管理器:
1sudo apt install python3-pip
接下来,使用pip
来安装Flask:
1sudo pip3 install Flask
现在所有所需的组件已安装,创建一个新的文件,其中将包含当前用户的主目录中的第一个后端服务器的代码。
1nano ~/backend1.py
将以下代码插入到文件中:
1[label ~/backend1.py]
2from flask import Flask
3app = Flask(__name__)
4
5@app.route('/')
6def home():
7 return 'Hello world!'
第一两行代码初始化了Flask框架.有一个函数,即home()
,返回一行文本(Hello world!
)。在home()
函数定义上面的@app.route('/')
行告诉Flask将home()
的返回值用作响应应用程序的/
根 URL的HTTP请求。
完成后,保存并退出文件. 如果您使用nano
,您可以通过按CTRL + X
,然后按Y
和ENTER
来做到这一点。
第二個後端伺服器與第一個伺服器完全相同,除了返回不同的文本行之外,因此,執行「cp」來將第一個檔案的內容「backend1.py」複製到「backend2.py」檔案:
1cp ~/backend1.py ~/backend2.py
现在,使用您喜爱的文本编辑器打开新复制的文件:
1nano ~/backend2.py
更新返回 **Hello world!**消息的消息,以读取 **Howdy world!**代替:
1[label ~/backend2.py]
2from flask import Flask
3app = Flask(__name__)
4
5@app.route('/')
6def home():
7 return 'Howdy world!'
完成更新后,保存并关闭文件。
接下来,使用以下命令在端口 8080
上启动第一个背景服务器。
1FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
在这里,您正在通过在同一行设置FLASK_APP
环境变量来先行flask
命令。 Environment variables 是将信息传递到由壳产生的过程的一个方便的方式。
在这种情况下,使用环境变量确保设置仅适用于正在运行的命令,并且不会随后保持可用,这是为了避免混淆,因为您将以同样的方式传输另一个文件名,以便告诉flask
命令启动第二个服务器。
同样,您要运行以下命令,以在端口 8081
上启动第二台服务器. 请注意环境变量 FLASK_APP
的不同值:
1FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
现在你可以通过使用curl
命令来测试这两个服务器是否正在运行。 开始测试第一个服务器。 这个命令使用curl
连接到127.0.0.1
,这是一个代表 localhost的特殊IP地址。
1curl http://127.0.0.1:8080/
这将打印来自服务器的以下响应:
1[secondary_label Output]
2Hello world!
接下来,测试第二个服务器:
1curl http://127.0.0.1:8081/
如前所述,这将打印服务器的预期响应:
1[secondary_label Output]
2Howdy world!
在下一步中,您将更改Apache的配置文件,以允许其作为反向代理的使用。
步骤 3 — 更改默认配置以启用反向代理
在本节中,您将设置默认的Apache虚拟主机作为单个后端服务器或负载均衡后端服务器的反向代理。
<$>[注] 注:在本教程中,您正在应用虚拟主机级别的配置。在默认安装的Apache上,只有一个默认的虚拟主机启用。
如果您的 Apache 服务器作为 HTTP 和 HTTPS 服务器,则您的反向代理配置必须放在 HTTP 和 HTTPS 虚拟主机中。 若要了解更多关于 SSL 与 Apache 相关的信息,您可以阅读我们的教程(How To Create a Self-Signed SSL Certificate for Apache in Ubuntu 20.04)(https://andsky.com/tech/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-20-04)教程。
使用您喜爱的文本编辑器打开默认的 Apache 配置文件:
1sudo nano /etc/apache2/sites-available/000-default.conf
在该文件中,您将找到从第一行开始的<VirtualHost *:80>
块,下面的第一个示例解释了如何为单个后端服务器配置逆向代理,第二个示例为多个后端服务器设置负荷均衡逆向代理。
示例 1 — 反向代理单一后端服务器
首先,替换VirtualHost
块中的所有内容,以便您的配置文件读取如下内容。如果您在 步骤 2中跟进了示例服务器,则使用127.0.0.1:8080
。
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3 ProxyPreserveHost On
4
5 ProxyPass / http://127.0.0.1:8080/
6 ProxyPassReverse / http://127.0.0.1:8080/
7</VirtualHost>
有三个指令代表,这里是他们正在做什么的简要概述:
ProxyPreserveHost
:使Apache将原始Host
标题传送到后端服务器。这很有用,因为它使后端服务器意识到用于访问应用程序的地址ProxyPass
:主要的代理配置指令。在这种情况下,它规定了根 URL(/
)下的一切都应该在给定的地址上地图到后端服务器。例如,如果Apache收到请求的/example
,它将连接到http://your_backend_server/example
,并返回回原始客户端的响应ProxyPassReverse
:应该具有与ProxyPass
相同的配置。它告诉Apache从后端服务器修改响应器。这确保如果
一旦你完成了添加此内容,保存和退出文件。
要执行这些更改,请重新启动 Apache:
1sudo systemctl restart apache2
现在,如果您在 Web 浏览器中访问 http://your_server_ip
,您将看到您的后端服务器响应,而不是标准的 Apache 欢迎页面。
示例 2 – 跨多个后端服务器的负载平衡
如果您有多个后端服务器,在代理时分配流量的一种好方法是使用mod_proxy
的负载平衡功能。
首先,使用您喜爱的文本编辑器打开默认的 Apache 配置文件:
1sudo nano /etc/apache2/sites-available/000-default.conf
现在,替换VirtualHost
中的所有内容,以便您的配置文件读取如下内容。 如果您跟随了 步骤 2中的示例服务器,则使用127.0.0.1:8080
和127.0.0.1:8081
为BalancerMember
指令。
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3<Proxy balancer://mycluster>
4 BalancerMember http://127.0.0.1:8080
5 BalancerMember http://127.0.0.1:8081
6</Proxy>
7
8 ProxyPreserveHost On
9
10 ProxyPass / balancer://mycluster/
11 ProxyPassReverse / balancer://mycluster/
12</VirtualHost>
配置与前一种类似,但而不是直接指定一个单一的后端服务器,这些指令是这样做的:
Proxy
:这个额外的Proxy
块被用来定义多个服务器. 该块被命名为balancer://mycluster
(名称可以自由更改),并由一个或多个BalancerMember
s 组成,其中指定了潜在的后端服务器地址.ProxyPass
和ProxyPassReverse:这些指令使用名为
mycluster` 的负载平衡池,而不是特定服务器。
如果您遵循了 步骤 2中的示例服务器,则使用127.0.0.1:8080
和127.0.0.1:8081
为BalancerMember
指令,如上文所述。
一旦你完成了添加此内容,保存和退出文件。
要执行这些更改,请重新启动 Apache:
1sudo systemctl restart apache2
如果您在网页浏览器中访问http://your_server_ip
,您将看到您的后端服务器的响应,而不是标准的Apache页面。
<$>[注]
**注:在您不再需要它们之后关闭两个测试服务器,例如当您完成本教程时,您可以执行杀死闪存
<$>
结论
现在你知道如何将Apache设置为对一个或多个潜在应用程序服务器的反向代理。‘mod_proxy’可以有效地用来配置对应用程序服务器的反向代理,以各种语言和技术编写,如Python和Django,或Ruby和Ruby on Rails。它也可以用来平衡大量流量网站的多个后端服务器之间的流量,通过多个服务器提供高可用性,或为不支持SSL的后端服务器提供安全SSL支持。
虽然mod_proxy
和mod_proxy_http
可能是最常用的模块组合,但还有其他一些支持不同的网络协议。
mod_proxy_ftp
for FTP(文件传输协议)。mod_proxy_connect
for SSL tunneling.mod_proxy_ajp
for AJP (Apache JServ Protocol),如基于Tomcat的后端mod_proxy_wstunnel
for web sockets.
要了解更多关于mod_proxy的信息,您可以阅读 Apache官方的mod_proxy文档。