使用 Apache 反向代理的设置技巧


Posted in Servers onJanuary 18, 2022

使用 Apache 反向代理的设置技巧

Apache 是一个多功能的 Web 服务器,它提供了完整的支持功能,其中一些是通过扩展来实现的。在本文中,我们将使用该mod_proxy模块将 Apache 配置为反向代理角色。

虽然 Apache 可能不是您作为反向代理的首选,但 NGINX 等更现代的替代方案往往会引起注意,mod_proxy但对于已经在运行 Apache 并且现在需要将流量路由到另一个服务的服务器很有用。您可以设置 Apache 虚拟主机将给定域的请求传递到单独的 Web 服务器。

出于本指南的目的,我们将 Apache 2.4 与基于 Debian 的系统一起使用。我们还将假设您想要代理流量的服务器已经可以从您的 Apache 主机通过网络访问。本文重点介绍基于唯一虚拟主机启用代理,但mod_proxy也可全局配置,作为 Apache 服务器配置的一部分,或通过.htaccess文件在目录级别进行配置。

启用代理模块

mod_proxy包含在默认的 Apache 安装中。现在a2enmod用于激活模块及其独立的 HTTP 组件:

sudo a2enmod proxy
sudo a2enmod proxy_http

这将 Apache 设置为支持代理到其他主机的 HTTP 连接。该模块使用ProxyApache 配置文件中的 -prefixed 指令进行配置。我们接下来会设置这些。

设置代理虚拟主机

让我们设置一个转发example.com到内部 IP 地址的虚拟主机192.168.0.1。您应该example.com将该点的 DNS 记录添加到您的 Apache 主机。

在这种情况下,代理允许访问者通过外部地址透明地访问您的内部 Web 服务器。Apache 充当将流量路由到其最终目的地的看门人。用户将看到example.com,即使 Apache 实际上是通过单独的服务器解析请求。

在里面添加一个新的虚拟主机文件/etc/apache2/sites-available,内容如下:

<VirtualHost *:80>
    ServerName example.com

    ProxyPass / http://192.168.0.1/ nocanon
    ProxyPassReverse / http://192.168.0.1/
</VirtualHost>

在ProxyPass与ProxyPassReverse指令指定的流量example.com应该被代理到192.168.0.1。可选nocanon关键字指示 Apache 将原始 URL 传递给远程服务器。如果没有这个关键字,Apache 会自动规范化 URL,这可能与某些服务器和框架不兼容。使用nocanon保证兼容性但会影响您的安全状况,因为它会禁用 Apache 针对基于 URL 的代理攻击的内置保护。

ProxyPassReverse必须提供以将您的配置区分为反向代理设置。Apache将使用所提供的URL重写Location,Content-Location和URI由后端发出的响应头。这确保了后续请求继续命中反向代理,而不是尝试直接到达内部服务器。

此配置将代理所有请求。您可以将代理限制到特定路径,例如/media通过调整ProxyPass和ProxyPassReverse指令:

ProxyPass /media http://192.168.0.1/
ProxyPassReverse /media http://192.168.0.1/

添加多个ProxyPass规则可让您使用一个虚拟主机在多个目标之间路由请求。规则按照它们编写的顺序进行匹配。如果您需要更复杂的路由行为,请改用该ProxyPassMatch指令。这等效于ProxyPass但将传入的 URL 与正则表达式匹配:

ProxyPassMatch ^/client/(.*)/images$ http://192.168.0.1/

保存您的虚拟主机文件并使用a2ensite命令启用它。这采用相对于sites-available目录的文件的基本名称:

sudo a2ensite example-proxy-vhost

重新启动 Apache 以应用您的更改:

sudo service apache2 restart

您的简单代理现在应该可以运行了。尝试访问example.com- 您应该会看到192.168.0.1. 该请求在您的 Apache 主机处终止,然后将其代理到您的内部服务器。

使用 SSL

上面的示例省略了 SSL。在生产工作负载中,您希望通过向 虚拟主机添加SSLCertificateFile和SSLCertificateKeyFile设置来进行设置。这些指定验证 SSL 连接时要使用的 SSL 证书和密钥。您还可以使用 Let’s Encrypt 的certbot 来自动设置。

以这种方式配置 SSL 意味着安全连接将在您的 Apache 主机上终止。Apache 和您的代理目标之间的连接将通过纯 HTTP 进行。

