HAProxy用法详解

HAProxy用法详解
HAProxy用法详解

HAProxy用法详解

一,HAProxy简介

(1)HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP (第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

(2)HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

(3)HAProxy 支持连接拒绝: 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救

了很多站点,这个优点也是其它负载均衡器没有的。

(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

性能:

HAProxy借助于OS上几种常见的技术来实现性能的最大化。

1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);

5,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;

6,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;

7,优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;

8,精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;

所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU

负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

HAProxy目前主要有三个版本:1.3 ,1.4 ,1.5,CentOS6.6 自带的RPM包为1.5 的。

二,安装配置HAProxy

以下实验环境均为CentOS6.6 i686平台。

1.1,安装haproxy

2.[root@LB ~]# yum install -y haproxy #直接使用RPM来安装

3.

4.[root@LB ~]# rpm -qi haproxy #版本为1.

5.4

https://www.360docs.net/doc/4b257407.html, : haproxy Relocations: (not relocatable)

6.Version : 1.5.4 Vendor: CentOS

7.Release : 2.el6 Build Date: Thu 23 Jul 2015 04:26:35

PM PDT

8.Install Date: Sat 29 Aug 2015 06:49:30 PM PDT Build Host:

https://www.360docs.net/doc/4b257407.html,

9.Group : System Environment/Daemons Source RPM:

haproxy-1.5.4-2.el6.src.rpm

10.Size : 2542578 License: GPLv2+

11.Signature : RSA/SHA1, Fri 24 Jul 2015 01:39:18 PM PDT, Key ID 0946fca2c105b9de

12.Packager : CentOS BuildSystem

13.URL : https://www.360docs.net/doc/4b257407.html,/

14.Summary : HAProxy is a TCP/HTTP reverse proxy for high availability environments

15.

16.[root@LB ~]# rpm -ql haproxy

17./etc/haproxy

18./etc/haproxy/haproxy.cfg ---------->配置文件

19./etc/logrotate.d/haproxy

20./etc/rc.d/init.d/haproxy

21./etc/sysconfig/haproxy

22./usr/bin/halog

23./usr/bin/iprange

24./usr/sbin/haproxy

25.

26.[root@LB ~]# cd /etc/haproxy/

2,详解配置文件

haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。

2.1 配置文件格式

HAProxy的配置处理3类来主要参数来源:

——最优先处理的命令行参数;

——“global”配置段,用于设定全局配置参数;

——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;

2.2 时间格式

一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。

https://www.360docs.net/doc/4b257407.html,: 微秒(microseconds),即1/1000000秒;

2.ms: 毫秒(milliseconds),即1/1000秒;

3.s: 秒(seconds);

4.m: 分钟(minutes);

5.h:小时(hours);

6.d: 天(days);

2.3 全局配置

*进程管理及安全相关的参数:

– chroot :修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;

– daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;

– gid :以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;

– group :同gid,不过指定的组名;

– log

[max level [min level]]:定义全局的syslog服务器,最多可以定义两个;

– log-send-hostname []:在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名;

– nbproc :指定启动的haproxy进程的个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;

– pidfile:

– uid:以指定的UID身份运行haproxy进程;

– ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个

– user:同uid,但使用的是用户名;

– stats:用户访问统计数据的接口

– node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;

– description:当前实例的描述信息;

* 性能调整相关的参数

– maxconn :设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;

– maxpipes :haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;

– noepoll:在Linux系统上禁用epoll机制;

– nokqueue:在BSE系统上禁用kqueue机制;

– nopoll:禁用poll机制;

– nosepoll:在Linux禁用启发式epoll机制;

– nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send 系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在;– spread-checks <0..50, in percent>:在haproxy后端有着众多服务器的场景中,

在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;

– tune.bufsize :设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;

– tune.chksize :设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改;

– tune.maxaccept :设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制;一般不建议修改;

– tune.maxpollevents :设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;

– tune.maxrewrite :设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;

– tune.rcvbuf.client

– tune.rcvbuf.server :设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节;强烈推荐使用默认值;

– tune.sndbuf.client:

– tune.sndbuf.server:

* Debug相关的参数

1.- debug

2.- quiet

* 超时时长

1.timeout http-request :在客户端建立连接但不请求数据时,关闭客户端连接

2.timeout queue :等待最大时长

3.timeout connect:定义haproxy将客户端请求转发至后端服务器所等待的超时时长

4.timeout client:客户端非活动状态的超时时长

5.timeout server:客户端与服务器端建立连接后,等待服务器端的超时时长,

6.Timeout http-keep-alive :定义保持连接的超时时长

7.Timeout check:健康状态监测时的超时时间,过短会误判,过长资源消耗

8.maxconn :每个server最大的连接数

9.http-server-close : 在使用长连接时,为了避免客户端超时没有关闭长连接,此功能

可以使服务器端关闭长连接

10.redispatch:在使用基于cookie定向时,一旦后端某一server宕机时,会将会话重

新定向至某一上游服务器,必须使用的选项

* 实现访问控制:

1.http-request: 7层过滤

2.tcp-request content: tcp层过滤,四层过滤

2.4 代理

代理相关的配置可以如下配置段中。

– defaults

– frontend

– backend

– listen

1.“defaults”段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个

“defaults”所重新设定。

2.“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建

立连接。

3.“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这

些服务器。

4.“listen”段通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流

量有用。

所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。

三、配置文件中的关键字参考

3.1 balance

balance [ ]

balance url_param [check_post []]

定义负载均衡算法,可用于“defaults”、“listen”和“backend”。用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。支持的算法有:

3.1.1 roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动。

3.1.2 static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接。

3.1.3 leastconn(WLC):适用于长连接的会话,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;

3.1.4 source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;

1.对原地址hash,第一次调度时使用WLC

2.source:IP层,位于同一个NAT服务器背后的多个请求都会定向至同一个upstream

server,不利于负载均衡,一般只有不支持使用cookie插入又需要保持会话时使用

3.cookie:应用层,有更好的负载均衡效果;

4.hash/weight%ip:除以权重取模

3.1.5 uri:对URI的左半部分(“?”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI

的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type

修改此特性;

3.1.6 url_param:通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;

3.1.7 hdr():对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过https://www.360docs.net/doc/4b257407.html,来说,仅计算feiyu字符串的hash 值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用

hash-type修改此特性;

3.1.8 rdp-cookie(name): 表示根据据cookie(name)来锁定并哈希每一次TCP请求。

3.2 bind

bind *

+: *, …+

bind *

+: *, …+ interface

此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字。

:可选选项,其可以为主机名、IPv4地址、IPv6地址或*;省略此选项、将其指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址;:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),代理服务器将通过指定的端口来接收客户端请求;需要注意的是,每组监听的套接字

在同一个实例上只能使用一次,而且小于1024的端口需要有特定权限的用户才能使用,这可能需要通过uid参数来定义;:指定物理接口的名称,仅能在Linux系统上使用;其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口;

3.3 mode

mode { tcp|http|health }

设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。

1.tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,

且不会对7层报文做任何类型的检查;通常用于SSL、SSH、SMTP等应用;

2.http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,

所有不与RFC格式兼容的请求都会被拒绝;此为默认模式;

3.health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不

会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前来讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能;

3.4 hash-type

hash-type

定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。

map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。

consistent:“一致性哈希算法”,hash表是一个由各服务器填充而成的树状结构,将服务器散列在hash环上;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

3.5 log

1.log global

2.log

[ []]

为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,不过,如果使用了“log global”且”global”段已经定了两个log参数时,多余了log参数将被忽略。

global:当前实例的日志系统参数同”global”段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数;

:定义日志发往的位置,其格式之一可以为,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但需要留心chroot应用及用户的读写权限;

:可以为syslog系统的标准facility之一;

:定义日志级别,即输出信息过滤器,默认为所有信息;指定级别时,所有等于或高于此级别的日志信息将会被发送;

3.6 maxconn

maxconn

设定一个前端的最大并发连接数,因此,其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。

如果为指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。其默认为2000。

3.7 default_backend

default_backend

在没有匹配的”use_backend”规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。在”frontend” 和”backend”之间进行内容交换时,通常使用”use-backend”定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。

:指定使用的后端的名称;

使用案例:

use_backend dynamic if url_dyn

use_backend static if url_css url_img extension_img

default_backend dynamic

3.8 server

server

[:port] [param*]

为后端声明一个server,因此,不能用于defaults和frontend区段。

:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定

了”http-send-server-name”,它还将被添加至发往此服务器的请求首部中;

:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址;

[:port]:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口;

[param*]:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数;

服务器或默认服务器参数:

backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:

inter :设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;

rise :设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;

fall :确认server从正常状态转换为不可用状态需要检查的次数;cookie :为指定server设定cookie值,此处指定的值将在请求入站时

被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;

maxconn :指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;

haproxy 有n个进程,每个支持m个连接,后端有x个服务器,每个最大支持y 个连接,则n*m <= x*y,如果后端服务器支持排队,则n*m <= x*(y+z),z为每个服务器的排队队列

maxqueue :设定请求队列的最大长度;

observe :通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

redir :启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:

server srv1 172.16.100.6:80 redir https://www.360docs.net/doc/4b257407.html, check

weight :权重,默认为1,最大值为256,0表示不参与负载均衡(不被调度);

检查方法:

1.option httpchk

2.option httpchk

3.option httpchk

4.option httpchk

5.

6.不能用于frontend段,例如:

7.backend https_relay

8.mode tcp

9.option httpchk OPTIONS * HTTP/1.1\r\nHost:\ https://www.360docs.net/doc/4b257407.html,

10.server apache1 192.168.1.1:443 check port 80

使用案例:

server first 172.16.100.7:1080 cookie first check inter 1000

server second 172.16.100.8:1080 cookie second check inter 1000

3.9 capture request header

capture request header len

捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于“frontend”和“listen”区段。捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,它们将以指定的次序出现在日志文件中,并以竖线“|”作为分隔符。不存在的首部记录为空字符串,最常需要捕获的首部包括在虚拟主机环境

中使用的“Host”、上传请求首部中的“Content-length”、快速区别真实用户和网络机器人的“User- agent”,以及代理环境中记录真实请求来源的“X-Forward-For”。

:要捕获的首部的名称,此名称不区分字符大小写,但建议与它们出现在首部中的格式相同,比如大写首字母。需要注意的是,记录在日志中的是首部对应的值,而非首部名称。

:指定记录首部值时所记录的精确长度,超出的部分将会被忽略。

可以捕获的请求首部的个数没有限制,但每个捕获最多只能记录64个字符。为了保证同一个frontend中日志格式的统一性,首部捕获仅能在frontend中定义。

3.10 capture response header

capture response header len

捕获并记录响应首部,其格式和要点同请求首部。

3.11 stats enable

启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段。只要没有另外的其它设定,它们就会使用如下的配置:

1.- stats uri : /haproxy?stats

2.- stats realm : "HAProxy Statistics"

3.- stats auth : no authentication

4.- stats scope : no restriction

尽管“stats enable”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例。

1.backend public_www

2.server websrv1 172.16.100.11:80

3.stats enable

4.stats hide-version

5.stats scope .

6.stats uri /haproxyadmin?stats

7.stats realm Haproxy\ Statistics

8.stats auth statsadmin:password

9.stats auth statsmaster:password

3.12 stats hide-version

stats hide-version

启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞。尽管“stats hide-version”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。具体请参照“stats enable”一节的说明。

3.13 stats realm

stats realm

启用统计报告并高精认证领域,不能用于“frontend”区段。haproxy在读取realm 时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义。此参数仅在与“stats auth”配置使用时有意义。

:实现HTTP基本认证时显示在浏览器中的领域名称,用于提示用户输入一个用户名和密码。

尽管“stats realm”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。具体请参照“stats enable”一节的说明。

3.14 stats scope

stats scope { | "." }

启用统计报告并限定报告的区段,不能用于“frontend”区段。当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其它区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以字符串比较的方式进行,它不会真检测指定的区段是否真正存在。

:可以是一个“listen”、“frontend”或“backend”区段的名称,而“.”则表示stats scope语句所定义的当前区段。

尽管“stats scope”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例。

1.backend private_monitoring

2.stats enable

3.stats uri /haproxyadmin?stats

4.stats refresh 10s

3.15 stats auth

stats auth :

启用带认证的统计报告功能并授权一个用户帐号,其不能用于“frontend”区段。

:授权进行访问的用户名;

:此用户的访问密码,明文格式;

此语句将基于默认设定启用统计报告功能,并仅允许其定义的用户访问,其也可以定义多次以授权多个用户帐号。可以结合“stats realm”参数在提示用户认证时给出一个领域说明信息。在使用非法用户访问统计功能时,其将会响应一个“401 Forbidden”页面。其认证方式为HTTP Basic认证,密码传输会以明文方式进行,因此,配置文件中也使用明文方式存储以说明其非保密信息故此不能相同于其它关键性帐号的密码。

尽管“stats auth”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。

3.16 stats admin

stats admin { if | unless }

在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。

目前来说,POST请求方法被限制于仅能使用缓冲区减去保留部分之外的空间,因此,服务器列表不能过长,否则,此请求将无法正常工作。因此,建议一次仅调整少数几个服务器。下面是两个案例,第一个限制了仅能在本机打开报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。

1.backend stats_localhost

2.stats enable

3.stats admin if LOCALHOST

4.

5.backend stats_auth

6.stats enable

7.stats auth haproxyadmin:password

8.stats admin if TRUE

3.17 option httplog

option httplog [ clf ]

启用记录HTTP请求、会话状态和计时器的功能。

clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。

默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。

3.18 option logasap

option logasap

no option logasap

启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。

默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。

1.listen http_proxy 0.0.0.0:80

2.mode http

3.option httplog

4.option logasap

5.log 172.1

6.100.9 local2

3.19 option forwardfor

option forwardfor [ except ] [ header ] [ if-none ]

允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。

:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。

:可选参数,可使用一个自定义的首部,如“X-Client”来替代

“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。

if-none:仅在此首部不存在时才将其添加至请求报文问道中。

HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy 主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。

需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。

下面是一个例子。

1.frontend www

2.mode http

3.option forwardfor except 127.0.0.1

3.20 errorfile

errorfile

在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。

:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;

:指定用于响应的页面文件;

例如:

1.errorfile 400 /etc/haproxy/errorpages/400badreq.http

2.errorfile 403 /etc/haproxy/errorpages/403forbid.http

3.errorfile 503 /etc/haproxy/errorpages/503sorry.http

3.21 errorloc 和errorloc302

1.errorloc

2.errorloc302

请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。

:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;

:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;

需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。

3.22 errorloc303

errorloc303

请求错误时,返回一个HTTP重定向至某URL的信息给客户端;可用于所有配置段中。

:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400、403、408、500、502、503和504;

:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;

例如:

1.backend webserver

2.server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01

3.server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02

4.errorloc 403 /etc/haproxy/errorpages/sorry.htm

5.errorloc 503 /etc/haproxy/errorpages/sorry.htm

3.23 cookie

cookie [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ domain ]* [ maxidle ] [ maxlife

cookie的名称,用于持久性的监视、修改和增加。cookie在response 中通过"Set-Cookie"头发送给客户端,并由客户端的所有request的"Cookie"头返回。尤其注意不要与应用cookie重名。另外,如果相同客户端使用了相同的后端(如HTTP/HTTPS),如果不希望跨后端的持久性,也要注意使用不同的cookie 名称。

rewrite 表示cookie由服务器提供,haproxy必定要修改它的值,以包含服务器的标识符。这种模式便于应用来管理"Set-cookie" 和"Cache-control"头的复杂组合。应用可以决定是否适合发出一个持久性cookie。如果所有的响应都要被监控,则该模式只能工作在HTTP close模式下。除非应用的行为很复杂和/或破碎(broken?),否则建议不要启动这个新的配置模式。关键字不能与"insert" 和"prefix"共用。

insert 表示如果客户端还没有允许访问服务器的cookie,haproxy会在服务器响应中插入持久性cookie。如果服务器发送了一个同名的cookie,当没有同时声明"preserve" 选项时,它会在处理前被删掉。因此,这个模式可以用于升级“rewrite”模式下的已有配置。cookie只是一个会话cookie,而且不保存在客户端的磁盘中。默认的,除非有选项"indirect" ,服务器才会看到客户端发出

的cookie。由于缓存的影响,通常明智的做法是添加关键字"nocache" or "postonly" 。关键字不能与"rewrite" 和"prefix"共用。

prefix 持久性基于现有的cookie就可以,而不必依赖专门的cookie。在一些特殊的环境下需要使用,如客户端不支持多于一个cookie,而应用已经需要了。这种情况下,每当服务器设置了cookie名字,haproxy就会在名字前添加一个服务器标识符和分隔符的前缀。前缀在所有客户端的请求中会被去掉,所以服务器还是会找到发送的cookie。既然所有的响应和请求都要被修改,这个模式则需要运行在HTTP close模式下。关键字不能与"rewrite" 和"insert"共用。

indirect 声明了该选项,没有cookie会被发送给客户端,即使客户端已经有一个合法的cookie给处理响应的服务器。如果服务器本身设置了这样一个cookie,也会被删除,除非同时设置了选项"preserve"。在"insert"模式下,还会删除发送给服务器的request的cookie。持久机制对应用是完全透明的。

nocache 如果在客户端和HAProxy之间有缓存,那么该选项建议与"insert"模式结合使用,如果需要新增cookie,确保可缓存的response标记为非缓存的。这很重要,因为所有可持久的cookie都被加在实例的一个可缓存的主页上,那么所有客户会从外部缓存获取页面,并都共享同样的持久cookie,导致一个服务器处理了太多的负载。参见"insert" 和"postonly"选项。

postonly 该选项使cookie只能增加在POST请求的响应中。与"nocache"选项只能二选一,因为POST响应是不可缓存的,所以持久cookie是绝不会被缓存的。第一个POST一般都是登录请求,大部分站点在此之前不需要任何持久性的排序,这可以避免在缓存中查找持久cookie,以有效优化缓存。参见"insert" 和"nocache" 选项。

preserve 该选项可以与"insert" 和/或"indirect"一起使用。允许服务器自己发送持久cookie。在这种情况下,如果在response中发现有cookie,则HAProxy 会对其保持不变。在实例的注销请求之后,需要用它来结束持久性。此时,服务器只需要发送一个带有无效值(如:empty)或过去日期的cookie。与"disable-on-404"检查选项相结合,可以实现一个完全正常的关闭,因为用户注销后一定会离开服务器。

domain 该选项用于指定cookie插入的域,后跟一个合法的域名参数。如果域名以点开头,浏览器允许任何以域名结尾的主机使用它。还可以通过多此调用此选项来指定多个域名,但要注意有的浏览器对域的个数是有限制的。有记录说在MSIE6或Firefox2上发送10个域是可以的。

maxidle 该选项允许在闲置时间后忽略插入的cookie,只对insert模式的cookie有效。当cookie发送到客户端,cookie的日期也被发送过去。进一步讲,如果日期早于参数(秒)表示的延迟,cookie会被忽略,否则会根据发送给客户端的响应进行刷新。尤其是用户一直不关闭浏览器,可以避免在一台服务器上占用太长时间(eg: after a farm size change)。如果设置了选项,但是cookie没有日期,这种情况是允许的,只是会一直在响应中刷新。这维护了管理员访问他们站

点的能力。cookie的日期如果超过未来24小时也会被忽略掉,使管理员可以在修复时区问题时不必把用户踢下线。

maxlife 该选项允许在生存时间过后忽略插入的cookie,不管是否还在使用,只对insert模式的cookie有效。当cookie发送到客户端,cookie的日期也被发送过去。进一步讲,如果日期早于参数(秒)表示的延迟,cookie会被忽略。如果request中的cookie没有日期,则会被设置一个日期。cookie的日期如果超过未来24小时也会被忽略掉,使管理员可以在修复时区问题时不必把用户踢下线。与maxidle不同,这个值是不刷新的,只在第一次访问日期计数。maxidle

和maxlife可以一起使用,尤其是用户一直不关闭浏览器,可以避免在一台服务器上占用太长时间(eg: after a farm size change)。与maxidle的超时后强行重新分配相比,这个要更好一些。

每个HTTP后端可以只有一个持久cookie,并定义在default部分,cookie的值可以是"server"声明中"cookie"关键字后面的值。如果服务器没有指定cookie,则不会设置。

四、ACL

haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。定义ACL的语法格式如下。

acl [flags] [operator] ...

:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];

[flags]:目前haproxy的acl支持的标志位有3个:

-i:不区分中模式字符的大小写;

-f:从指定的文件中加载模式;

--:标志符的强制结束标记,在模式中的字符串像标记符时使用;

:acl测试条件支持的值有以下四类:

语法规则-情态动词

初中英语情态动词用法详解 【情态动词知识梳理】 情态动词有具体的词义,但也同助动词一样,需要与其他词语一起构成句子的谓语,另外情态动词没有人称和数的变化,情态动词后必须跟动词原形。 考点一:can,may,must等情态动词在陈述句中的用法: 1. can的用法: (1).表示能力、许可、可能性。表示能力时一般译为“能、会”,即有种能力,尤其是生来具备的能力,此时may和must均不可代替它。如:She can swim fast, but I can’t . 她能游得很快,但我不能。I can see with my eyes.我用眼睛看。 (2).表示许可,常在口语中。如:You can use my dictionary. 你可以用我的字典。(3).表示推测,意为“可能”,常用于否定句和疑问句中,此时can’t译为“不可能”。如:Can the news be true?这个消息会是真的吗?—Can it be our teacher?那个人有可能是我们老师吗?—No, it can’t be our teacher. He is on a visit to the Great Wal l.不可能。咱们老师正在游览长城呢。 【例题】—I think Miss Gao must be in the library. She said she would go there.—No. She __be there, I have just been there. 【解析】根据下文“我刚去过那儿”可知,应为“不可能”,can’t表示推测[答案] 2. could的用法: (1).can的过去式,意为“能、会”,表示过去的能力。如:He could write poems when he was 10. 他十岁时就会写诗。 (2). could在疑问句中,表示委婉的语气,此时could没有过去式的意思。如:Could you do me 你能帮我个忙吗?—Could I use your pen?我能用一下你的钢笔吗?—Yes, you can.可以。(注意回答) 3. may的用法: (1).表示请求、许可,比can正式,如:May I borrow your bike?我可以借你的自行车吗?You may go home now.现在你可以回家了。 【例题】—_______ I borrow your MP3?—Sure . Here you are. A. May B.Should C.Must D.

java中Map类

java中Map类 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象。 Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对。 SortedMap---扩展Map,使按键保持升序排列 关于怎么使用,一般是选择Map的子类,而不直接用Map类。 下面以HashMap为例。 public static void main(String args[]) { HashMap hashmap = new HashMap(); hashmap.put("Item0", "Value0"); hashmap.put("Item1", "Value1"); hashmap.put("Item2", "Value2"); hashmap.put("Item3", "Value3"); Set set = hashmap.entrySet(); Iterator iterator = set.iterator(); while (iterator.hasNext() { Map.Entry mapentry = (Map.Entry) iterator.next(); System.out.println(mapentry.getkey() + "/" + mapentry.getValue()); } } 注意,这里Map的按键必须是唯一的,比如说不能有两个按键都为null。 如果用过它,就会知道它的用处了。 又比如: Map map = new HashMap(); map.put("Order", (Order) obj); 资料: Collection容器中包含Set和List接口,Set中又包含HashSet,List中包含LinkedList和ArrayList;单独的Map接口中只有HashMap。 java.util 中的集合类包含Java 中某些最常用的类。最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形,其中的数据有顺序且可以重复。而Set中数据无顺序且不可以重复。

can与could的用法详解及情态动词有关习题

c a n与c o u l d的用法详解及情态动词有关习题 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

can与could的用法详解 一、表示能力 (1)表示现在的能力,用can: My sister can drive. 我妹妹会开车。 Everyone here can speak English. 这儿人人会说英语。 (2)表示将来的能力,通常不用can或could,而用be able to的将来时态: I’ll be able to speak French in another few months. 再过几个月我就会讲法语了。 One day people will be able to go to the moon on holiday. 总有一天人们可以到月球上去度假。 但是,若表示现在决定将来是否有能力做某事,则可用 can: Can you come to the party tomorrow 你明天能来参加我们的聚会吗 (3)表示过去的能力,有时可用could,有时不能用could,具体应注意以下几点: ①若表示过去一般的能力(即想做某事就随时可做某事的能力),可用could: Could you speak English then 那时候你会说英语吗 ②若表示过去的特定能力(即在过去特定场合做某事的能力),则不能用could,而用w as (were) able to do sth,或用 managed to do sth,或用 succeeded in doing sth 等。 He studied hard and was able to pass the exam. 他学习很努力,所以考试能及格。 At last he succeeded in solving the problem. 他终于把那个问题解决了。 【注】could 不用来表示过去特定能力通常只限于肯定句,否定句或疑问句中,它则可以表示过去特定的能力: I managed to find the street, but I couldn’t find her house. 我想法找到了那条街,但没找到她的房子。(前句为肯定句用managed to,不用could,后句为否定句,可用could)另外,could还可与表示感知的动词(如see, hear, smell, taste, feel, understand等)连用表示的特定能力: Looking down from the plane, we could see lights on the runway. 从飞机上向下看,我们可以看见机场跑道上的点点灯火。 还有在中,could也可表示: He said he could see me next week. 他说他下周能见我。 二、表示许可 (1)对于现在或将来的“许可”,要区分以下两种情况: ①表示(即请求别人允许自己做某事),两者均可用,但用could 语气更委婉: Can [Could] I come in 我可以进来吗

suggest用法

suggest [原句] Tom, can you suggest any good books for my project? (P12) [点拨] suggest作及物动词,在这里表示“建议;提议”。其常用搭配有: a. suggest sth Let me suggest this one. It’s an excellent watch, it looks good, and it only costs $50. 让我向您建议这个。这是一块非常好的手表,看起来美观,而且只卖五十美元。 They were wondering where to hold the party and I suggested the Italian restaurant near the station. 他们不知道到哪里举行宴会,我提议了车站附近的意大利餐馆。 I’d suggest a visit to the Summer Palace. 我建议去颐和园参观。 b. suggest doing sth I suggestgoing to the park on Sunday. 我建议周日去公园。 My husband suggested eating out tonight to celebrate my birthday. 我丈夫建议今晚出去吃饭给我庆生。 c. suggest (that) sb (should) do sth I suggest that we wait a while before we make any decision. 我建议在做任何决定之前先等一会儿。 I suggest you give her a ring before you call on her. 我建议你拜访她之前先给她打个电话。 [拓展] (1) suggest可以表示“暗示;意味着”。如: His smile suggested that he was very happy. 他的微笑暗示了他非常高兴。 Are you suggesting that I look fat in these trousers? 你是在暗示我穿这条裤子显胖吗? His behaviour suggested a lack of interest in what we were doing. 他的举止意味着他对我们正在做的事缺乏兴趣。 (2) suggestion是其名词形式,意为“建议;提议”,常用于make a suggestion结构。如:She made some very helpful suggestions but her boss rejected them all. 她提出了几个非常有用的建议,但是她的老板把它们全给否决了。 [即学即练]补全句子。 (1) 我建议我们把这些学生分成四组。 I suggest that _____________________. (2)我不知道今天晚上穿什么。你有什么建议吗? I don’t know what to wear tonight. Have you got_____________? (3)他面色苍白,说明他身体不好。 His pale face ____________________. (4) 你能推荐个人做这份工作吗? Can you ________________ for this job?

集合里Map,Set,List的区别

Java中的Set,List,Map的区别 (转) 对JAVA的集合的理解是相对于数组 相对于数组的是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map没有 Collection接口的方法: boolean add(Object o) :向集合中加入一个对象的引用 void clear() :删除集合中所有的对象,即不再持有这些对象的引用 boolean isEmpty() :判断集合是否为空 boolean contains(Object o): 判断集合中是否持有特定对象的引用 Iterartor iterator() : 返回一个Iterator对象,可以用来遍历集合中的元素 boolean remove(Object o):从集合中删除一个对象的引用 int size() :返回集合中元素的数目 Object[] toArray() :返回一个数组,该数组中包括集合中的所有元素 关于:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。 Iterator接口声明了如下方法: hasNext(): 判断集合中元素是否遍历完毕,如果没有,就返回true next() :返回下一个元素 remove():从集合中删除上一个有next()方法返回的元素。 Set(集合): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类: HashSet : HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

英语情态动词用法总结(完整)

英语情态动词用法总结(完整) 一、单项选择情态动词 1.--- Difficulties always go with me! --- Cheer up! If God closes door in front of you, there be a window opened for you. A.must B.would C.could D.can 【答案】A 【解析】 【详解】 考查情态动词辨析。句意:——困难总是伴随着我!——高兴点! 如果上帝在你面前关上了门,一定有一扇窗户为你打开。A. must必须;B. would将要;C. could能,会;D. can能,会。must表示对现在的状态推测时,意为“一定”,表示可能性很大的推测。符合语境。故选A。 【点睛】 1) must用在肯定句中表示较有把握的推测,意为"一定"。 2) must表对现在的状态或现在正发生的事情的推测时, must 后面通常接系动词be 的原形或行为动词的进行式。 3) must 表示对已发生的事情的推测时,must 要接完成式。 4) must表示对过去某时正发生的事情的推测,must 后面要接完成进行式。 5) 否定推测用can't。 本句中的。must表示对现在的状态推测时,意为一定,表示可能性很大的推测。符合第2点用法。 2.Paul did a great job in the speech contest. He many times last week. A.need have practised B.might practise C.must have practised D.could practise 【答案】C 【解析】 【详解】 考查情态动词。句意:保罗在演讲比赛中表现得很好。他上星期一定练习了很多次。must have done是对过去发生的动作最有把握的猜测,意思是“一定”。故C选项正确。 3.He is a bad-tempered fellow, but he ________ be quite charming when he wishes. A.shall B.should C.can D.must 【答案】C 【解析】 【详解】 考查情态动词辨析。句意:他是个脾气不好的家伙,但当他希望自己有魅力的时候,他可

