如何在CentOS 7上用mod_proxy将Apache设置为反向代理

介绍

反向代理是一种代理服务器,它接受HTTP(S)的请求后,把它们发送到一个或多个后端服务器。反向代理非常有用,因为许多现代网络应用使用后端应用程序服务器处理传入的HTTP请求,后端应用程序服务器并非直接由用户访问,并且通常仅支持基本的HTTP功能。

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

在本教程中,您将使用mod_proxy扩展将Apache设置为基本反向代理,以将传入连接重定向到在同一网络上运行的一个或多个后端服务器。本教程使用由Flask Web框架编写的简单后端,但您可以使用其他任何后端服务器。

准备

要学习本教程,您需要:

  • 一个CentOS 7服务器,包括一个可以使用sudo命令的非root用户。
  • 在服务器上安装Apache 2 。
  • (可选)用yum install nano安装的nano文本编辑器。虽然CentOS 自带vi文本编辑器,但nano更好用。

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

第一步,设置必要的Apache模块

使用Apache作为反向代理所需的模块包括mod_proxy及其几个附加模块,这些模块扩展了其功能以支持不同的网络协议。具体来说,我们将使用:

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

默认情况下,新安装的CentOS 7中会默认启用这四个模块。您可以通过运行下面的程序来验证它们是否已启用:

$ httpd -M

命令输出将列出所有已启用的Apache模块。看看能否找到上面提到的四个模块:

. . .
 proxy_module (shared)
. . . 
 lbmethod_byrequests_module (shared)
. . . 
 proxy_balancer_module (shared)
. . . 
 proxy_http_module (shared)
. . . 

如果有未启用的模块,你可以用nano打开/etc/httpd/conf.modules.d/00-proxy.conf来启动:

$ sudo nano /etc/httpd/conf.modules.d/00-proxy.conf

并通过从每行开头删除#来取消注释必要模块的行,使得文件如下所示:

/etc/httpd/conf.modules.d/00-proxy.conf. . . LoadModule proxy_module modules/mod_proxy.so . . . LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so . . . LoadModule proxy_balancer_module modules/mod_proxy_balancer.so . . . LoadModule proxy_http_module modules/mod_proxy_http.so . . . 要使更改生效,请保存文件并重新启动Apache。

$ sudo systemctl restart httpd

现在,Apache已准备就绪。在下一步中,我们将创建两个非常基本的后端服务器。这些将帮助我们验证配置是否正常工作,但如果您已有自己的后端应用程序,则可直接跳到步骤3。

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

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

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

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

让我们先安装IUS包存储库文件。IUS(Inline with Upstream Stable)是一个社区项目,它为CentOS提供最新版本的精选软件,包括Python 3。

$ sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm

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

$ sudo yum -y install python35u python35u-pip

使用Pip安装Flask。

$ sudo pip3.5 install flask

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

$ nano ~/backend1.py

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

〜/ backend1.pyfrom flask import Flask app = Flask(__name__)@app.route('/') def home(): return 'Hello world!'前两行初始化Flask框架。有一个函数home(),它可以返回一行文本(Hello world!)。home()函数定义上面的@app.route('/')是告诉Flask使用home()的返回值,作为对/root URL指导下的HTTP请求的响应。

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

$ cp ~/backend1.py ~/backend2.py

打开新复制的文件。

$ nano ~/backend2.py

把Hello world!改成Howdy world!,然后保存并关闭该文件。

〜/ backend2.py

from flask import Flask
app = Flask(__name__)

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

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

$ FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &

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

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

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

$ FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &

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

$ curl http://127.0.0.1:8080/

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

# curl http://127.0.0.1:8081/

这次将输出Howdy world!

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

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

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

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

注意:在本教程中,我们将在虚拟主机级别应用配置。在Apache的默认安装中,没有配置虚拟主机。我们将创建一个可以捕获所有流量的单个默认虚拟主机。但是,您也可以在其他虚拟主机中使用所有这些配置碎片。

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

