死siua11 发表于 2019-1-1 08:00:20

B6

  B6-Haproxy 与 KeepAlive

  
1. Haproxy 与 KeepAlive
2. KeepAlive的原理
3. 影响 Haproxy Keepalive的参数
4. 测试 Haproxy keepalive
5. HTTP协议的头部字段


1. Haproxy 与 KeepAlive
KeepAlive 就是通常所称的长连接,KeepAlive带来的好处是可以减少tcp连接的开销,这对于短response body的请求效果更加明显,同时可以为采用HTTP协议的交互式应用提供良好的session支持,Hapxoxy作为一款开源的LoadBalance,老版本不能支持KeepAlive,不过自从1.4.dev5开始支持Client端的KeepAlive。

2. KeepAlive的原理
http://blog.运维网.com/attachment/201301/150756268.png
  
HTTP1.0和HTTP1.1协议中都有对KeepAlive的支持,其中HTTP1.0需要在request中增加"Connection: keep-alive" header才能够支持,而HTTP1.1默认支持。
  
HTTP1.0 KeepAlive支持的数据交互流程如下:
a)Client发出request,其中该request的HTTP版本号为1.0,同时在request中包含一个header:"Connection: keep-alive"。
b)Web Server收到request中的HTTP协议为1.0及"Connection: keep-alive"就认为是一个长连接请求,其将在response的header中也增加"Connection: keep-alive",同时不会关闭已建立的tcp连接。
c)Client收到Web Server的response中包含"Connection: keep-alive",就认为是一个长连接不close tcp连接,并用该tcp连接再发送request。(跳转到a)
HTTP1.1 KeepAlive支持的数据交互流程如下:
a)Client发出request,其中该request的HTTP版本号为1.1。
b)Web Server收到request中的HTTP协议为1.1就认为是一个长连接请求,其将在response的header中也增加"Connection: keep-alive"。同时不会关闭已建立的tcp连接。
c)Client收到Web Server的response中包含"Connection: keep-alive",就认为是一个长连接,不close tcp连接,并用该tcp连接再发送request。(跳转到a)

3. 影响 Haproxy Keepalive的参数
option httpclose
Enable or disable passive HTTP connection closing
May be used in sections: defaults | frontend | listen | backend
                            yes   |    yes   |   yes|   yes
Arguments : none
默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request;
如果设置了 "option httpclose",则会检查双向的http头是否有"Connection: close",如果没有则自动添加;
以保证每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下;
任何 "Connection" 头如果不是"close"都会被移除。
很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准;
如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接;
选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
这个选项可以设置在frontend或backend上,只要其上可以建立连接,如果同时设置了"option forceclose",那么它比"httpclose"优先;
如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。

option forceclose
Enable or disable active connection closing after response is transferred.
May be used in sections :   defaults | frontend | listen | backend
                               yes   |    yes   |   yes|   yes
Arguments : none
有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会一直打开,直到超时;
这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间;
此时,可以使用 "option forceclose",当完成响应时立即关闭对外的服务通道,该选项隐式打开httpclose选项;
需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源;
如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。

option http-server-close
Enable or disable HTTP connection closing on the server side启用或禁止关闭服务端的HTTP连接
May be used in sections :   defaults | frontend | listen | backend
                               yes   |    yes   |   yes|   yes
Arguments : none
该选项设置server端为HTTP连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式;
提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose";
还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616;
需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用;
解决方法是启用 "option http-pretend-keepalive".
keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
这个操作可以设置在frontend或backend上,只要其上可以建立连接,需要注意的是这个选项可以与 "option httpclose"结合;
但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。

option http-pretend-keepalive
Define whether haproxy will announce keepalive to the server or not
May be used in sections :   defaults | frontend | listen | backend
                               yes   |    yes   |   yes|   yes
Arguments : none
当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close";
然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的;
它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了;
设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题;
当haproxy获取了完整的response, 才会以类似forceclose的方式关闭服务端,这样客户端得到一个普通的响应,连接也在服务端被正常关闭;
建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存;
而且网络上的数据包也会略微降低整体的峰值性能,但是启用该选项,haproxy会略微少做一些工作;
所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU;
这个选项可以设置在frontend或backend上,只要其上可以建立连接;
这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
在默认的情况下haproxy与客户端和服务端都是会话保持的了。如果有用户A、B同时
访问代理服务器,那么很可能只有第一个用户的header会被发给服务器。可以参考如下模型

4. 测试 Haproxy keepalive
注意:假如请求的url,包含1个css 和1个png
4.1 haproxy 代码


[*]option httpclose

  
http://blog.test.com/
请求头信息
GET / HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:10:41 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.6
X-Pingback: http://blog.test.com/xmlrpc.php
Content-Encoding: gzip
Set-Cookie: SERVERID=blog02; path=/

http://blog.test.com/wp-content/themes/twentyeleven/style.css
请求头信息
GET /wp-content/themes/twentyeleven/style.css HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/css,*/*;q=0.1
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://blog.test.com/
Cookie: SERVERID=blog02
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:10:41 GMT
Content-Type: text/css
Last-Modified: Wed, 18 Jul 2012 03:25:51 GMT
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Expires: Fri, 02 Nov 2012 06:10:41 GMT
Cache-Control: max-age=3600
Content-Encoding: gzip

http://blog.test.com/wp-content/themes/twentyeleven/images/headers/pine-cone.jpg
请求头信息
GET /wp-content/themes/twentyeleven/images/headers/pine-cone.jpg HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://blog.test.com/
Cookie: SERVERID=blog02
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:10:41 GMT
Content-Type: image/jpeg
Content-Length: 39112
Last-Modified: Wed, 18 Jul 2012 03:25:51 GMT
Connection: close
Expires: Thu, 29 Aug 2013 05:10:41 GMT
Cache-Control: max-age=25920000
Accept-Ranges: bytes

4.2 变更haproxy 代码


[*]option http-server-close

  
http://blog.test.com/
请求头信息
GET / HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:24:30 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.6
X-Pingback: http://blog.test.com/xmlrpc.php
Content-Encoding: gzip
Set-Cookie: SERVERID=blog01; path=/

http://blog.test.com/wp-content/themes/twentyeleven/style.css
请求头信息
GET /wp-content/themes/twentyeleven/style.css HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/css,*/*;q=0.1
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://blog.test.com/
Cookie: SERVERID=blog01
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:24:30 GMT
Content-Type: text/css
Last-Modified: Wed, 18 Jul 2012 03:25:51 GMT
Transfer-Encoding: chunked
Vary: Accept-Encoding
Expires: Fri, 02 Nov 2012 06:24:30 GMT
Cache-Control: max-age=3600
Content-Encoding: gzip

http://blog.test.com/wp-content/themes/twentyeleven/images/headers/pine-cone.jpg
请求头信息
GET /wp-content/themes/twentyeleven/images/headers/pine-cone.jpg HTTP/1.1
Host: blog.test.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://blog.test.com/
Cookie: SERVERID=blog01
响应头信息
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 02 Nov 2012 05:24:30 GMT
Content-Type: image/jpeg
Content-Length: 39112
Last-Modified: Wed, 18 Jul 2012 03:25:51 GMT
Expires: Thu, 29 Aug 2013 05:24:30 GMT
Cache-Control: max-age=25920000
Accept-Ranges: bytes
注意:对比可以发现,变更为 http-server-close 参数后,响应头信息没有Connection: close 字段

5. HTTP协议的头部字段
Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
Accept-Charset: 浏览器申明自己接收的字符集
Accept-Encoding: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
Accept-Language:浏览器申明自己接收的语言(语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等)
Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。
Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。
Cache-Control:
    请求:
    no-cache(不要缓存的实体,要求现在从WEB服务器去取)
    max-age(只接受 Age 值小于 max-age 值,并且没有过期的对象)
    max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)
    min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
    响应:
    public(可以用 Cached 内容回应任何用户)
    private(只能用缓存内容回应先前请求该内容的那个用户)
    no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)
    max-age:(本响应包含的对象的过期时间)
    ALL: no-store(不允许缓存)
Connection:
    请求:
    close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
    keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
    响应:
    close(连接已经关闭)。
    keepalive(连接保持着,在等待本次连接的后续请求)。
    Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300
Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip
Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
Content-Length: WEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012
Content-Range: WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022
Content-Type: WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml
ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了其 Etag 也会别修改;
      所以ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器判断一个对象是否改变了;
      比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给WEB 服务器;
      然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。
Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。
         是 HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。例如:Host:rss.sina.com.cn
If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。
If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。
If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。
          浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。
Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。例如:Pragma:no-cache
Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。
Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。
Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546-
Referer:浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。例如:Referer:http://www.sina.com/
Server:WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)
User-Agent:浏览器表明自己的身份(是哪种浏览器)。
Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。
Vary:WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。
   假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content- Encoding: gzip; Vary: Content-Encoding;
   那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法;
   这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding
Via:列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求;
   当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息;
   当下一个代理服务器收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via 头部;
   并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由;
   例如:Via:1.0 236.D0707195.sina.com.cn:80 (squid/2.6.STABLE13)

附上:HTTP 1.1状态代码及其含义
状态代码状态信息含义
100Continue初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
101Switching Protocols服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)
200OK一切正常,对GET和POST请求的应答文档跟在后面。
201Created   服务器已经创建了文档,Location头给出了它的URL。
202Accepted已经接受请求,但处理尚未完成。
203Non-Authoritative Information文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
204No Content   没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205Reset Content没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206Partial Content   客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
300Multiple Choices客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302Found类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。
            出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。      
            注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠);
            有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
303See Other   类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304Not Modified客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。
                   服务器告诉客户,原来缓冲的文档还可以继续使用。
305Use Proxy   客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307Temporary Redirect和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST;
                         即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307;
                         以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;
                         如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)
400Bad Request请求出现语法错误。
401Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框;
                  然后在填写合适的Authorization头后再次发出请求。
403Forbidden资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404Not Found无法找到指定位置的资源。这也是一个常用的应答。
405Method Not Allowed请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)
406Not Acceptable指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。
407Proxy Authentication Required类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
408Request Timeout在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
409Conflict通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
410Gone所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置;
         而404表示由于未知的原因文档不可用。(HTTP 1.1新)
411Length Required服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
412Precondition Failed请求头中指定的一些前提条件失败(HTTP 1.1新)。
413Request Entity Too Large目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求;
                               则应该提供一个Retry-After头(HTTP 1.1新)。
414Request URI Too LongURI太长(HTTP 1.1新)。
416Requested Range Not Satisfiable服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
500Internal Server Error服务器遇到了意料不到的情况,不能完成客户的请求。
501Not Implemented服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
502Bad Gateway服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
503Service Unavailable服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。
                        服务器返回503时可以提供一个Retry-After头。
504Gateway Timeout由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
505HTTP Version Not Supported服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

参考
nginx与haproxy负载均衡时处理keepalive与X-Forwarded-For的问题
http://blog.chinaunix.net/uid-20553497-id-3071866.html
HAproxy Client KeepAlive
http://blog.chinaunix.net/uid-10249062-id-163269.html
Haproxy参数配置
http://blog.163.com/guixl_001/blog/static/417641042011119115554441/
HAProxy 配置手册 4.2 httpclose 相关
http://hi.baidu.com/maiyudaodao/item/c0bbd98f3b2820c0b17154e7
HTTP协议头部与Keep-Alive模式详解
http://a280606790.iteye.com/blog/1095085
HTTP的请求头标签 If-Modified-Since
http://tech.ddvip.com/2010-03/1269412477148135.html
HTTP 1.1与HTTP 1.0的比较
http://blog.csdn.net/elifefly/article/details/3964766
  更多请:
linux 相关274134275 , 37275208(已满)
vmware 虚拟化相关166682360



页: [1]
查看完整版本: B6