nginx upstream模块对于nginx 最为代理服务器提供了基础功能 结合upstream功能 nginx能对代理进行各种处理
nginx upstream基础数据结构
typedef struct {
ngx_uint_t status; //http状态码
ngx_msec_t response_time; //上游服务器响应时间
ngx_msec_t connect_time; //成功连接上游服务器时间
ngx_msec_t header_time; //头部时间耗费 处理完成上游服务器返回头部的时间和响应时间差
off_t response_length; //http包体和头部总长度
off_t bytes_received; //upstream接收到的字节数
ngx_str_t *peer; //上游服务器地址(ip或名称)
} ngx_http_upstream_state_t;
state结构体中的成员可以绑定到nginx http变量中 从而可以在nginx access中打印出请求的对应上述变量信息
upstream main作用域可配置信息
typedef struct {
ngx_hash_t headers_in_hash; //其他模块配置的hash头部信息} ngx_http_upstream_main_conf_t;
upstream server结构
typedef struct {
ngx_str_t name; //server名称} ngx_http_upstream_server_t;
upstream peer结构
typedef struct {
ngx_http_upstream_init_pt init_upstream; //peer配置初始化
ngx_http_upstream_init_peer_pt init; //peer初始化
void *data; //传入的数据地址
} ngx_http_upstream_peer_t;
nginx server作用域配置结构
struct ngx_http_upstream_srv_conf_s {
ngx_http_upstream_peer_t peer; //upstream peer
void **srv_conf;
ngx_array_t *servers;
ngx_uint_t flags; //可支持的标志ngx_shm_zone_t *shm_zone; // upstream共享内存
#endif};
upstream local 上游服务器解析绑定到本机地址
typedef struct {
ngx_addr_t *addr;
ngx_http_complex_value_t *value;
#if (NGX_HAVE_TRANSPARENT_PROXY)
ngx_uint_t transparent; /* unsigned transparent:1; */
#endif
} ngx_http_upstream_local_t
upstream 可配置结构 可以被其它模块进行配置
typedef struct {
ngx_http_upstream_srv_conf_t *upstream; //upstream server域配置指针
ngx_msec_t connect_timeout; //连接超时时间
ngx_msec_t send_timeout; //可写数据超时时间
ngx_msec_t read_timeout; //可读数据超时时间
ngx_msec_t next_upstream_timeout; //满足next测试请求到另一台服务器超时时间
size_t send_lowat; //upstream发送低潮度值
size_t buffer_size; //nginx buffer缓冲区大小 默认ngx_pagesize大小
size_t limit_rate; //读取upstream速度限制
size_t busy_buffers_size; // event_pipe "busy" 缓冲区大小
size_t max_temp_file_size; //最大临时文件大小 默认1GB
size_t temp_file_write_size; //event_pipe临时文件写入大小 默认2 * buffer_size
size_t busy_buffers_size_conf; //busy_buffer配置大小
size_t max_temp_file_size_conf; //最大临时文件配置大小
size_t temp_file_write_size_conf; //临时写入配置大小
ngx_bufs_t bufs; //event_pipe配置的buffer缓冲组
ngx_uint_t ignore_headers; //upstream配置的可忽略的头部
ngx_uint_t next_upstream;//upstream配置的next请求位
ngx_uint_t store_access; //store指令保存文件的权限
ngx_uint_t next_upstream_tries;// upstream next尝试的次数
ngx_flag_t buffering; //是否进行buffering缓冲
ngx_flag_t request_buffering; //是否缓存请求包体
ngx_flag_t pass_request_headers; //请求头直接通过
ngx_flag_t pass_request_body; //请求体直接通过
ngx_flag_t ignore_client_abort; //忽略客户端退出
ngx_flag_t intercept_errors; //可否被错误拦截
ngx_flag_t cyclic_temp_file; //event_pipe临时文件能否循环使用
ngx_flag_t force_ranges; //是否忽略代理的响应的"Accept-Ranges"
ngx_path_t *temp_path; //临时文件路径
ngx_hash_t hide_headers_hash; //未使用
ngx_array_t *hide_headers; //隐藏的头部
ngx_array_t *pass_headers;//允许通过的头部
ngx_http_upstream_local_t *local; //本地upstream
#if (NGX_HTTP_CACHE)
ngx_shm_zone_t *cache_zone; //缓存zone
ngx_http_complex_value_t *cache_value; //缓存zone变量
ngx_uint_t cache_min_uses; //缓存最少使用次数 超出便缓存
ngx_uint_t cache_use_stale; //缓存出错 直接发送缓存中的旧数据
ngx_uint_t cache_methods; //满足条件请求method进行缓存
off_t cache_max_range_offset; //最大可缓存大小
ngx_flag_t cache_lock; //是否启用缓存锁
ngx_msec_t cache_lock_timeout; //缓存锁超时时间
ngx_msec_t cache_lock_age; //缓存锁时间
ngx_flag_t cache_revalidate; //缓存信息更新
ngx_flag_t cache_convert_head; //HEAD变 GET} ngx_http_upstream_conf_t;
upstream上游服务器返回头部处理
typedef struct {
ngx_str_t name; //http头部key值
ngx_http_header_handler_pt handler; //返回头部处理
ngx_uint_t offset; //上游服务器返回头部结构成员偏移量
ngx_http_header_handler_pt copy_handler; //头部信息拷贝
ngx_uint_t conf; //http返回头偏移量
ngx_uint_t redirect; //是否随上游返回头部x_accel_redirect 跳转
} ngx_http_upstream_header_t
upstream DNS解析结构
typedef struct {
ngx_str_t host; //主机 可以为IP或者域名
in_port_t port; //端口
ngx_uint_t no_port; //无端口标记
ngx_uint_t naddrs; //解析出的地址数量
ngx_resolver_addr_t *addrs; //解析出的地址信息
struct sockaddr *sockaddr; //socket地址
socklen_t socklen; //socket地址长度
ngx_resolver_ctx_t *ctx; //域名解析器上下文
} ngx_http_upstream_resolved_t
upstream在http请求结构
struct ngx_http_upstream_s {
ngx_http_upstream_handler_pt read_event_handler; //读事件处理函数
ngx_http_upstream_handler_pt write_event_handler; //写事件处理函数
#endif
unsigned buffering:1;//upstream params (由其它模块配置 可以配置多个)
typedef struct {
ngx_str_t key;
ngx_str_t value;
ngx_uint_t skip_empty; //跳过空格标记
} ngx_http_upstream_param_t
upstream上下游服务器数据处理关键结构 ngx_event_pipe结构详解
upstream 表示上游服务器 downstream 表示下游请求端
event_pipe 可以设置input_filter对上游服务器返回的数据进行处理 同时也能设置output_filter对响应到下游请求端的数据进行处理
struct ngx_event_pipe_s {
ngx_connection_t *upstream; //与上游服务器的tcp连接* from the raw bufs to an incoming chain */
ngx_event_pipe_input_filter_pt input_filter; //上游服务器返回数据filtertime_t start_sec; //event_pipe开始处理的时间
ngx_temp_file_t *temp_file; //临时文件地址
/* STUB */ int num; //STUB信息 buf使用计数