创建新的默认虚拟主机,用nano或您喜欢的文本编辑器在/etc/httpd/conf.d目录中创建新的空的Apache配置文件来。

$ sudo nano /etc/httpd/conf.d/default-site.conf

下面的第一个示例说明如何为单个后端服务器配置默认虚拟主机以反向代理,第二个示例为多个后端服务器设置负载平衡反向代理。

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

将以下内容粘贴到default-site.conf文件中,然后您的配置文件如下所示:

/etc/httpd/conf.d/default-site.conf

<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。

$ sudo systemctl restart httpd

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

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

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

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

/etc/httpd/conf.d/default-site.conf

<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://mycluster(名称可以自由更改),由一个或多个BalancerMember组成,它们会指定后端服务器地址。ProxyPassProxyPassReverse指令使用的是名为mycluster的负载均衡器池,而不是特定的服务器。

如果您使用的是第二步中的示例服务器,那么就用上述127.0.0.1:8080127.0.0.1:8081作为BalancerMember指示。如果您有自己的应用程序服务器,请改用其地址。

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

$ sudo systemctl restart httpd

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

结论

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

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

  • mod_proxy_ftp 用于FTP。
  • mod_proxy_connect用于SSL网络隧道。
  • mod_proxy_ajp 用于AJP(Apache JServ协议),例如基于Tomcat的后端。
  • mod_proxy_wstunnel 用于双向信息传输。

腾讯云也提供基于CentOS快速搭建OpenResty基于CentOS搭建Python Django环境等等相关实验,欢迎在线使用。


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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

玩转linux只需要几个命令

linux一说都是搞开发玩的,敲敲键盘就能完成所有的工作。其实你也可以这么玩,玩游戏的除外哦。 那我们就来侃侃如何玩,linux是命令的天下,高级的命令那是相...

3719
来自专栏Java后端技术栈

使用Redis存储Nginx+Tomcat负载均衡集群的Session

环境:Cent OS 7.0(虚拟机环境)、Nginx 1.9.8、Redis 3.2.1

962
来自专栏雨过天晴

原 PHPStrom 9系列激活码

1804
来自专栏应用案例

Nginx+Tomcat 配置负载均衡集群

目的: 同一个项目部署到多个tomcat中,共用80端口。停掉其中任何一个(只要服务有一个在运行),都不会影响用户的使用。 一、项目准备 准备Java项目测试包...

25410
来自专栏黑泽君的专栏

【MyEclipse】我们导入的jar包后, 一般没有关联源码, 需要手动进行关联!推荐这种方式。

985
来自专栏云计算教程系列

如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

Redis是一个开源键值缓存和存储系统,由于其对多种数据类型(如散列,列表,集合和位图等)的高级支持,也称为数据结构服务器。它还支持群集,使其在高度可用和可扩展...

1373
来自专栏Django中文社区

注销和页面跳转

当用户想切换登录账号,或者想退出登录状态时,这时候就需要注销已登录的账号。现在我们来为网站添加注销登录的功能,这个功能 Django 也已经为我们提供,我们只需...

4959
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装Munin监视工具

Munin是一个系统,网络和基础设施监控应用程序,通过Web浏览器以图形形式提供信息。它是围绕客户端 - 服务器架构设计的,可以配置为监控它所安装的机器(Mun...

970
来自专栏zhisheng

Pycharm连接Github

绑定账号 1、File->Settings->Version Control->Github ? Settings.png 会出现github,然后在旁边输入你...

3657
来自专栏云计算教程系列

在腾讯云CVM上安装Apache

Apache HTTP服务器是世界上使用最广泛的Web服务器。它提供了许多强大的功能,包括可动态加载的模块,强大的媒体支持以及与其他流行软件的广泛集成。

3567

扫码关注云+社区

领取腾讯云代金券