【Linux】【Services】【Web】Haproxy
1. 概念
1.1. 官方网站 http://www.haproxy.org/
2. 安装
yum安装
yum -y install haproxy keepalived
配置haproxy日志,修改/etc/rsyslog.conf
#去掉下面两行的注释
$ModLoad imudp
$UDPServerRun 514
#添加下面这行
local2.* /var/log/haproxy.log
修改/etc/sysconfig/rsyslog
#-r是允许接受外部日志
#-c 是说兼容syslog v2
#-m 是说每隔多长时间加一个时间戳,0表示不加
SYSLOGD_OPTIONS="-r -c 2"
3. 配置文件详解
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#--------------------------------------------------------------------- #---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
# ##log 相关的配置##
# 定义全局的syslog服务器,最多可以定义两个,用于将haproxy产生的日志发往此服务器予以存储
# log <address> [len <length>] <facility> [<level> [<minlevel>]]
# log global
# no log
#
# log-format <string> 日志格式
log 127.0.0.1 local2 # capture cookie <name> len <length>
# 记录请求及相应报文的cookie与日志中;
# <name>:cookie信息的起头字符;
# <len>:记录长度;
#
# capture request header <name> len <length>
# capture response header <name> len <length>
# 记录请求或相应报文中的指定的首部的值于日志中;
# <name>:指定的首部的名称; # compression algo <algorithm> ...
# compression type <mime type> ...
# compression offload
# algo:identitiy(通常仅debug时候使用),gzip,deflate
# tpye:压缩的mime类型,通常仅压缩文本类型的资源 ##进程管理##
chroot /var/lib/haproxy #haproxy的家目录 #运行的用户和运行的组,也可以用uid和gid来指定
user haproxy
group haproxy
daemon #使用守护进程的模式来运行,会在后台运行 # turn on stats unix socket
# 打开socket文件
stats socket /var/lib/haproxy/stats pidfile /var/run/haproxy.pid #PID
nbproc <number>:指明要启动的haproxy进程数量
#每个haproxy进程所能够打开的最大文件数。应该大于maxconn,但是haproxy会自动计算此数据并为其设定合理值。
ulimit -n <number> ##性能调整##
maxconn 4000 #设定单个haproxy进程所能承受的最大并发连接数;
maxpipes #haproxy使用pipe机制实现内核级tcp报文重组,每进程所能够使用的最大pipe数量,默认为maxconn/4; ##不建议设置的参数##
noepoll/nokqueue/nopoll/nosepoll:禁用事件机制
nosplice:禁用内核级tcp报文重组功能
tune.bufsize:
tune.chksize:
... tune.rcvbuf.client
tune.sndbuf.client
tune.rcvbuf.server
tune.sndbuf.server ##其他##
spread-checks <0..50> # 百分比
debug
quiet ##代理相关的参数##
#defaults:用于为listen/frontend/backend提供默认值;
defaults
# mode { tcp|http|health }
# tcp:当代理的为ssl、ssh、mysql等非http协议时使用;默认即此模式;
# http:仅当代理的为http协议时使用;
# health:工作在健康状态响应模式,当收到请求仅回应“OK”即断开连接;
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000 #frontend <name>:定义监听的套接字,用于接收客户端请求
frontend main *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static
default_backend app #backend <name>:定义后端服务器组,用于处理由frondend转发来的用户请求
backend static
balance roundrobin
server static 127.0.0.1:4331 check #---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check #listen <name>:通过关联“前端”和“后端”定义一个完整的proxy server;
#bind:指明监听的套接字
#bind *:80,*:8080 绑定两个端口
listen smtp 10.25.2.22:25 # https://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-balance
# balance <algorithm> [<arguments>]
# balance url_param <param> [check_post]
# <algorithm>
# roundrobin:动态算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机
# static-rr:静态算法,不支持权重的运行时调整及慢启动机制;后端主机无数量上限
# leastconn:推荐使用在较长时间会话场景中;例如,LDAP,MySQL等协议;
# first:根据服务器在列表中的位置,自上而下进行调度;前面服务器连接数达到上限,新请求将调度至下一个服务器
# 适用用会话较长的tcp连接;
# source:源地址hash;
# 取模法:将原地址hash计算后除以服务器总权重;服务器变动会影响全局调度效果;静态调度
# 一致性hash:服务器变动仅影响局部调度;动态调度
# uri:对URI的左半部分或整个url做hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机;
# 作用在于能够将同一个uri的请求始终发往同一个backend server,使用与后端为缓存服务器的场景
# <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
# 左半部分:/<path>;<params>
# 整个uri:/<path>;<params>?<query>#<frag>
#
# url_param:
# 对用户请求的url中的<params>中的参数的值作hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机;
# 此算法通常用于追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个backend server;
# hdr(<name>):对于每个http请求,通过<name>指定的http首部会被取出;此首部如果没有有效值,则轮询调度;
# 否则,对其做hash计算,并由服务器总权重相除后派发至挑选出的后端主机
#
# hash:哈希算法的计算方式
# hash-tpye <method><function><modifier>
# map-based
# consistent
# <function>
# sdbm
# djb2
# wt6
balance roundrobin # server <name> <address>[:[port]] [param*] 定义后端主机中的服务器及其参数
# <name>:服务器的内部名称,出现在日志及警告信息中;
# 如果设定了http-send-server-name,它还将被添加至发往此服务器的请求首部当中;
# <address>:服务器的地址,支持使用主机名;
# [:[port]]:端口映射;省略时,表示与bind的端口相同;
# [param*]:可用参数:
# backup:设置为备用服务器,仅在所有服务器均不可用时,方才启用
# check:对后端服务器做健康状态监测;无check时表示假设后端主机始终可用;同时可使用辅助参数有很多;
# addr:通过此地址进行健康状态监测;
# port <prot>:通过此端口进行健康状态监测
# inter<delay>:连续两次健康监测之间的时间间隔,默认为2000ms
# fall<count>:连续多少次的失败监测将标记服务器为dead;
# rise<count>:连续多少次的成功监测将标记服务器为available
# cookie <value>:为当前server指定cookie值,用于谁西安基于cookie会话粘性;
# cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
[ postonly ] [ preserve ] [ httponly ] [ secure ]
[ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
# cookie <name>:is the name of the cookie which will be monitored, modified or inserted in order to bring persistence.
# rewrite:重写
# insert:插入
# prefix:添加前缀
#
# 基于cookie会话粘性:
# cookie WEBSRV insert indirect nocache
# server srv1 172.18.100.68:80 check weight 1 max conn 2000 maxqueue 200 cookie websrv1
# server srv1 172.18.100.69:80 check weight 1 max conn 5000 maxqueue 500 cookie websrv2
#
# maxconn <maxconn>:当前服务器支持的最大并发连接数;超出此值的连接将被放置于请求队列中;
# maxqueue <maxqueue>:当前服务器的队列上限;
# redir <prefix>:将发往此服务器的所有GET和HEAD请求重定向至指定的地址;
# weight <weight>:权重
# maxconn <conns>:
#
# option httpchk
# option httpchk <uri>
# option httpchk <method> <uri>
# option httpchk <method> <uri> <version>
#
# server mail1 10.24.8.4:25 weight 1 maxconn 10000 check inter 10s
# server mail2 10.24.8.4:25 check
# server hcwhmailproxy01 10.25.8.2:25 check
# server hcwhmailproxy02 10.25.8.3:25 check
# server hcwhmailproxy03 10.25.8.4:25 check
# server hcwhmailproxy04 10.25.8.5:25 check # 统计接口启用相关的参数:
# stats enable
# 启用统计页,基于默认参数启用统计页;
# -stats url:/haproxy?stats
# -stats reaml:"HAProxy Statistics"
# -stats auth:no authentication
# -stats scope:no restriction
# stats url <prefix>
# 统计页的访问url前缀,通常要跟上?stats;
# stats realm <realm>
# 设定认证时使用realm
# stats auth <user>:<passwd>
# 认证的账号和密码;可以使用多次
# stats refresh <delay>
# 自动刷新时间间隔;
# stats admin {if | unless} <cond>
# 在指定的条件下启用admin功能; listen stats 10.25.2.22:9001
stats enable
stats uri /haproxyadmin?stats
stats realm HAProxy\ Statistics
stats auth admin:admin
stats admin if TRUE # option forwardfor
# 在发往backend server的请求报文中添加“X-Forwarded-For”首部,其值为客户端主机地址
# option forwardfor [except <network>][header<name>]
# except <network>:来自于此网络的请求不添加;
# header <name>:不使用默认的X-Forwarded-For,而使用此处定义的首部名称;
# reqadd <string>{{if|unless} <cond>}
# 向请问报文尾部添加自定义的header
# reqdel <search>{{if|unless} <cond>}
# reqdel <search>{{if|unless} <cond>}(ignore case)
# 基于模式删除删除匹配到的请求报文中的header及其值;
# rspadd, rspdel, rspidel;
# 相应报文;
# errorfile
# errorfile <code> <file>
# errorloc
# errorloc 302
# errorloc <code> <url> # acl <aclname> <criterion> [flags] [operator] <value>...
# Declare or complete and access list.
#
# criterion:
# dst IP
# dst_port PORT
# src IP
# src_port PORT
#
# path
# path : exact string match
# path_beg : prefix match
# path_dir : subdir match
# path_dom : domain match
# path_end : suffix match
# path_len : length match
# path_reg : regex match
# path_sub : substring match
#
# ACL derivatives :
# url : exact string match
# url_beg : prefix match
# url_dir : subdir match
# url_dom : domain match
# url_end : suffix match
# url_len : length match
# url_reg : regex match
# url_sub : substring match
#
# ACL derivatives :检查请求的url中指定的param的值
# urlp(<name>[,<delim>]) : exact string match
# urlp_beg(<name>[,<delim>]) : prefix match
# urlp_dir(<name>[,<delim>]) : subdir match
# urlp_dom(<name>[,<delim>]) : domain match
# urlp_end(<name>[,<delim>]) : suffix match
# urlp_len(<name>[,<delim>]) : length match
# urlp_reg(<name>[,<delim>]) : regex match
# urlp_sub(<name>[,<delim>]) : substring match
#
#ACL derivatives : 检查请求报文指定的首部的值
# hdr([<name>[,<occ>]]) : exact string match
# hdr_beg([<name>[,<occ>]]) : prefix match
# hdr_dir([<name>[,<occ>]]) : subdir match
# hdr_dom([<name>[,<occ>]]) : domain match
# hdr_end([<name>[,<occ>]]) : suffix match
# hdr_len([<name>[,<occ>]]) : length match
# hdr_reg([<name>[,<occ>]]) : regex match
# hdr_sub([<name>[,<occ>]]) : substring match
#
# block { if | unless } <condition> # http-request { allow |deny | auth}[{if | unless } <condition>]
# http-response { allow |deny | auth}[{if | unless } <condition>]
【Linux】【Services】【Web】Haproxy的更多相关文章
- 【linux之进程管理,系统监控】
一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...
- 【Linux&Unix--open/close/write/read系统调用】
个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文: Linux&Unix学习第一弹 -- 文件描写叙述符与权限 Linux&Unix学习 ...
- 【linux之设备,分区,文件系统】
一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...
- 【linux之挂载,Raid,LVM】
一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...
- 【Linux磁盘优化管理--RAID和LVM】
在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...
- 【linux之链接,函数,随机数】
一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...
- 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群
额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...
- 5.2【Linux 内核网络协议栈源码剖析】socket 函数剖析 ☆☆☆
深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来. 应用层 FTP SMTP HTTP ... 传输层 TCP UDP 网络层 IP ICMP ARP ...
- 【Linux下安装使用virtualenv与virtualenvwrapper】
virtualenv virtualenv是一个可以帮助我们管理不同Python环境的绝好工具. virtualenv是一个可以在系统中建立多个不同且相互不干扰的虚拟环境. 下面的步骤将创建两个独立的 ...
随机推荐
- Linux ns 3. Mnt Namespace 详解
1. 文件系统层次化 对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象. 完整的Linux文件系统,是由多种设备.多种文件系统组成的一个混合的树形结构.我们首先 ...
- Kafka面试题总结
1.Kafka 都有哪些特点? 高吞吐量.低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partit ...
- ofd文件电子签章实现方法
前言 文档处理一般经过三个环节:流.版.签:流式软件负责编辑,如:office.wps等.版式软件负责文档定型,保证显示样式不跑偏:版式文件格式有两种:pdf.ofd.签章软件负责对版式文档签章.签章 ...
- liunx基础知识点2:文件操作命令、系统资源查询、权限赋予命令、安装命令、解压命令
- 菜鸡的Java笔记 第三十六 - java 函数式编程
StudyLambda Lambda 指的是函数式编程,现在最为流行的编程模式为面向对象,很多的开发者并不认可面向对象,所以很多的开发者宁愿继续使用 C 语言进行开发,也不愿意使用java,c+ ...
- [atARC121E]Directed Tree
令$b_{a_{i}}=i$,那么问题即要求$i$不是$b_{i}$的祖先,也即$b_{i}$不严格在$i$的子树中 显然$a_{i}$和$b_{i}$一一对应,因此我们不妨统计$b_{i}$的个数 ...
- [bzoj1416]神奇的口袋
容易发现操作任意次并不会改变每一个点的概率(因为每一个点加d的概率相同,期望与原数成比例),然后直接输出即可(要用高精度) 1 #include<bits/stdc++.h> 2 usin ...
- 华为9.8笔试题C++
问题 给出一颗二叉树,每个节点有一个编号和一个值,该值可能为负数,请你找出一个最优节点(除根节点外),使得在该节点将树分成两棵树后(原来的树移除这个节点及其子节点,新的树以该节点为根节点),分成的两棵 ...
- watch异步操作
异步操作: 1.ajax, 2.定时器 3.点击事件 4.数据库操作 特点:代码不等待,后续代码会继续执行. watch:{ //watch作用监测已经存在的数据 newVal 新值,oldVal 旧 ...
- Date相关类
Date相关类 SimpleDateFormat类中format()和parse()方法 parse 字符串 --> 日期 format 日期 --> 字符串 Date类中getTime( ...