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_array_t upstreams; //可配置多个upstream
} ngx_http_upstream_main_conf_t;
upstream server结构
typedef struct {
ngx_str_t name; //server名称
ngx_addr_t *addrs; //server地址
ngx_uint_t naddrs; //地址数量
ngx_uint_t weight; //server对应的权重
ngx_uint_t max_conns; //指定server最大连接数
ngx_uint_t max_fails; //允许最多连接失败次数
time_t fail_timeout; //连接超时时间
ngx_msec_t slow_start; //未使用
ngx_uint_t down; //踢出
unsigned backup:1; //作为备用
NGX_COMPAT_BEGIN(6)
NGX_COMPAT_END
} 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_str_t host; //server主机地址
u_char *file_name; //conf配置文件名
ngx_uint_t line; //所在配置文件里行数
in_port_t port; //端口号
ngx_uint_t no_port; //没有端口号
#if (NGX_HTTP_UPSTREAM_ZONE)
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_flag_t cache_background_update; //缓存后台更新
ngx_array_t *cache_valid; //缓存状态码有效期
ngx_array_t *cache_bypass; //可通过测试的缓存
ngx_array_t *cache_purge; //缓存清理规则
ngx_array_t *no_cache;//不缓存的规则
#endif
ngx_array_t *store_lengths; //保存变量长度数组
ngx_array_t *store_values; //保存变量值数组
#if (NGX_HTTP_CACHE)
signed cache:2; //是否缓存
#endif
signed store:2;
unsigned intercept_404:1; //404配置返回
unsigned change_buffering:1; //buffering开关
#if (NGX_HTTP_SSL || NGX_COMPAT)
ngx_ssl_t *ssl;
ngx_flag_t ssl_session_reuse; //ssl session复用
ngx_http_complex_value_t *ssl_name; //ssl名
ngx_flag_t ssl_server_name; //ssl 服务器名
ngx_flag_t ssl_verify; //ssl校验
#endif
ngx_str_t module; //模块名
NGX_COMPAT_BEGIN(2)
NGX_COMPAT_END
} 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; //写事件处理函数
ngx_peer_connection_t peer; //同上游服务器连接描述
ngx_event_pipe_t *pipe; //event_pipe
ngx_chain_t *request_bufs; //请求端产生的bufffer链
ngx_output_chain_ctx_t output; //输出chain上下文结构
ngx_chain_writer_ctx_t writer; //upstream写处理链
ngx_http_upstream_conf_t *conf; //upstream配置信息
#if (NGX_HTTP_CACHE)
ngx_array_t *caches; //缓存数组 可以配置多个缓存目录
#endif
ngx_http_upstream_headers_in_t headers_in; //上游服务器返回的头部数据(已经完成了头部解析)
ngx_http_upstream_resolved_t *resolved; //upstream域名解析结构
ngx_buf_t from_client; //对请求端而言的upgrage buffer
ngx_buf_t buffer; //upstream处理上游数据缓冲
off_t length; //上游数据包体大小
ngx_chain_t *out_bufs; //响应到请求端的缓冲chain
ngx_chain_t *busy_bufs; //upstream 处理数据时用缓冲chain
ngx_chain_t *free_bufs; //空闲的缓冲chain
ngx_int_t (*input_filter_init)(void *data); //上游返回的数据filter初始化 主要设置一些状态信息
ngx_int_t (*input_filter)(void *data, ssize_t bytes); //上游返回的头部数据filter
void *input_filter_ctx; //input_filter上下文地址
#if (NGX_HTTP_CACHE)
ngx_int_t (*create_key)(ngx_http_request_t *r); //用于指定缓存key值生成方式
#endif
ngx_int_t (*create_request)(ngx_http_request_t *r); //创建对upstream上游服务器请求
ngx_int_t (*reinit_request)(ngx_http_request_t *r); //重新初始化upstream 处理配置
ngx_int_t (*process_header)(ngx_http_request_t *r); //指定处理上游服务器返回的头部
void (*abort_request)(ngx_http_request_t *r); //指定放弃对上游请求处理
void (*finalize_request)(ngx_http_request_t *r, //指定结束请求处理
ngx_int_t rc);
ngx_int_t (*rewrite_redirect)(ngx_http_request_t *r, //upstream返回的refresh跳转
ngx_table_elt_t *h, size_t prefix);
ngx_int_t (*rewrite_cookie)(ngx_http_request_t *r, //返回请求端的cookie值重写
ngx_table_elt_t *h);
ngx_msec_t timeout;
ngx_http_upstream_state_t *state; //upstream处理过程的状态信息(可以通过变量打印到日志)
ngx_str_t method; //到上游服务器的请求方法
ngx_str_t schema; //协议名
ngx_str_t uri;
ngx_str_t origin_host;
#if (NGX_HTTP_SSL)
ngx_str_t ssl_name;
#endif
ngx_http_cleanup_pt *cleanup;
unsigned store:1;
unsigned cacheable:1;
unsigned accel:1;
unsigned ssl:1;
#if (NGX_HTTP_CACHE)
unsigned cache_status:3;
#endif
unsigned buffering:1;
unsigned keepalive:1;
unsigned upgrade:1;
unsigned request_sent:1;
unsigned request_body_sent:1;
unsigned header_sent: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连接
ngx_connection_t *downstream; //与下游请求端的tcp连接
ngx_chain_t *free_raw_bufs; //空闲的用于原始数据缓冲链
ngx_chain_t *in; //输入到event_pipe中的缓冲链
ngx_chain_t **last_in; //缓冲in 最后一个
ngx_chain_t *writing; //用于将数据写入临时文件的链
ngx_chain_t *out; //用于响应请求端缓冲链
ngx_chain_t *free; //空闲的缓冲链
ngx_chain_t *busy; //正在进行处理的缓冲链
/*
* the input filter i.e. that moves HTTP/1.1 chunks
* from the raw bufs to an incoming chain */
ngx_event_pipe_input_filter_pt input_filter; //上游服务器返回数据filter
void *input_ctx; //filter对应的上下文信息
ngx_event_pipe_output_filter_pt output_filter; //响应到请求端的数据filter
void *output_ctx;
#if (NGX_THREADS) //线程池相关
ngx_int_t (*thread_handler)(ngx_thread_task_t *task,
ngx_file_t *file);
void *thread_ctx;
ngx_thread_task_t *thread_task;
#endif
unsigned read:1; //读取状态标记
unsigned cacheable:1; //可缓存标记
unsigned single_buf:1; //单一buf标记 windows iocp下成立
unsigned free_bufs:1; //释放缓冲标记
unsigned upstream_done:1; //上游包体数据读取完毕
unsigned upstream_error:1; //上游数据读取出错标记
unsigned upstream_eof:1; //内核网络缓冲区读取完毕
unsigned upstream_blocked:1; //upstream读取阻塞
unsigned downstream_done:1; //downstream处理完毕
unsigned downstream_error:1; //downstream处理出错
unsigned cyclic_temp_file:1; //复用临时文件标记
unsigned aio:1; //aio异步标记
ngx_int_t allocated; //配置的buffer被分配使用的数量
ngx_bufs_t bufs; //配置的的buffer组
ngx_buf_tag_t tag; //buffer的tag标记
ssize_t busy_size; //busy buffer的大小
off_t read_length; //读取上游数据的长度
off_t length; //动态变化的剩余上游包体长度
off_t max_temp_file_size; //最大临时文件大小
ssize_t temp_file_write_size; //最大可写入文件大小
ngx_msec_t read_timeout; //上游数据读取超时
ngx_msec_t send_timeout; //下游数据发送超时
ssize_t send_lowat; //设置的想用下游请求的低潮值
ngx_pool_t *pool; //内存池
ngx_log_t *log;
ngx_chain_t *preread_bufs; //预读取upstream 的缓冲chain
size_t preread_size; //预读取的大小
ngx_buf_t *buf_to_file; //将数据写入临时文件所用的缓冲
size_t limit_rate; //upstream读取限速
time_t start_sec; //event_pipe开始处理的时间
ngx_temp_file_t *temp_file; //临时文件地址
/* STUB */ int num; //STUB信息 buf使用计数
}