suggest用法归纳

关于suggest用法及常见错点的归纳 陕西延川中学:刘富祥 【摘要】:动词suggest有两层含义,可表示“建议,提议”或“暗示,表明”。后接名词、动名词、含疑问词的不定式或从句。作“提议,建议”讲时,宾语从句要用虚拟语气。但不能接不定式或复合宾语。下面分述如下: 一、它的用法。二、常见的错误。 【关键词】:不定式动名词复合宾语虚拟语气用法宾语从句建议提议错点 (一)动词suggest有如下一些用法: 一、有“建议”的意思。advise、propose也有此意,请比较它们用法的异同: (1)都可接名词做宾语 She suggested/advised/proposed an early start.她建议早一点出发。 We suggested/advised/proposed a visit to the museum the next day. 我们建议明天去参观博物馆。 (2)都可接动名词做宾语 I suggested/advised/proposed putting off the sports meets. 我建议将运动会延期。 They suggested/advised/proposed waiting until the proper time. 他们建议(我们)等到恰当的时机才行动。 (3)都可接that宾语从句,that从句用should+动词原形,should可以省略。 She suggested/advised/proposed that the class meeting (should)not be held on Saturday.她建议班会不要在星期六举行。 We suggested/advised/proposed that he (should) go and make an apology to his teacher.我们建议他去向老师道歉。 (4)advise可接动词不定式复合宾语,propose可接不定式做宾语。 I advised him to give up the foolish idea.=I suggested/proposed his/him giving up the foolish idea.我建议他放弃那愚蠢的念头。(suggest和propose在口语里可接动

java_Set,List,Map,Vector,ArrayList的区别

JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │└Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下: Iterator it = collection.iterator(); // 获得一个迭代子 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 } 由Collection接口派生的两个接口是List和Set。

使用suggest的常见错点

使用suggest的常见错点 一、误用不定式作宾语 要表示汉语的“建议做某事”,英语通常用suggest doing sth,而不能用suggest to do sth。如:他建议坐飞机去,可我认为这样花费太大。 正:He suggested going by plane, but I thought it would cost too much. 误:He suggested to go by plane, but I thought it would cost too much. 汤姆建议把房子卖了,但是安表示反对。 正:Tom suggested selling the house but Ann was against it. 正:Tom suggested to sell the house but Ann was against it. 二、汉语通常说“建议某人做某事”,但英语习惯上不能说suggest sb to do sth,而说suggest sb’s [sb]doing sth。也就是说,suggest 后不仅不接不定式,而且也不接不定式的复合结构。如: 他建议我们早点动身。 正:He suggested that we leave earlier. 误:He suggested us to leave earlier.

当然,我们也可以用后接that 从句的形式来表达此意思(注意谓语用“should+动词原形”这样的虚拟语气形式)。如: I suggest that we (should) have lunch right now. 我建议我们现在就吃午饭。 He suggests that we should all go to see the film. 他建议我们都去看电影。 比较以下同义表达: 他建议他们在没有听到事实真相之前什么都别说。正:He suggested (should) not saying anything till they heard the facts. 正:He suggested saying nothing about it till they heard the facts. 正:He suggested that they shouldn’t say anything till they heard the facts. 三、混用其后宾语从句的语气 suggest 后接宾语从句时,从谓语既可用陈述语气,也可用虚拟语气,其区别与suggest所表示的意思有关: 1. 若suggest 表示“建议”,则其后接的that 从

java中List的用法

java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表1所示。 表1 List接口定义的常用方法及功能 从表1可以看出,List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。 List接口的常用实现类有ArrayList和LinkedList,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList,例如: List l = new ArrayList();// 利用ArrayList类实例化List集合 List l2 = new LinkedList();// 利用LinkedList类实例化List集合 1.add(int index, Object obj)方法和set(int index, Object obj)方法的区别 在使用List集合时需要注意区分add(int index, Object obj)方法和 set(int index, Object obj)方法,前者是向指定索引位置添加对象,而后者是修改指定索引位置的对象,例如执行下面的代码: src\com\mwq\TestCollection.java关键代码: public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E"; List list = new LinkedList(); list.add(a);

英语情态动词的用法大全附解析

英语情态动词的用法大全附解析 一、初中英语情态动词 1.—We've got everything ready for the picnic. —Do you mean I __________ bring anything with me? A. can't B. mustn't C. couldn't D. needn't 【答案】 D 【解析】【分析】句意:—我们已经为野餐准备好了一切。—你的意思是我不必带任何东西吗?A. can't 不能;B. mustn't 表示禁止,一定不要;C. couldn't不能,表示过去时态;D. needn't不必。结合句意,故选D。 【点评】本题考查情态动词的用法。 2.—How amazing this robot is! —Wow, it has video cameras in its eyes, so it “see” and interact with pe ople. A. may B. can C. must D. should 【答案】 B 【解析】【分析】句意:—这个机器人多么惊人啊!—哇,在它的眼睛里有摄像机,因此它能看见和人打交道。A. may 可以,可能;表示许可,B. can 能;表示能力,C. must 必须;D. should应该;根据it has video cameras in its eyes,可知是有能力看见,故选B。 【点评】考查情态动词辨析。熟记情态动词的含义和用法。 3.—Where is George? —He _______ be here just now. His coffee is still warm. A. need B. can't C. must D. shouldn't 【答案】 C 【解析】【分析】句意:——乔治在哪里?——他刚才一定在这里,他的咖啡还是热的。A. need需要; B. can't 不能,不可能(表示推测); C. must 必须,一定(表示推测); D. shouldn't不应该;根据His coffee is still warm.可知表示肯定推测一定在这儿;故答案为C。 【点评】考查情态动词。掌握情态动词表推测时的意义和用法。 4.— Sorry, I forgot to take money with me. Maybe I can't buy the book you like. — Mum, you ______ worry about it. We can pay by Alipay (支付宝). A. can't B. needn't C. mustn't D. shouldn't 【答案】 B 【解析】【分析】句意:——对不起,我忘记带钱了。也许我不能买你喜欢的书。——妈妈,你不用担心。我们可以用支付宝支付。A. can't不能,指不允许或否定推测;B. needn't 不需,指没必要;C. mustn't不能,表禁止;D. shouldn't不应该,表建议。根据句意语境,本句是说妈妈不需要担心,故答案为B。 【点评】考查情态动词。理解句意并掌握情态动词的意义和用法区别。

动词suggest 的用法

动词suggest的用法: 一、有"建议"的意思.advise,propose 也有此义,请比较它们用法的异同: 1) 都可接名词作宾语 She suggested / advised / proposed an early start. 她建议早一点出发. We suggested / advised / proposed a visit to the museum the next day. 我们建议明天去参观博物馆. 2) 都可接动名词作宾语 I suggested / advised / proposed putting off the sports meet. 我建议将运动会延期. They suggested / advised / proposed waiting until the proper time. 他们建议(我们)等到恰当的时机才行动. 3) 都可接that 宾语从句,that从句用should+动词原形,should可以省略. She suggested / advised / proposed that the class meeting (should) not be held on Saturday. 她建议班会不要在星期六举行. We suggested / advised / proposed that he (should) go and make an apology to his teacher. 我们建议他去向老师道歉. 4) advise 可接动词不定式复合宾语,propose 可接不定式作宾语. I advised him to give up the foolish idea. = I suggested / proposed his / him giving up the foolish idea. 我建议他放弃那愚蠢的念头.(suggest和propose在口语里可接动名词的复合宾语). We proposed to start early. = We proposed starting early. 我们建议早一点出发.(接不定式不用suggest和advise) 二、有"提出"的意思.如: He suggested a different plan to his boss. 他向老板提出了一个不同的计划. Xiao Wang suggested a way to solve the problem. 小王提出了一个解决这个问题的办法. 三、有"暗示、表明"的意思.其主语往往是事物,而不是人. 1)接名词或动名词作宾语. The simple house suggested a modest income. 这座简朴的房子表明(房主的)收入并不高. Her pale face suggested bad health. 她脸色苍白,看来身体不好. The thought of summer suggests swimming. 一想到夏天就使人们联想到游泳. 2)接宾语从句,从句用陈述语气.如: The decision suggested that he might bring his family. 这个决定表明他可以把家属带来. The expression on his face suggested that he was very angry. 他脸上的表情表明他很生气. 四、在主语从句It is suggested that... 及名词suggestion 后面表示具体建议的表语从句、同位语从句都应用should+动词原形,should可以省略.如: It was suggested that we (should) give a performance at the party. 人们建议我们在晚会上表演节目. His suggestion was that the debts (should) be paid off first. 他的建议是先把债务还清. The doctors made a suggestion that the new hospital (should) not be set up on the hill. 医生们建议不要把新医院建在山上.

