HTTP 响应

HTTP 响应和 HTTP 请求看起来很相似,他们都被称作 HTTP 报文。一个响应看起来像这样:

  1. 行数 内容
  2. 1 HTTP/1.1 200 OK
  3. 2 Content-length: 350
  4. 3 Content-Type: text/html

在特殊情况下会出现 1xx 状态码的响应,代表信息性的响应,这类报文不包含其他部分的信息,只是一种信号,用来告诉客户端继续传输数据。如果出现了 100 响应,则下一个响应会是一个非 100 的响应。这意味着出现多个响应的时候,其中可能包含有一个单独的信息性响应,这只会出现在keep-alive模式下(1xx 信息仅在 HTTP/1.1 中可用)。HAProxy 能正确识别并忽略此类信号,只处理非 100 的响应,鉴于此,除非明确声明,否则此类信息不会被日志记录或被传递。

状态码 101 的信息表明当前连接正在切换协议,此时 HAProxy 必须像处理一个CONNECT信号一样切换到 tunnel 模式,接着一个Upgrade头会携带附加协议切换信息被传输过来。

响应行

第一行是响应行,它总是由三部分组成:

  • 一个版本标签:HTTP/1.1
  • 一个状态码:200
  • 一个解释:OK状态码总是由三位数组成,其中第一位数代表状态的类别:

  • 1xx:请求已接受,需要继续处理

  • 2xx:OK,接下来是内容
  • 3xx:OK,接下来没有内容
  • 4xx:客户端错误
  • 5xx:服务端错误如果需要查看所有状态码和它对应的意思,请参看 RFC7231,里面的Reason不是客户端解析出来的,经供参考而已,因为你可能看到任何意想不到的东西,不过大家通常都会遵循这些既定的信息。它可能由一个或多个单词组成,比如OKFoundAuthentication Required

HAProxy 可能自身会输出以下信息:

  1. 状态码 何时/何因
  2. 200 打开 state 页面,或响应一个监控状态时
  3. 301 执行一个跳转时(取决于配置)
  4. 302 执行一个跳转时(取决于配置)
  5. 303 执行一个跳转时(取决于配置)
  6. 307 执行一个跳转时(取决于配置)
  7. 308 执行一个跳转时(取决于配置)
  8. 400 遇到一个过大或者非法的请求时
  9. 401 执行一个动作时需要鉴权 (在打开 state 页面时)
  10. 403 当被“blockACL 规则或“reqdeny”过滤器拒绝时
  11. 408 当请求完成前因超时而中断时
  12. 500 当当前代理遇到了不应出现的、无法恢复的错误,比如内存分配出错时
  13. 502 当后端服务器返回了空的、非法的或不完整的响应,或被“rsdeny”过滤器中断时
  14. 503 当没有后端服务器去处理请求或在响应监控请求时遇到了“monitor fail”条件时
  15. 504 当没有得到后端响应就因超时而中断时

上述的 4xx 和 5xx 状态码可以自定义(参看章节 4.2)。

响应头

响应头和请求头的工作原理一致,故 HAProxy 用相同的解析函数来处理。

请参看章节 1.2。