Haproxy 的重定向跳转设置 - 运维小结

前面已经详细介绍了Haproxy基础知识 , 今天这里再赘述下Haproxy的重定向跳转的设置. haproxy利用acl来实现haproxy动静分离,然而在许多运维应用环境中,可能需要将访问的站点请求跳转到指定的站点上,比如客户单端访问kevin.a.com需要将请求转发到bobo.b.com或将http请求重定向到https请求,再比如当客户端访问出错时,需要将错误code代码提示请求到指定的错误页面,诸如此类需求实现,这种情况下就需要利用haproxy的重定向功能来达到此目的。

一. Haproxy实现request请求重定向
关于Hproxy 请求重定向主要会用到: redirect  和 redir 这两类重定向配置语法。

1) redirect重定向的用法: (redirect通常配置在haproxy acl部分)
redirect一般有两个指令来执行HTTP重定向:
http-requets redirect       #此种方式支持日志变量格式
redirect                           #此种方式只依赖于静态字符串

这两个指令的语法是相同的,即redirect现在被认为是传统和配置应该移动到http-request redirect形式。
还有一个主要区别是:http-request redirect使用日志可变格式, 而redirect语句只依赖于静态字符串。

2) redirect有三种重定向方式
a) 位置重定向
使用语法如下:
redirect location <loc> [code <code>] <option> [{if | unless} <condition>]

使用位置重定向,例如下面所示指令可以将用户重定向到所提供的精确位置, 该位置可以是第三方URL链接,也可以是本地web服务的另一个访问路径.
1. http-request redirect location <loc> [code <code>] [<option>] [<condition>]
2. redirect location <loc> [code <code>] [<option>] [<condition>]

相关指令参数如下:
* <loc> :一个日志格式变量 (或简单的字符串redirect语句)描述了新位置;
* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

* <option>(可选):  可以是以下任何或组合的声明:
1. set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。
2. clear-cookie NAME[=]一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。

注意:  在于浏览器中,这是两个不同的Cookie:NAME和NAME = 以上根据您的流量模式,必须将两个语句适应。

* if | unless :  用于条件判断
*<condition> (可选):用于匹配acl,一般为acl的名称

b) 前缀重定向
使用语法如下:
redirect prefix <loc> [code <code>] <option> [{if | unless} <condition>]

使用前缀重定向,将用户重定向到由concateneting建立了一个网址<pfx>和完整的原始URI路径:
1. http-request redirect prefix <pfx> [code <code>] [<option>] [<condition>]
2. redirect prefix <pfx> [code <code>] [<option>] [<condition>]

相关指令参数如下:
* <pfx>: 一个日志格式变量 (或简单的字符串redirect语句)描述了新的位置前缀。
* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

* <option>(可选): 可以是以下任何或组合的声明:
drop-query :在执行串联时从原来的URL删除查询字符串
append-slash :配合使用drop-query ,在该URL的末尾添加一个“/”字符
set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。
clear-cookie NAME[=] :一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。

* if | unless :用于条件判断
* <condition> (可选):用于匹配acl,一般为acl的名称

c) 协议(计划)重定向(比如将http重定向到https)
使用语法如下:
redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]

使用位置重定向,例如下面所示指令可以将用户重定向到所提供的新的http协议url链接, 一般用于非安全链接跳转到安全链接,比如http跳转到https上
1. http-request redirect scheme <schloc> [code <code>] [<option>] [<condition>]
2. redirect scheme <sch> [code <code>] [<option>] [<condition>]

相关指令参数如下:
* <loc> :一个日志格式变量 (或简单的字符串redirect语句)描述了新位置;
* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

* <option>(可选): 可以是以下任何或组合的声明:
1. set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。
2. clear-cookie NAME[=]一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。

注意: 在于浏览器中,这是两个不同的Cookie:NAME和NAME = 以上根据你的流量模式,必须将两个语句适应。

* if | unless :用于条件判断
* <condition> (可选):用于匹配acl,一般为acl的名称

一个简单的实例:

acl http      ssl_fc,not
http-request redirect scheme https if http

下面是redirect 综合应用的一个小示例:

acl clear      dst_port  80
acl secure     dst_port  8080
acl login_page url_beg   /login
acl logout     url_beg   /logout
acl uid_given  url_reg   /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1 

redirect prefix   https://kevin.com set-cookie SEEN=1 if !cookie_set
redirect prefix   https://kevin.com           if login_page !secure
redirect prefix   http://kevin.com drop-query if login_page !uid_given
redirect location http://kevin.com/           if !login_page secure
redirect location / clear-cookie USERID=      if logout

总结: redirect三种重定向可以混合使用,比较常用的有redirect prefix redirect location这两种方式,从某种理解上可以交差使用;

2) redir重定向的用法:(redir通常配置在haproxy backend部分)
使用redir 会将发往backend的站点服务请求均以302状态响应发给需要重定向的server服务或站点,此时haproxy不需要向后端web server提交请求;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以避免造成循环,例如:

frontend  main *:80
    default_backend app
backend app
    balance roundrobin
    server node1 127.0.0.1:81 check weight 3 redir http://www.kevin.com

上面配置含义:所有发往localhost:81的请求做重定向,重定向到www.kevin.com因此可以实现单台服务器的重定向

又例如,如果我们要讲访问的站点重定向到grace.com

frontend  main *:80
    default_backend  app
backend app
    balance roundrobin
    server node1 127.0.0.1:81 check weight 3 redir http://www.grace.com

注意:redir只做跳转,如客户端输入:http://ip ,将会跳转到指定的页面上,此时客户端的页面的页面也会跳转到指定的页面上,之后所有的请求都会递交到该站点(前提该站点可以与客户端通讯),而不再发往haproxy代理站点,haproxy也不需要往后端web server提交客户端发过来的请求。

二. haproxy实现error重定向
格式为: errorfile 错误代码code 错误代码响应提示页路径
* errorfile 即根据客户端页面错误code状态将指定的错误状态页面提示给客户端,比如友情提示页面,一般如下:

errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http

例如:如果想访问403页面重定向到其他页面的话 (errorloc),则参考以下配置:

frontend web_server
    bind *:80
    default_backend webserver
    acl badguy src 172.16.50.10
    block if badguy
    errorloc 403 http://grace.com/         #定义错误页面重定向

errorfile  表示在用户请求不存在的页面时,返回一个页面给客户端而非有haproxy生成的错误代码,可用于所有段中;
格式: errorfile <code> <file>

errorloc  表示请求错误时,返回一个HTTP重定向至某URL的信息,可以用于所有端中;
格式: errorloc <code> <url>

总结: 错误重定向可以更加友好地提示客户端错误状态,比如做定制页面化跳转,以及网站维护升级等等,当出现错误时,可以及时跳转到预定好错误提示页面上。

原文地址:https://www.cnblogs.com/kevingrace/p/10182538.html

时间: 2024-09-30 04:13:18

Haproxy 的重定向跳转设置 - 运维小结的相关文章

Nginx/Apache之伪静态设置 - 运维小结

一.什么是伪静态伪静态即是网站本身是动态网页如.php..asp..aspx等格式动态网页有时这类动态网页还跟"?"加参数来读取数据库内不同资料,伪静态就是做url重写操作(即rewrite).很典型的案例即是discuz论坛系统,后台就有一个设置伪静态功能,开启伪静态后,动态网页即被转换重写成静态网页类型页面,通过浏览器访问地址和真的静态页面没区别.但是记住:做伪静态的前提就是服务器要支持伪静态重写URL Rewrite功能. 考虑搜索引擎优化(即SEO),将动态网页通过服务器处理成

Nginx下关于缓存控制字段cache-control的配置说明 - 运维小结

HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括: no-cache.no-store.max-age. max-stale.min-fresh.only-if-cached等.响应消息中的指令包括: public.private.no-cache.no- store.no-transform.must-revalidate.proxy-revalida

运维小结

运维学习第二弹: 一.centOS虚拟机的基本指令: 二.三大开源协定: 三.软件的一般四类文件: 二进制文件:可执行文件 windows=.exe(execute) /msi linux:ELF 头文件/库文件(用于应用程序和内核的链接): windows:dll(dynamic linked Library) linux:so(shared object): ko(lernel object): a 帮助文件:整个程序的使用说明书 配置文件:变量 就是这个文件自己的名字 任何文件的路径都由两

自动化批量管理工具pssh - 运维小结

pssh提供OpenSSH和相关工具的并行版本.包括pssh,pscp,prsync,pnuke和pslurp.该项目包括psshlib,可以在自定义应用程序中使用.pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上的进程等等.杀手锏是文件并行复制,,当进行再远程主机批量上传下载的时候,最好使用它.pssh用于批量ssh操作大批量机器:pssh是一个可以在多

MySQL 半同步复制模式说明及配置示例 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

Linux日常运维小结

1. 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数? 物理cpu个数:cat /proc/cpuinfo |grep -c 'physical id'CPU一共有多少核:grep -c processor /proc/cpuinfo将CPU的总核数除以物理CPU的个数,得到每颗CPU的核数. 2. 查看系统负载有两个常用的命令,是哪两个?这三个数值表示什么含义呢?两个命令分别是 w 和 uptime这三个系统负载值分别表示在1分钟.5分钟和15分钟内平均有多少个任务处于活动状态.

Zookeeper运维小结--CancelledKeyException

https://www.jianshu.com/p/73eec030db86 项目中用到storm+kafka+zookeeper,在实际应用中zk和kafka常出问题,这里记录下在使用zk过程中的问题. 注:zk版本是3.4.8,kafka是0.8.2.0.zk.storm和kafka都是运行在同一个集群的三台机器上. CancelledKeyException 在开发环境测试的时候,一直没有问题,后来原样移植到测试环境下,zk总是出异常,导致kafka和storm连接丢失并重新发起连接请求.

Mysql半同步复制模式说明 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是:主库开启binlog功能并授权从库连接主库,从库通过chan

ProxySQL 基础知识梳理 - 运维小结 (完整版)

ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配置.故障切换和一些 SQL的过滤功能.还有一些同类产品比如 DBproxy.MyCAT.OneProxy 等.但经过反复对比和测试之后,还是觉得ProxySQL是一款性能不谙,靠谱稳定的MySQL 中间件产品 ! ProxySQL的亮点所在 -  几乎所有的配置均可在线更改(其配置数据基于SQLit