情态动词can和could用法详解

情态动词can 和could 用法详解 can 和could 用法详解 1. 表示能力,could 是can 的过去。如: Can you speak English? 你会说英语吗? Could you speak English then? 那时候你会说英语吗? 2. 表示许可,注意以下用法: (1)对于现在或将来的“许可” ,要区分以下两种情况: a. 表示请求允许(即请求别人允许自己做某事),可用can(=may)或could(=might)(注意:这 里的could 并不表示过去,而是表示现在,只是语气较委婉)。如: Can [May, Could, Might] I come in? 我可以进来吗? b. 表示给予允许(即自己允许别人做某事),一般只用can(=may), 而不能用could或might。如: A: Could [Can] I use your pen? 我可以借用你的钢笔吗? B: Yes, of course you can. 当然可以。(注意: 此处不用Yes, you could) (2)对于过去的“许可” ,也要区分以下两种情况: a. 表示过去一般性允许(即表示某人随时都可以做某事),用can的过去式(即could)。如:When I lived at home, I could watch TV whenever I wanted to. 我住在家里时,想什么时候看电影就可以什么时候看(一般性允许)。 b. 表示过去特定的允许(即表示在过去某一特定情况下允许进行某一活动),则不用could, 而需换成其它表达(如:had permission 或was [were] allowed to)。如: I was allowed to see the film yesterday evening. 昨天晚上允许我去看了电影(特定的允许,所以不能用could)。 3. 表示推测: (1)对现在或将来的推测,can 通常只用于否定句或疑问句中,一般不用于肯定句: It can't be true. 那不可能是真的。 What can they be doing? 他们会在干什么呢? Can it be Jim? 那会是吉姆吗? 但could(可以表示现在)则可用于肯定句中: We could [may, might] go to Guilin this summer. 今年夏天我们可能要去桂林。(将来可能性)You could [may, might] be right, but I don 't think you are. 你可能是对的,但我并不认为你是