如果您需要代理连接固定也一样,你必须使用SSLProxy选项提供mod_ssl。SSLProxyEngine = On将作为最基本的配置工作,前提是 Apache 和您的代理目标服务器都可以访问相同的证书。此选项指示通过代理连接提供 SSL 信息。

代理选项

Apache 反向代理有几个可用于调整转发行为的可选指令。以下是一些常用的选项:

  • ProxyAddHeaders–默认情况下,Apache将X-Forwarded-Host、XForwarded-For和X-Forwarded-Serverheaders传递给您的后端服务器。这些让您的后端识别请求是通过 Apache 代理的。设置此标头以Off防止 Apache 添加这些标头。
  • ProxyErrorOverride– Apache 不会干扰后端服务器发送的响应,除非有指示。如果您的后端提供 400、404、500 或任何其他错误代码,用户将按原样接收该内容。设置ProxyErrorOverride改变了这一点,让阿帕奇替换错误页面的内容配置ErrorDocument来代替。在您希望通过集中在代理主机上的配置统一处理所有后端的错误的情况下,这可能是可取的。
  • ProxyPassReverseCookieDomain–此功能类似于强制(用于反向代理)ProxyPassReverse指令。它将重写Set-Cookie标头中的域以引用虚拟主机的名称,而不是它们源自的后端服务器的主机名。
  • ProxyPreserveHost– Apache通常将其自己的主机名作为Host标头的值发送到您的后端服务器。设置此指令意味着将发送原始 Host标头。当您的后端软件执行其自己的基于主机名的路由时,这可能是必要的。
  • ProxyTimeout– 使用此指令来调整 Apache 在后端服务器处理代理请求时等待的时间。如果超时,Apache将中止请求并向客户端返回错误代码。它默认为服务器级别的Timeout值。

您可以将这些指令设置为虚拟主机文件中的附加行。记住每次应用更改时都要重新启动 Apache 服务。

负载均衡

Apache 的反向代理实现还支持多个不同后端之间的负载平衡。这允许请求访问example.com平衡池中的任何服务器。

<Proxy balancer://example-balancer>
    BalancerMember http://192.168.0.1
    BalancerMember http://192.168.0.2
    ProxySet lbmethod=bytraffic
</Proxy>

ProxyPass / balancer://example-balancer
ProxyPassReverse / balancer://example-balancer

此示例将请求路由到example-balancer池中的两台服务器之一。的负载平衡算法是由定义的lbmethod设置; bytraffic此处使用的值试图确保每个服务器处理相同数量的流量。

另一种方法 byrequests balancing method是更简单的 bytraffic 版本,它为每个后端提供相等的传入请求份额。该 bybusyness balancer轨道有多少要求每个后端是服务,然后分配新的到最“忙碌”的后端。

概括

该mod_proxy模块可以将 Apache 变成一个反向代理主机,允许您使用基于名称的路由来访问多个独立的服务。您也可以添加负载平衡,通过在您的服务器队列中分配请求来确保稳定性和正常运行时间。

其他代理口味也可用。您可以代理 FTP、WebSocket 和 HTTP2 连接等,方法是在mod_proxy. 完整的模块列表可在 Apache 文档中找到。

到此这篇关于如何使用 Apache 设置反向代理的文章就介绍到这了,更多相关Apache 反向代理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx配置并兼容HTTP实现代码解析
Mar 31 Servers
nginx location优先级的深入讲解
Mar 31 Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
May 27 Servers
Nginx location 和 proxy_pass路径配置问题小结
Sep 04 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
Apr 29 Servers
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
讨论nginx location 顺序问题
May 30 Servers
linux目录管理方法介绍
Jun 01 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
NGINX 权限控制文件预览和下载的实现原理
Nginx虚拟主机的搭建的实现步骤
Jan 18 #Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 #Servers
教你快速构建一个基于nginx的web集群项目
Nov 27 #Servers
Linux安装apache服务器的配置过程
Nov 27 #Servers
Nginx配置https的实现
nginx内存池源码解析
You might like
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
jquery each()源代码
2011/02/14 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
Node.js实现文件上传
2016/07/05 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python递归函数定义与用法示例
2017/06/02 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Python实现数值积分方式
2019/11/20 Python
keras.layer.input()用法说明
2020/06/16 Python
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
车祸赔偿收入证明
2014/01/09 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
2014年服务员工作总结
2014/11/18 职场文书
最美乡村教师观后感
2015/06/11 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS