⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_proxy_module.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>#include <ngx_http.h>typedef struct ngx_http_proxy_redirect_s  ngx_http_proxy_redirect_t;typedef ngx_int_t (*ngx_http_proxy_redirect_pt)(ngx_http_request_t *r,    ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_redirect_t *pr);struct ngx_http_proxy_redirect_s {    ngx_http_proxy_redirect_pt     handler;    ngx_str_t                      redirect;    union {        ngx_str_t                  text;        struct {            void                  *lengths;            void                  *values;        } vars;        void                      *regex;    } replacement;};typedef struct {    ngx_str_t                      host_header;    ngx_str_t                      port;    ngx_str_t                      uri;} ngx_http_proxy_vars_t;typedef struct {    ngx_http_upstream_conf_t       upstream;    ngx_array_t                   *flushes;    ngx_array_t                   *body_set_len;    ngx_array_t                   *body_set;    ngx_array_t                   *headers_set_len;    ngx_array_t                   *headers_set;    ngx_hash_t                     headers_set_hash;    ngx_array_t                   *headers_source;    ngx_array_t                   *headers_names;    ngx_array_t                   *proxy_lengths;    ngx_array_t                   *proxy_values;    ngx_array_t                   *redirects;    ngx_str_t                      body_source;    ngx_str_t                      method;    ngx_str_t                      location;    ngx_str_t                      url;    ngx_http_proxy_vars_t          vars;    ngx_flag_t                     redirect;    ngx_uint_t                     headers_hash_max_size;    ngx_uint_t                     headers_hash_bucket_size;} ngx_http_proxy_loc_conf_t;typedef struct {    ngx_uint_t                     status;    ngx_uint_t                     status_count;    u_char                        *status_start;    u_char                        *status_end;    ngx_http_proxy_vars_t          vars;    size_t                         internal_body_length;} ngx_http_proxy_ctx_t;#define NGX_HTTP_PROXY_PARSE_NO_HEADER  20static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);static ngx_int_t ngx_http_proxy_parse_status_line(ngx_http_request_t *r,    ngx_http_proxy_ctx_t *ctx);static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);static void ngx_http_proxy_abort_request(ngx_http_request_t *r);static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,    ngx_int_t rc);static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,    ngx_table_elt_t *h, size_t prefix);static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,    void *parent, void *child);static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);static char *ngx_http_proxy_upstream_max_fails_unsupported(ngx_conf_t *cf,    ngx_command_t *cmd, void *conf);static char *ngx_http_proxy_upstream_fail_timeout_unsupported(ngx_conf_t *cf,    ngx_command_t *cmd, void *conf);#if (NGX_HTTP_SSL)static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,    ngx_http_proxy_loc_conf_t *plcf);#endifstatic ngx_int_t ngx_http_proxy_set_vars(ngx_pool_t *pool, ngx_url_t *u,    ngx_http_proxy_vars_t *v);static ngx_conf_post_t  ngx_http_proxy_lowat_post =    { ngx_http_proxy_lowat_check };static ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },    { ngx_null_string, 0 }};static ngx_command_t  ngx_http_proxy_commands[] = {    { ngx_string("proxy_pass"),      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,      ngx_http_proxy_pass,      NGX_HTTP_LOC_CONF_OFFSET,      0,      NULL },    { ngx_string("proxy_redirect"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,      ngx_http_proxy_redirect,      NGX_HTTP_LOC_CONF_OFFSET,      0,      NULL },    { ngx_string("proxy_store"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_proxy_store,      NGX_HTTP_LOC_CONF_OFFSET,      0,      NULL },    { ngx_string("proxy_store_access"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,      ngx_conf_set_access_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),      NULL },    { ngx_string("proxy_buffering"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),      NULL },    { ngx_string("proxy_ignore_client_abort"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),      NULL },    { ngx_string("proxy_connect_timeout"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_msec_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),      NULL },    { ngx_string("proxy_send_timeout"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_msec_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),      NULL },    { ngx_string("proxy_send_lowat"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),      &ngx_http_proxy_lowat_post },    { ngx_string("proxy_intercept_errors"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),      NULL },    { ngx_string("proxy_set_header"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,      ngx_conf_set_keyval_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, headers_source),      NULL },    { ngx_string("proxy_headers_hash_max_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),      NULL },    { ngx_string("proxy_headers_hash_bucket_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),      NULL },    { ngx_string("proxy_set_body"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_str_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, body_source),      NULL },    { ngx_string("proxy_method"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_str_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, method),      NULL },    { ngx_string("proxy_pass_request_headers"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),      NULL },    { ngx_string("proxy_pass_request_body"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),      NULL },    { ngx_string("proxy_buffer_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),      NULL },    { ngx_string("proxy_read_timeout"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_msec_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),      NULL },    { ngx_string("proxy_buffers"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,      ngx_conf_set_bufs_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),      NULL },    { ngx_string("proxy_busy_buffers_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),      NULL },    { ngx_string("proxy_temp_path"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,      ngx_conf_set_path_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),      (void *) ngx_garbage_collector_temp_handler },    { ngx_string("proxy_max_temp_file_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),      NULL },    { ngx_string("proxy_temp_file_write_size"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),      NULL },    { ngx_string("proxy_next_upstream"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,      ngx_conf_set_bitmask_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),      &ngx_http_proxy_next_upstream_masks },    { ngx_string("proxy_upstream_max_fails"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_proxy_upstream_max_fails_unsupported,      0,      0,      NULL },    { ngx_string("proxy_upstream_fail_timeout"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_proxy_upstream_fail_timeout_unsupported,      0,      0,      NULL },    { ngx_string("proxy_pass_header"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_str_array_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),      NULL },    { ngx_string("proxy_hide_header"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,      ngx_conf_set_str_array_slot,      NGX_HTTP_LOC_CONF_OFFSET,      offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),      NULL },      ngx_null_command};static ngx_http_module_t  ngx_http_proxy_module_ctx = {    ngx_http_proxy_add_variables,          /* preconfiguration */    NULL,                                  /* postconfiguration */    NULL,                                  /* create main configuration */    NULL,                                  /* init main configuration */    NULL,                                  /* create server configuration */    NULL,                                  /* merge server configuration */    ngx_http_proxy_create_loc_conf,        /* create location configration */    ngx_http_proxy_merge_loc_conf          /* merge location configration */};ngx_module_t  ngx_http_proxy_module = {    NGX_MODULE_V1,    &ngx_http_proxy_module_ctx,            /* module context */    ngx_http_proxy_commands,               /* module directives */    NGX_HTTP_MODULE,                       /* module type */    NULL,                                  /* init master */    NULL,                                  /* init module */    NULL,                                  /* init process */    NULL,                                  /* init thread */    NULL,                                  /* exit thread */    NULL,                                  /* exit process */    NULL,                                  /* exit master */    NGX_MODULE_V1_PADDING};static char  ngx_http_proxy_version[] = " HTTP/1.0" CRLF;static ngx_keyval_t  ngx_http_proxy_headers[] = {    { ngx_string("Host"), ngx_string("$proxy_host") },    { ngx_string("Connection"), ngx_string("close") },    { ngx_string("Keep-Alive"), ngx_string("") },    { ngx_null_string, ngx_null_string }};static ngx_str_t  ngx_http_proxy_hide_headers[] = {    ngx_string("Date"),    ngx_string("Server"),    ngx_string("X-Pad"),    ngx_string("X-Accel-Expires"),    ngx_string("X-Accel-Redirect"),    ngx_string("X-Accel-Limit-Rate"),    ngx_string("X-Accel-Buffering"),    ngx_string("X-Accel-Charset"),    ngx_null_string};static ngx_http_variable_t  ngx_http_proxy_vars[] = {    { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },    { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },    { ngx_string("proxy_add_x_forwarded_for"), NULL,      ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },#if 0    { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },#endif    { ngx_string("proxy_internal_body_length"), NULL,      ngx_http_proxy_internal_body_length_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },    { ngx_null_string, NULL, NULL, 0, 0, 0 }};static ngx_int_tngx_http_proxy_handler(ngx_http_request_t *r){    ngx_int_t                   rc;    ngx_http_upstream_t        *u;    ngx_http_proxy_ctx_t       *ctx;    ngx_http_proxy_loc_conf_t  *plcf;    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));    if (u == NULL) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -