如何使用apache作为Debian 8上mod_proxy的反向代理

・1 分钟阅读

介绍

反向代理是一种代理服务器,它接受HTTP(S)请求,并且透明地将它分发到一个或多个后端服务器,反向代理非常有用,因为许多现代web应用程序都不直接访问后端应用服务器,而是使用反向代理来处理HTTP请求。

除了可以使用反向代理来阻止直接访问这些底层应用程序服务器,还可以用于将负载从传入请求分发到若干不同的应用服务器,从而提高性能,并提供失败安全性,可以为应用服务器提供的额外的功能(例如,缓存,压缩或SSL加密)。

在本教程中,你将使用mod_proxy扩展将Apache设置为基本反向代理,以便将传入的连接重定向到同一个网络,本教程使用带有Flask网页框架的简单后端,但是你可以使用你喜欢的后端服务器。

前提条件

要遵循本教程,你需要:

一台Debian 8服务器,通过以下步骤1在服务器上安装了Apache 2,如何在Debian 8上安装Linux,apache,mysql,php (LAMP )堆栈

步骤1启用必要的apache模块

mod_proxy,用于重定向连接的主要代理模块Apache模块; 它允许Apache充当底层应用服务器的网关
mod_proxy_http,添加对代理HTTP连接的支持
mod_proxy_balancermod_lbmethod_byrequests,为多个后端服务器增加负载平衡功能,

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


sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

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


sudo systemctl restart apache2

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

步骤2创建后端测试服务器

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

注意:在非测试设置中,后端服务器通常都返回相同类型的内容,但是,对于这个测试,让两个服务器返回不同的消息使得检查负载均衡机制使用两个服务器都是很容易的。

flask是用于构建web应用程序的python微框架,因为基本应用只需要几行代码,所以,使用Flask来创建测试服务器,你不需要懂python。

首先更新软件包列表。


sudo apt-get update

然后安装Pip,推荐的python软件包管理器。


sudo apt-get -y install python3-pip

使用Pip安装Flask 。


sudo pip3 install flask


nano ~/backend1.py

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

~/backend1.py

from 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

~/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_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的配置文件,以便让它成为反向代理。

步骤3修改默认配置以启用反向代理

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


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

下面的例子说明了如何配置这个块为单个后端服务器反向代理,第二个是负载平衡反向代理。

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

VirtualHost块中的所有内容替换为以下内容,这样你的配置文件就会如下所示:

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

<VirtualHost *:80>
 ProxyPreserveHost On

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

如果你拥有自己的应用程序服务器,请使用它的地址。

这里有三个指令:

ProxyPass是主代理配置指令,例如,如果Apache获得了/example的请求,它将连接到,http://your_backend_server/example 并返回对原始客户端的响应,ProxyPassReverse应该与ProxyPass有相同的配置,这确保后端服务器返回位置重定向头,客户端浏览器将重定向到代理地址而不是后端服务器地址,

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


sudo systemctl restart apache2

http://your_server_ip

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

如果有多个后端服务器,那么在代理使用mod_proxy的负载平衡特性时分布流量是一种好方法。

VirtualHost块中的所有内容替换为以下内容,这样你的配置文件就会如下所示:

/etc/apache2/sites-available/000-default.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的负载均衡器池而不是特定的服务器。

如果遵循步骤2中的例子服务器,请对BalancerMember指令使用127.0.0.1:8080127.0.0.1:8081,如上面的块所示,如果你拥有自己的应用程序服务器,请使用它的地址。

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


sudo systemctl restart apache2

http://your_server_ip 可以看到反向代理工作,并且在两台服务器之间进行负载均衡。

结束语

现在你知道如何将Apache设置为一个或多个底层应用程序服务器的反向代理。

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

用于FTP的mod_proxy_ftp
用于SSL隧道的mod_proxy_connect
用于AJP (JServ协议)的mod_proxy_ajp,如基于tomcat的后端
用于web sockets的mod_proxy_wstunnel

要了解有关mod_proxy的更多信息,你可以阅读Apache mod_proxy官方文档

讨论
杨和超 profile image