介绍
反向代理服务器是一个类型的代理服务器,它采用HTTP(S)请求,并透明地将其分发到一个或多个后端服务器上。
您可以使用反向代理服务器来防止这些潜在的应用程序服务器被直接访问. 它们还可以用于将来自入口请求的负载分配到多个不同的应用程序服务器,从而提高性能,并提供安全性。
在本教程中,您将使用mod_proxy
扩展来设置Apache作为一个基本的反向代理,以将接入连接重定向到在同一网络上运行的一个或多个后端服务器。
前提条件
要遵循本教程,您将需要:
- 一台 CentOS 7 服务器安装了 此初始服务器设置教程,包括一个 sudo 非 root 用户
- Apache 2 安装在您的服务器上,通过遵循 如何安装 Linux, Apache, MySQL, PHP (LAMP) Stack on CentOS 7的步骤 1)。
- 可选的是与
yum install nano
安装的nano
文本编辑器。
步骤 1 – 引入必要的 Apache 模块
使用Apache作为反向代理程序所需的模块包括mod_proxy
本身和其几个附加模块,这些模块可以扩展其功能,以支持不同的网络协议。
mod_proxy
,主要的代理模块Apache模块,用于重定向连接;它允许Apache作为通道到底层应用程序服务器mod_proxy_http
,这增加了对代理HTTP连接的支持mod_proxy_balancer
和mod_lbmethod_byrequests
,为多个后端服务器添加负载平衡功能
所有四个模块都已在新的 CentOS 7 安装中默认启用,您可以通过运行以下操作来验证它们是否已启用:
1httpd -M
命令输出将列出所有启用的Apache模块,您正在寻找的四行是上述模块名称:
1[secondary_label Output]
2. . .
3 proxy_module (shared)
4. . .
5 lbmethod_byrequests_module (shared)
6. . .
7 proxy_balancer_module (shared)
8. . .
9 proxy_http_module (shared)
10. . .
如果模块未启用,您可以通过打开 /etc/httpd/conf.modules.d/00-proxy.conf
和 nano
来启用它们:
1sudo nano /etc/httpd/conf.modules.d/00-proxy.conf
和没有评论的行与必要的模块,通过从行开头删除#
标志,以便文件看起来如下:
1[label /etc/httpd/conf.modules.d/00-proxy.conf]
2. . .
3LoadModule proxy_module modules/mod_proxy.so
4. . .
5LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
6. . .
7LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
8. . .
9LoadModule proxy_http_module modules/mod_proxy_http.so
10. . .
要执行这些更改,请保存文件并重新启动 Apache。
1sudo systemctl restart httpd
Apache 现在已经准备好作为 HTTP 请求的反向代理服务器。下一步,我们将创建两个非常基本的后端服务器,这些服务器将帮助我们验证配置是否正常运行,但如果您已经拥有自己的后端应用程序(s),您可以跳过步骤 3。
步骤2:创建后端测试服务器
运行一些简单的后端服务器是一个简单的方法来测试您的Apache配置是否正常工作. 在这里,我们将制作两个测试服务器,以打印一行文本来响应HTTP请求。
<$>[注] **注:**在非测试设置中,后端服务器通常都返回相同类型的内容。
Flask 是一个 Python 微框架,用于构建 Web 应用程序. 我们正在使用 Flask 来创建测试服务器,因为一个基本的应用程序只需要几行代码. 你不需要知道 Python 来设置这些,但如果你想学习,你可以看看 这些 Python 教程。
IUS(Inline with Upstream Stable)是一个社区项目,将特定软件的最新版本带到CentOS,包括Python 3。
1sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
然后安装Python 3和Pip,推荐的Python包管理器。
1sudo yum -y install python35u python35u-pip
使用Pip来安装Flask。
1sudo pip3.5 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请求。
第二個後端伺服器與第一個完全相同,除了返回不同的文本行之外,所以開始重複第一個檔案。
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」上启动第一个背景服务器,这也将Flask的输出重定向到「/dev/null」,因为它会进一步启动控制台的输出。
1FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
在这里,我们通过在同一行中设置FLASK_APP
环境变量来先行flask
命令。环境变量是将信息传递到由壳产生的过程的一个方便的方式。
在这种情况下,使用环境变量确保该设置仅适用于正在运行的命令,并且不会随后保持可用,因为我们将以同样的方式传输另一个文件名,以便说‘flask’命令启动第二个服务器。
同样,使用此命令在端口「8081」上启动第二个服务器,请注意环境变量「FLASK_APP」的不同值。
1FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
您可以测试两个服务器是否使用curl
运行。
1curl http://127.0.0.1:8080/
这将输出 **Hello world!**在终端. 测试第二个服务器:
1curl http://127.0.0.1:8081/
这将输出 Howdy world! 相反。
<$>[注]
**注:在您不再需要它们之后关闭两个测试服务器,例如当您完成本教程时,您可以简单地执行 killall flask
。
在下一步中,我们将修改Apache的配置文件,以允许其作为反向代理程序使用。
步骤 3 — 更改默认配置以启用反向代理
在本节中,我们将设置默认的Apache虚拟主机作为单个后端服务器或负载均衡后端服务器的反向代理。
<$>[注] **注:在本教程中,我们正在应用虚拟主机级别的配置。在默认安装的Apache上,没有配置虚拟主机。我们将创建一个单一的默认虚拟主机,将捕捉所有流量。然而,您也可以在其他虚拟主机中使用所有这些配置片段。 有关Apache中的虚拟主机的更多信息,您可以阅读本教程。
如果您的 Apache 服务器作为 HTTP 和 HTTPS 服务器,则您的反向代理配置必须放在 HTTP 和 HTTPS 虚拟主机中。 若要了解更多关于 SSL 与 Apache 的信息,您可以阅读本教程。
创建新的默认虚拟主机,在 /etc/httpd/conf.d 目录中使用
nano' 或您最喜欢的文本编辑器创建一个新的空白的 Apache 配置文件。
1sudo nano /etc/httpd/conf.d/default-site.conf
下面的第一个示例解释了如何将默认的虚拟主机配置为单个后端服务器的反向代理,而第二个示例为多个后端服务器设置了负荷均衡的反向代理。
示例 1 — 反向代理单一后端服务器
将以下内容粘贴到 default-site.conf
文件中,以便您的配置文件看起来如下:
1[label /etc/httpd/conf.d/default-site.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>
如果您跟随了步骤 2 中的示例服务器,请使用127.0.0.1:8080
,如上文所述,如果您有自己的应用服务器,请使用他们的地址。
这里有三个指令:
*ProxyPreserveHost
使Apache将原始Host
标题传送到后端服务器,这很有用,因为它使后端服务器意识到用于访问应用程序的地址
*ProxyPass
是主要的代理配置指令。在这种情况下,它规定了根 URL(/
)下的所有东西都应该在给定的地址上地图到后端服务器。例如,如果Apache收到对应用程序的/example
的请求,它将连接到http://your_backend_server/example
并返回原始客户端的响应
*ProxyPassReverse
应该具有与ProxyPass
相同的配置。它告诉Apache从后端服务器修改响应标题。这确保
要执行这些更改,请重新启动 Apache。
1sudo systemctl restart httpd
现在,如果您在网页浏览器中访问http://your_server_ip
,您将看到您的后端服务器响应,而不是标准的Apache欢迎页面。
示例 2 – 跨多个后端服务器的负载平衡
如果您有多个后端服务器,在代理时分配流量的一种好方法是使用mod_proxy
的负载平衡功能。
将VirtualHost
块中的所有内容替换为以下内容,以便您的配置文件看起来像这样:
1[label /etc/httpd/conf.d/default-site.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>
配置与前一种类似,但而不是直接指定一个单一的后端服务器,我们已经使用了一个额外的代理
块来定义多个服务器. 该块被命名为balancer://mycluster
(名称可以自由更改),并由一个或多个BalancerMember
组成,其中指定了潜在的后端服务器地址。
如果您遵循了步骤 2 中的示例服务器,则使用127.0.0.1:8080
和127.0.0.1:8081
作为BalancerMember
指令,如上文所述。
要执行这些更改,请重新启动 Apache。
1sudo systemctl restart httpd
如果您在网页浏览器中访问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文档。