使用 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作grpc的反向代理踩坑总结
Jul 07 Servers
nginx实现动静分离的方法示例
Nov 07 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
Mar 31 Servers
Kubernetes控制节点的部署
Apr 01 Servers
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 Servers
tomcat正常启动但网页却无法访问的几种解决方法
May 06 Servers
鲲鹏 CentOS 7 安装Python3.7
May 11 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
win sever 2022如何占用操作主机角色
Jun 25 Servers
nginx之queue的具体使用
Jun 28 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 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入门速成(2)
2006/10/09 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
详解Python中的__init__和__new__
2014/03/12 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
Python 移动光标位置的方法
2019/01/20 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python支付宝支付示例详解
2019/08/22 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
.net面试题
2015/12/22 面试题
生物科学系大学生的自我评价
2013/12/20 职场文书
签约仪式主持词
2014/03/19 职场文书
死亡证明书样本说明
2014/10/18 职场文书
高中校园广播稿
2014/10/21 职场文书
民事答辩状格式范文
2015/05/21 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js