前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Debian 8上用mod_proxy将Apache设置为反向代理

如何在Debian 8上用mod_proxy将Apache设置为反向代理

原创
作者头像
你在哪里
发布2018-07-25 14:45:17
1.1K0
发布2018-07-25 14:45:17
举报
文章被收录于专栏:云计算教程系列

介绍

reverse proxy(反向代理是一种代理服务器,它接收HTTP(S)请求并将它们透明地分发到一个或多个后端服务器。反向代理非常实用,因为许多现代Web应用程序是使用后端应用程序服务器处理传入的HTTP请求,并非直接由用户访问,并且通常只支持基本的HTTP功能。

您可以使用反向代理来防止直接访问这些应用程序服务器。它们还可用于将传入请求的负载分配到多个不同的应用程序服务器,从而大规模提高性能并减少故障。它们可以填补应用程序服务器不能提供的功能空白,例如缓存,压缩或SSL加密。

在本教程中,您将使用mod_proxy扩展将Apache设置为基本反向代理,以将传入连接重定向到在同一网络上运行的一个或多个后端服务器。

准备

要学习本教程,您需要:

  • 一个Debian 8服务器。
  • 在服务器上安装Apache 2 。

没有Debian 服务器的用户可以购买和使用腾讯云服务器

第一步,启用必要的Apache模块

有许多与Apache捆绑的模块,这些模块可用,但在新安装中并未启用。首先,我们需要启用我们将在本教程中所需的那些模块。

我们需要mod_proxy和它的几个附加模块,这些模块扩展了其功能以支持不同的网络协议。具体来说,我们将使用:

  • mod_proxy,Apache的主要代理模块,用于重定向连接,使Apache充当应用程序服务器的网关。
  • mod_proxy_http,用于支持代理HTTP连接。
  • mod_proxy_balancermod_lbmethod_byrequests为多个后端服务器添加负载平衡功能。

要启用这四个模块,请连续执行以下命令。

代码语言:txt
复制
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_balancer
$ sudo a2enmod lbmethod_byrequests

要使这些更改生效,重新启动Apache。

代码语言:txt
复制
$ sudo systemctl restart apache2

现在,Apache已准备好充当HTTP请求的反向代理。在下一个(可选)步骤中,我们将创建两个非常基本的后端服务器。这些将验证配置是否正常工作,但如果您已有自己的后端应用程序,则可以跳到第三步。

第二步,创建后端测试服务器

运行一些简单的后端服务器是测试Apache配置是否正常工作的简便方法。在这里,我们将制作两个测试服务器,通过打印一行文本来响应HTTP请求。一台服务器会说Hello world!另一个会说Howdy world!

注意:在非测试设置中,后端服务器通常都返回相同类型的内容。但是,特别是对于此测试,让两台服务器返回不同的消息可以很容易地检查负载平衡机制是否同时使用这两种消息。

Flask是一个用于构建Web应用程序的Python微框架。我们使用Flask来创建测试服务器,因为基本应用程序只需要几行代码。您不需要知道Python来设置它们。

首先更新包列表。

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

然后安装推荐的Python包管理器Pip。

代码语言:txt
复制
$ sudo apt-get -y install python3-pip

使用Pip安装Flask。

代码语言:txt
复制
$ sudo pip3 install flask

现在已经安装了所有必需的组件,创建一个新文件,该文件将包含当前用户主目录中第一个后端服务器的代码。

代码语言:txt
复制
$ nano ~/backend1.py

将以下代码复制到该文件中,然后保存并关闭它。

代码语言:txt
复制
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello world!'

前两行初始化了Flask框架。这有一个函数home(),会返回一行文本(Hello world!)。在@app.route('/')上面的函数home()定义告诉Flask使用home()的返回值作为对指向/root URL的应用程序HTTP请求的响应。

第二个后端服务器与第一个后端服务器完全相同,除了返回不同的文本行,因此我们复制第一个文件。

代码语言:txt
复制
$ cp ~/backend1.py ~/backend2.py

打开新复制的文件。

代码语言:txt
复制
$ nano ~/backend2.py

更改信息从Hello world!Howdy world!,然后保存并关闭该文件。

〜/ backend2.py

代码语言:txt
复制
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Howdy world!'

使用以下命令在8080端口上启动第一个后台服务器。这也会将Flask的输出重定向到/dev/null,因为它会进一步使控制台输出变为云。

代码语言:txt
复制
$ FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &

在这里,我们在flask命令之前通过FLASK_APP在同一行中设置环境变量。

在这种情况下,使用环境变量确保该设置仅适用于正在运行的命令,之后将不再保持可用,因为我们将以相同的方式传递另一个文件名来告诉flask命令启动第二个服务器。

同样,使用此命令在8081端口上启动第二个服务器。请注意FLASK_APP环境变量的不同值。

代码语言:txt
复制
$ FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &

您可以测试两台服务器是否正在使用curl运行。测试第一台服务器:

代码语言:txt
复制
$ curl http://127.0.0.1:8080/

这将在终端输出Hello world!。测试第二台服务器:

代码语言:txt
复制
$ curl http://127.0.0.1:8081/

这将输出代替文本Howdy world!

注意:如果不再需要这两个测试服务器,您只需执行killall flask来关闭它们。

在下一步中,我们将修改Apache的配置文件,以使其可用作反向代理。

第三步,修改默认配置以启用反向代理

在本节中,我们将设置默认的Apache虚拟主机,作为单后端服务器或负载平衡后端服务器阵列的反向代理。

注意:在本教程中,我们将在虚拟主机级别应用配置。在Apache的默认安装中,只启用了一个默认的虚拟主机。但是,您也可以在其他虚拟主机中使用所有这些配置片段。

如果您的Apache服务器同时充当HTTP和HTTPS服务器,则必须将反向代理配置放在HTTP和HTTPS虚拟主机中。

使用nano或您喜欢的文本编辑器打开默认的Apache配置文件。

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

在该文件中,您将在第一行找到\<VirtualHost*:80>开始的块。下面的第一个示例说明了如何将此块配置为针对单个后端服务器的反向代理,第二个示例为多个后端服务器设置负载平衡的反向代理。

示例1 - 反向代理单个后端服务器

使用以下内容替换VirtualHost块中的所有内容,因此配置文件如下所示:

/etc/apache2/sites-available/000-default.conf

代码语言:txt
复制
<VirtualHost *:80>
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

如果您在步骤2中使用示例服务器,请使用127.0.0.1:8080块中所写的内容。如果您有自己的应用程序服务器,请改用其地址。

这里有三个指令:

  • ProxyPreserveHost使Apache将原始Host头传递给后端服务器。它会使后端服务器知道用于访问应用程序的地址,非常实用。
  • ProxyPass是主要的代理配置指令。在这种情况下,它指定根URL(/)下的所有内容都应映射到给定地址的后端服务器。例如,如果Apache收到请求/example,它将连接到http://your_backend_server/example并将响应给原始客户端。
  • ProxyPassReverse应与ProxyPass具有相同的配置。它告诉Apache修改后端服务器的响应头。这样可以确保如果后端服务器返回位置重定向标头,客户端的浏览器将重定向到代理地址,而不是后端服务器地址,因为会导致无法按预期工作。

要使这些更改生效,请重新启动Apache。

代码语言:txt
复制
$ sudo systemctl restart apache2

现在,如果您在Web浏览器中访问http://your_server_ip,您将看到后端服务器响应而不是标准的Apache欢迎页面。如果你按照第二步,这意味着你会看到Hellow world!

示例2 -跨多个后端服务器的负载平衡

如果您有多个后端服务器,那么在代理时分配流量的好方法是使用mod_proxy负载平衡功能。

使用以下内容替换VirtualHost块中的所有内容,配置文件如下所示:

/etc/apache2/sites-available/000-default.conf

代码语言:txt
复制
<VirtualHost *:80>
<Proxy balancer://mycluster>
    BalancerMember http://127.0.0.1:8080
    BalancerMember http://127.0.0.1:8081
</Proxy>

    ProxyPreserveHost On

    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
</VirtualHost>

配置与前一个配置类似,但我们没有直接指定单个后端服务器,而是使用了一个额外的Proxy块来定义多个服务器。该块被命名为balancer://myclusterBalancerMemberProxyPassProxyPassReversemycluster(名称可以自由更改),由一个或多个指定底层后端服务器地址的BalancerMembers组成。ProxyPassProxyPassReverse指示使用名为mycluster的负载平衡器池而不是指定的服务器。

如果您在第二步中使用示例服务器,请使用如上面的块所示的127.0.0.1:8080127.0.0.1:8081作为BalancerMember指令。如果您有自己的应用程序服务器,请改用其地址。

要使这些更改生效,请重新启动Apache。

代码语言:txt
复制
$ sudo systemctl restart apache2

如果您在Web浏览器中访问http://your_server_ip,您将看到后端服务器的响应,而不是标准的Apache页面。如果您按照第二步,多次刷新页面应会显示Hello world!Howdy world!。这意味着反向代理工作,并在两个服务器之间进行负载平衡。

结论

您现在知道如何将Apache设置为一个或多个应用程序服务器的反向代理。mod_proxy可以有效地用于为使用大量语言和技术编写的应用程序服务器配置反向代理,例如Python和Django或Ruby和Ruby on Rails。它还可用于平衡具有大量流量的站点的多个后端服务器之间的流量,或通过多个服务器提供高可用性,或者为本地不支持SSL的后端服务器提供安全的SSL支持。

虽然mod_proxy有mod_proxy_http是最常用的模块组合,但还有其他一些模块支持不同的网络协议。我们这里没有使用它们,但其他一些流行的模块包括:

  • mod_proxy_ftp 用于FTP。
  • mod_proxy_connect 用于SSL隧道。
  • mod_proxy_ajp 对于AJP(Apache JServ协议),就像基于Tomcat的后端一样。
  • mod_proxy_wstunnel 用于网络通信协议web sockets。

参考文献:《How To Use Apache as a Reverse Proxy with mod_proxy on Debian 8》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步,启用必要的Apache模块
  • 第二步,创建后端测试服务器
  • 第三步,修改默认配置以启用反向代理
    • 示例1 - 反向代理单个后端服务器
      • 示例2 -跨多个后端服务器的负载平衡
      • 结论
      相关产品与服务
      轻量应用服务器
      轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档