什么是反向代理?反向代理服务器是位于后端服务器前面的中间连接点,它将客户端请求路由到这些服务器,并确保没有客户端直接与后端通信。这与转发代理不同,在转发代理中,代理位于客户端前面,并充当客户端和源服务器之间的中介。反向代理就像一个实际的端点,为您的系统提供额外的安全和控制层。
有哪些反向代理用例?
反向代理是基本的系统管理概念之一,可以帮助您提高系统的可伸缩性、性能、弹性和安全性。让我们来看看一些最流行的反向代理用例。
- 负载平衡。反向代理可以充当负载平衡器,在不同服务器池之间分配传入请求。它可能使用循环法、最少连接数、最少响应时间或其他一些算法来路由传入请求并使您的整个系统更快、更有弹性。如果服务器出现故障,您的反向代理负载平衡器会将流量重定向到其余的在线服务器。
- 匿名。反向代理在将所有请求传输到后端服务器之前拦截所有请求。这样你的后端服务器永远不需要透露他们的 IP 地址,只能通过反向代理访问,这使得直接攻击它们变得更加困难。
- 交通清洗。反向代理服务器可能安装了一些流量控制机制来过滤恶意或不需要的请求并防止它们到达您的后端服务。您可以使用防火墙、防病毒系统或任何其他应用程序内容检查机制来加强系统安全性。
- 缓存。反向代理服务器可以存储经常访问的静态或动态 Web 内容,以更快地提供服务并减轻后端服务器的负载。
- SSL 加密。加密和解密 TLS 流量的计算量很大。反向代理可以负责 SSL 加密,以减轻后端服务器的工作负担。
- 内容压缩。使用反向代理,您可以压缩入站和出站数据,使客户端和后端服务器之间的通信更快。
- A/B 测试。A/B 测试可以在浏览器、Web 应用程序或后端层上执行。使用反向代理,您可以实施后端层 A/B 测试并将传入流量随机分配到运行不同版本应用程序的服务器。
先决条件
在我们开始之前,您需要:
- 使用 sudo 权限访问 Linux 服务器。我们将使用 Ubuntu 20.04,但您可以选择不同的发行版。
- 指向您的服务器 IP 地址的域名,用于配置 SSL 证书。您可以使用每台服务器免费提供的自定义 Cherry Servers 子域名。
安装阿帕奇
在本指南中,我们将使用 Apache Web 服务器来创建反向代理的工作概念。Apache 带有一些方便的扩展模块,支持反向代理解决方案。
首先,连接到您的服务器并从 APT 存储库更新本地包索引:
sudo apt update
现在让我们apache2从官方 Ubuntu 20.04 存储库安装软件包:
sudo apt install -y apache2
安装完成后,您可以通过检查其版本来验证 Apache 是否已安装:
apache2 -version
也可以apache2使用以下命令检查状态:
sudo systemctl status apache2
如您所见,apache2 在您安装后立即处于活动状态并正在运行。您可以通过请求默认的 Apache 索引页面来执行抽查以验证它是否按预期工作。只需在网络浏览器中输入服务器的 IP 地址,然后按回车键:
如果您不知道自己的 IP 地址,请使用以下命令获取它:
hostname -I
此命令将显示计算机上可用的所有网络接口上的所有已配置 IP 地址,包括公共网络接口的 IP 地址。
为反向代理启用 Apache 模块
要将反向代理与 Apache Web Server 一起使用,您需要启用特定的 Apache 模块以支持反向代理服务器所需的附加功能。我们的场景需要以下模块:
- mod_proxy:它是 Apache 的主要代理模块,用于管理连接和重定向它们。它允许 Apache 充当底层后端服务器的网关。该模块对于所有反向代理场景都是必需的。
- mod_proxy_http:此模块依赖于 mod_proxy 并且需要支持对代理服务器的 HTTP 和 HTTPS 请求。
- mod_ssl:该模块为 Apache HTTP 服务器提供 SSL v3 和 TLS v1.x 协议支持。
现在让我们使用a2enmod命令启用这些模块:
sudo a2emod proxy && sudo a2enmod proxy_http && a2enmod ssl
每次启用新的 Apache 模块时,不要忘记重新启动 apache2 服务器:
sudo systemctl restart apache2
您可以使用以下命令验证这些模块是否处于活动状态:
apache2ctl -M
配置 Apache 反向代理
现在是时候配置 Apache 反向代理以接受来自 Internet 的请求并将它们转发到您选择的资源。您可以将反向代理请求转发到任何您想要的地方,包括其他服务器,但我们将使用本地网络用于教育目的。
000-default.conf首先,让我们使用以下命令禁用默认的 Apache 虚拟主机配置文件:
sudo a2dissite 000-default.conf
现在使用以下配置文本cherry.conf在目录中创建一个新的虚拟主机配置文件:/etc/apache2/sites-available
<VirtualHost *:80> ServerName site1.com ServerAlias www.site1.com ServerAdmin postmaster@site1.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off </VirtualHost>
<VirtualHost>我们使用包含 IP 地址和 Apache 为该虚拟主机接受的端口号的命令开始我们的配置文件。在这种情况下使用元字符*,因为所有 IP 地址都被接受,而端口号80代表默认的 HTTP 端口。配置继续以下项目:
- ServerName:定义与服务器关联的域名。/etc/hosts如果您想通过关联的域名访问您的服务器,您可以通过 DNS 在 Internet 上配置它或通过文件在本地设置它。
- ServerAlias:允许您定义将被服务器接受的其他名称。
- ServerAdmin:服务器在返回给客户端的错误消息中包含的联系人电子邮件地址。
- ErrorLog:设置 Apache 用来存储它遇到的任何错误的文件的名称。
- CustomLog:设置 Apache 用于将客户端请求记录到服务器的文件的名称。
- ProxyPass:将远程服务器映射到本地服务器的空间。定义流量重定向的目标地址。
- ProxyPassReverse:代理服务器不仅可以接收请求,还可以将响应数据包转发回客户端。命令用代理服务器的信息重写后端服务器的ProxyPassReverse原始location和HTTP 响应标头。这对于避免绕过反向代理并将后端服务器与 Internet 隔离至关重要。content-locationuri
- ProxyRequests:防止 Apache HTTP 服务器被用作转发代理并使其更安全。ProxyRequests使用时通常应将该命令设置为关闭ProxyPass。
保存配置文件并使用以下命令启用新的虚拟主机:
sudo a2ensite cherry.conf
配置完成后,不要忘记重新启动 apache2 以激活更改:
sudo systemctl restart apache2
配置 Flask 应用程序
您的反向代理配置现已完成,但我们仍然缺少一个将在端口 8080 上侦听的 Web 应用程序,因为我们的ProxyPass指令将传入请求转发到此目的地。
为此,我们可以使用一个简单的 Flask 应用程序。让我们先安装 python3 和 pip 包管理器:
sudo apt install python3 python3-pip
安装完成后,继续通过pip安装Flask:
pip3 install flask
现在我们准备创建一个简单的 Flask Web 应用程序。让我们称之为app.py:
vim app.py
在下面的 Python 代码中,我们导入 Flask 库,实例化 Flask 应用程序并在“/”路由上调用 index() 函数:
from flask import Flask app = Flask(__name__) @app.route(“/”) def index(): return “Apache reverse proxy is working!”
将 Python 脚本保存在您的工作目录中,并将 FLASK_APP 环境变量设置为 app.py,以便 Flask 知道在哪里实例化您的 Web 应用程序:
FLASK_APP=app.py
现在您已准备好运行您的 Flask 应用程序。让我们通过将标准输出和标准错误输出重定向到文件来作为后台作业在端口 8080 上运行它/dev/null以保持我们的终端清洁:
flask run --port=8080 > /dev/null 2 > &1 &
现在打开浏览器并尝试通过标准 HTTP 80 端口连接到您的 IP 地址:
您刚刚向 IP 地址上的端口 80 发送了一个 HTTP GET 请求,并且您的请求已被 Apache 反向代理转发到端口 8080,您的 Flask 应用程序在此处发回响应。恭喜,您的 Apache 反向代理配置正在运行!
配置 SSL 证书
通常,您希望对您的应用程序流量进行 SSL 加密。您可以使用免费的 Let's Encrypt TLS 证书使用 Apache 反向代理配置 SSL/TLS 加密。
首先,安装允许您自动颁发和安装证书的 Certbot ACME 客户端:
sudo apt install certbot
接下来,为 Certbot 安装 Apache 插件以简化安装过程:
sudo apt install python3-certbot-apache
Let's Encrypt 不会为没有域名的服务器颁发 TLS 证书。要继续配置证书,您需要从任何域名提供商处购买域名并将其指向您服务器的 IP 地址。或者,您可以使用自定义 DNS 名称,该名称可以在 Cherry Servers 为每台服务器设置。
为此,请转到您的客户端,访问服务器的网络选项,然后按管理 IP 上的“编辑地址”按钮:
您现在可以输入自定义 DNS 名称并按更新:
这样做之后,子域名reverse-proxy.cloud.cherryservers.net将可用于您的服务器。您现在可以使用此子域名而不是 IP 地址来查询它:
您还应该将此子域名添加到您的 cherry.conf 配置文件中:
<VirtualHost *:80> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net […] </VirtualHost>
现在您可以使用以下命令开始 TLS 证书配置:
sudo certbot --apache
首先,您将被要求输入您将接收续订和安全通知的电子邮件地址:
接下来,您需要阅读并同意 Let's Encrypt 服务条款:
决定您是否愿意接收来自 Let's Encrypt 的新闻和产品更新:
Certbot 将自动从您的 Apache 虚拟主机配置文件中读取 ServerName 和 ServerAlias 变量。选择要用于 HTTPS 查询的正确域名并继续安装:
Certbot 现在将为 SSL 连接创建一个新的 Apache 虚拟主机并为您生成证书。
最后,系统会询问您是否要自动将所有 HTTP 流量重定向到 HTTPS。为了简单起见,选择No redirect:
就是这样——您现在拥有一个功能齐全的 Apache 反向代理,带有 SSL 加密!您现在可以通过安全的 HTTPS 连接访问您的 Web 代理服务器:
?专业提示:您可以通过在一行中使用 Certbot 和一些强制参数来进一步简化 TLS 证书安装:
sudo certbot --apache --non-interactive --agree-tos -m mantas.levinas@cherryservers.com -d reverse-proxy.cloud.cherryservers.net
如果您想更深入地了解 Certbot 做了什么,请随时查看新创建的 Apache 虚拟主机:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net ServerAdmin mantas.levinas@cherryserers.com ErrorLog ${APACHE_LOG_DIR}/erro.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off SSLCertificateFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
您可以看到 Apache 检查您是否有可用的 mod_ssl,如果有,它会使用给定的虚拟主机配置来接受通常为 HTTPS 流量保留的端口 443 上的所有 IP 地址。
虚拟主机几乎是我们原始配置的副本,cherry.conf但多了三行。它包括对 SSL 证书文件的引用并导入 SSL 配置文件以使用一些必需的 SSL 设置来补充您的虚拟主机配置。
结论
在本文中,我们了解了什么是反向代理及其使用方法。我们还建立了 Apache 反向代理的工作概念,使用 SSL 加密来提供额外的安全层。您可以使用 Apache Web Server 构建更多的反向代理用例,所以请不要犹豫,在Apache 官方文档页面上了解更多关于这个基本系统工程概念的信息。