- 12.1.3 ngx_http_upstream_conf_t配置结构体
- define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002
- define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES 0x00000004
- define NGX_HTTP_UPSTREAM_IGN_EXPIRES 0x00000008
- define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL 0x00000010
- define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE 0x00000020
- define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE 0x00000040
- define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING 0x00000080
- define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET 0x00000100*/
12.1.3 ngx_http_upstream_conf_t配置结构体
ngx_http_upstream_t结构体中的conf成员是非常关键的,它指定了upstream的运行方式。注意,它必须在启动upstream机制前设置。下面来看看这个结构体中各个成员的意义。
typedef struct{
/当在ngx_http_upstream_t结构体中没有实现resolved成员时,upstream这个结构体才会生效,它会定义上游服务器的配置/
ngx_http_upstream_srv_conf_t*upstream;
/建立TCP连接的超时时间,实际上就是写事件添加到定时器中时设置的超时时间,参见图12-3中的第8步/
ngx_msec_t connect_timeout;
/发送请求的超时时间。通常就是写事件添加到定时器中设置的超时时间,参见图12-4中的第3步/
ngx_msec_t send_timeout;
/接收响应的超时时间。通常就是读事件添加到定时器中设置的超时时间,参见图12-4中的第5步/
ngx_msec_t read_timeout;
//目前无意义
ngx_msec_t timeout;
//TCP的SO_SNOLOWAT选项,表示发送缓冲区的下限
size_t send_lowat;
/*定义了接收头部的缓冲区分配的内存大小(ngx_http_upstream_t中的buffer缓冲区),当不转发
响应给下游或者在buffering标志位为0的情况下转发响应时,它同样表示接收包体的缓冲区大小*/size_t buffer_size;
/仅当buffering标志位为1,并且向下游转发响应时生效。它会设置到ngx_event_pipe_t结构体的busy_size成员中,具体含义参见12.8.1节/
size_t busy_buffers_size;
/在buffering标志位为1时,如果上游速度快于下游速度,将有可能把来自上游的响应存储到临时文件中,而max_temp_file_size指定了临时文件的最大长度。实际上,它将限制ngx_event_pipe_t结构体中的temp_file/
size_t max_temp_file_size;
//表示将缓冲区中的响应写入临时文件时一次写入字符流的最大长度
size_t temp_file_write_size;
//以下3个成员目前都没有任何意义
size_t busy_buffers_size_conf;
size_t max_temp_file_size_conf;
size_t temp_file_write_size_conf;
//以缓存响应的方式转发上游服务器的包体时所使用的内存大小
ngx_bufs_t bufs;
/*针对ngx_http_upstream_t结构体中保存解析完的包头的headers_in成员,ignore_headers可以按照二进制位使得upstream在转发包头时跳过对某些头部的处理。作为32位整型,理论上ignore_headers最多可以表示32个需要跳过不予处理的头部,然而目前upstream机制仅提供8个位用于忽略8个HTTP头部的处理,包括:
define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002
define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES 0x00000004
define NGX_HTTP_UPSTREAM_IGN_EXPIRES 0x00000008
define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL 0x00000010
define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE 0x00000020
define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE 0x00000040
define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING 0x00000080
define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET 0x00000100*/
ngx_uint_t ignore_headers;
/以二进制位来表示一些错误码,如果处理上游响应时发现这些错误码,那么在没有将响应转发给下游客户端时,将会选择下一个上游服务器来重发请求。参见12.9节中介绍的ngx_http_upstream_next方法/
ngx_uint_t next_upstream;
/在buffering标志位为1的情况下转发响应时,将有可能把响应存放到临时文件中。在ngx_http_upstream_t中的store标志位为1时,store_access表示所创建的目录、文件的权限/
ngx_uint_t store_access;
/决定转发响应方式的标志位,buffering为1时表示打开缓存,这时认为上游的网速快于下游的网速,会尽量地在内存或者磁盘中缓存来自上游的响应;如果buffering为0,仅会开辟一块固定大小的内存块作为缓存来转发响应/
ngx_flag_t buffering;
//暂无意义
ngx_flag_t pass_request_headers;
//暂无意义
ngx_flag_t pass_request_body;
/表示标志位。当它为1时,表示与上游服务器交互时将不检查Nginx与下游客户端间的连接是否断开。也就是说,即使下游客户端主动关闭了连接,也不会中断与上游服务器间的交互/
ngx_flag_t ignore_client_abort;
/当解析上游响应的包头时,如果解析后设置到headers_in结构体中的status_n错误码大于400,则会试图把它与error_page中指定的错误码相匹配,如果匹配上,则发送error_page中指定的响应,否则继续返回上游服务器的错误码。详见ngx_http_upstream_intercept_errors方法/
ngx_flag_t intercept_errors;
/buffering标志位为1的情况下转发响应时才有意义。这时,如果cyclic_temp_file为1,则会试图复用临时文件中已经使用过的空间。不建议将cyclic_temp_file设为1/
ngx_flag_t cyclic_temp_file;
//在buffering标志位为1的情况下转发响应时,存放临时文件的路径
ngx_path_t*temp_path;
/不转发的头部。实际上是通过ngx_http_upstream_hide_headers_hash方法,根据hide_headers和pass_headers动态数组构造出的需要隐藏的HTTP头部散列表/
ngx_hash_t hide_headers_hash;
/当转发上游响应头部(ngx_http_upstream_t中headers_in结构体中的头部)给下游客户端时,如果不希望某些头部转发给下游,就设置到hide_headers动态数组中/
ngx_array_t*hide_headers;
/当转发上游响应头部(ngx_http_upstream_t中headers_in结构体中的头部)给下游客户端时,upstream机制默认不会转发如“Date”、“Server”之类的头部,如果确实希望直接转发它们到下游,就设置到pass_headers动态数组中/
ngx_array_t*pass_headers;
//连接上游服务器时使用的本机地址
ngx_addr_t*local;
/当ngx_http_upstream_t中的store标志位为1时,如果需要将上游的响应存放到文件中,store_lengths将表示存放路径的长度,而store_values表示存放路径/
ngx_array_t*store_lengths;
ngx_array_t*store_values;
/到目前为止,store标志位的意义与ngx_http_upstream_t中的store相同,仍只有0和1被使用到/
signed store:2;
/上面的intercept_errors标志位定义了400以上的错误码将会与error_page比较后再行处理,实际上这个规则是可以有一个例外情况的,如果将intercept_404标志位设为1,当上游返回404时会直接转发这个错误码给下游,而不会去与error_page进行比较/
unsigned intercept_404:1;
/当该标志位为1时,将会根据ngx_http_upstream_t中headers_in结构体里的X-Accel-Buffering头部(它的值会是yes和no)来改变buffering标志位,当其值为yes时,buffering标志位为1。因此,change_buffering为1时将有可能根据上游服务器返回的响应头部,动态地决定是以上游网速优先还是以下游网速优先/
unsigned change_buffering:1;
//使用upstream的模块名称,仅用于记录日志
ngx_str_t module;
}ngx_http_upstream_conf_t;
ngx_http_upstream_conf_t结构体中的配置都比较重要,它们会影响访问上游服务器的方式。同时,该结构体中的大量成员是与如何转发上游响应相关的。如果用户希望直接转发上游的包体到下游,那就需要注意ngx_http_upstream_conf_t中每一个成员的意义了。