Java Map集合

java.util 中的集合类包含Java 中某些最常用的类。最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和V ector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将List 看作是具有数值键的Map。而实际上,除了List 和Map 都在定义java.util 中外,两者并没有直接的联系。本文将着重介绍核心Java 发行套件中附带的Map,同时还将介绍如何采用或实现更适用于您应用程序特定数据的专用Map。 了解Map 接口和方法 Java 核心类中有很多预定义的Map 类。在介绍具体实现之前,我们先介绍一下Map 接口本身,以便了解所有实现的共同点。Map 接口定义了四种类型的方法,每个Map 都包含这些方法。下面,我们从两个普通的方法(表1)开始对这些方法加以介绍。 表1:覆盖的方法。我们将这Object 的这两个方法覆盖,以正确比较Map 对象的等价性。 Map 构建 Map 定义了几个用于插入和删除元素的变换方法(表2)。 表2:Map 更新方法:可以更改Map 内容。 尽管您可能注意到,纵然假设忽略构建一个需要传递给putAll() 的Map 的开销,使用putAll() 通常也并不比使用大量的put() 调用更有效率,但putAll() 的存在一点也不稀奇。这是因为,putAll() 除了迭代put() 所执行的将每个键值对添加到Map 的算法以外,还需要迭代所传递的Map 的元素。但应注意,putAll() 在添加所有元素之前可以正确调整Map 的大小,因此如果您未亲自调整Map 的大小(我们将对此进行简单介绍),则putAll() 可能比预期的更有效。 查看Map 迭代Map 中的元素不存在直接了当的方法。如果要查询某个Map 以了解其哪些元素满足特定查询,或如果要迭代其所有元素(无论原因如何),则您首先需要获取该Map 的“视图”。有三种可能的视图(参见表3) 所有键值对—参见entrySet() 所有键—参见keySet() 所有值—参见values() 前两个视图均返回Set 对象,第三个视图返回Collection 对象。就这两种情况而言,问题到这里并没有结束,这是因为您无法直接迭代Collection 对象或Set 对象。要进行迭代,

英语情态动词用法详解

英语情态动词用法详解 一、单项选择情态动词 1.Look! There are so many mistakes in your composition. You ________ have fixed full attention on it. A.can B.should C.need D.might 【答案】B 【解析】 【详解】 考查情态动词。句意:看!你的作文里有那么多的错误。你本应该把所有的注意力都集中在它上面的。表示“本应该做但实际上没有做”应该用should have done结构,can have done 表示可能;need表示需要;might have done表示可能做过某事;故选B。 2.---Hi, Johnson, any idea where Susan is? ---It is class time, so she __________ in the classroom now. A.can be B.must have been C.might have been D.should be 【答案】D 【解析】 考查情态动词的用法。A. can be可能,可以是;B. must have been一定(对过去事实肯定的推测);C. might have been可能(对过去事实肯定的推测);D. should be应该是。句意:—知道苏珊在哪里吗?—现在是上课时间,她应该在教室里。故答案选D。 3.The room is so clean. He ________ have cleaned it yesterday evening. A.will B.need C.can D.must 【答案】D 【解析】 【详解】 考查情态动词表推测。句意:房间如此干净,他一定是昨天晚上打扫过了。must have done 表示对过去发生的事情有把握的猜测,意思是“一定(做过)”,故D项正确。 4.— Excuse me, do you mind if I open the window? — Well, if you __________. I can put on more clothes. A.can B.may C.must D.shall 【答案】C 【解析】

suggest用法总结及易混词比较

1. suggest+ 名词/代词或suggest+名词/代词to+人,但不能说suggest sb sth ,即不能加双宾做宾语Eg:We suggest him the plan (Χ) We suggest the plan to him(√) 2. suggest+doing sth Eg:He suggested going out for a walk. 注意:suggest 不可以加不定式,所以上面的句子不可以这样写: He suggested to go out for a walk.(Χ) 3. suggest +(that )+主语+(should) do+sth 其中的should 可以省略 eg: He suggested that you should go there tomorrow. =He suggested you go there tomorrow. 注意:suggest 不可以加不定式的复合结构 He suggested you to go there tomorrow. X 4. it is suggested that +主语+(should )do sth eg: It is suggested that the work (should) be finished at once.马上 5. suggestion做主语时,其后的表语从句也用这个结构即: The suggestion is that +主语+should +do sth eg: His suggestion is that I should leave for Beijing immediately. 6.suggest 表示“暗示或表明”之意,注意此时做主语时后面的表语从句用陈述语气 eg: Her yawn suggested that she was sleepy. 她哈欠连天表明她困了。 一、有“建议”的意思。advise、propose也有此意,请比较它们用法的异同: 1)都可接名词做宾语 She suggested/advised/proposed an early start.她建议早一点出发。 We suggested/advised/proposed a visit to the museum the next day.我们建议明天去参观博物馆。 2)都可接动名词做宾语 I suggested/advised/proposed putting off the sports meet.我建议将运动会延期。 They suggested/advised/proposed waiting until the proper time.他们建议(我们)等到恰当的时机才行动。 3)都可接that宾语从句,that从句用should+动词原形,should可以省略。 She suggested/advised/proposed that the class meeting (should) not be held on Saturday.她建议班会不要在星期六举行。 We suggested/advised/proposed that he (should) go and make an apology to his teacher.我们建议他去向老师道歉。 4)advise可接动词不定式复合宾语,propose可接不定式做宾语

相关文档
最新文档