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

📄 ngx_http_fastcgi_module.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>#include <nginx.h>typedef struct {    ngx_http_upstream_conf_t       upstream;    ngx_str_t                      index;    ngx_array_t                   *flushes;    ngx_array_t                   *params_len;    ngx_array_t                   *params;    ngx_array_t                   *params_source;    ngx_array_t                   *catch_stderr;} ngx_http_fastcgi_loc_conf_t;typedef enum {    ngx_http_fastcgi_st_version = 0,    ngx_http_fastcgi_st_type,    ngx_http_fastcgi_st_request_id_hi,    ngx_http_fastcgi_st_request_id_lo,    ngx_http_fastcgi_st_content_length_hi,    ngx_http_fastcgi_st_content_length_lo,    ngx_http_fastcgi_st_padding_length,    ngx_http_fastcgi_st_reserved,    ngx_http_fastcgi_st_data,    ngx_http_fastcgi_st_padding} ngx_http_fastcgi_state_e;typedef struct {    u_char                        *start;    u_char                        *end;} ngx_http_fastcgi_split_part_t;typedef struct {    ngx_http_fastcgi_state_e       state;    u_char                        *pos;    u_char                        *last;    ngx_uint_t                     type;    size_t                         length;    size_t                         padding;    ngx_uint_t                     fastcgi_stdout; /* unsigned :1 */    ngx_array_t                   *split_parts;} ngx_http_fastcgi_ctx_t;#define NGX_HTTP_FASTCGI_RESPONDER      1#define NGX_HTTP_FASTCGI_BEGIN_REQUEST  1#define NGX_HTTP_FASTCGI_ABORT_REQUEST  2#define NGX_HTTP_FASTCGI_END_REQUEST    3#define NGX_HTTP_FASTCGI_PARAMS         4#define NGX_HTTP_FASTCGI_STDIN          5#define NGX_HTTP_FASTCGI_STDOUT         6#define NGX_HTTP_FASTCGI_STDERR         7#define NGX_HTTP_FASTCGI_DATA           8typedef struct {    u_char  version;    u_char  type;    u_char  request_id_hi;    u_char  request_id_lo;    u_char  content_length_hi;    u_char  content_length_lo;    u_char  padding_length;    u_char  reserved;} ngx_http_fastcgi_header_t;typedef struct {    u_char  role_hi;    u_char  role_lo;    u_char  flags;    u_char  reserved[5];} ngx_http_fastcgi_begin_request_t;typedef struct {    u_char  version;    u_char  type;    u_char  request_id_hi;    u_char  request_id_lo;} ngx_http_fastcgi_header_small_t;typedef struct {    ngx_http_fastcgi_header_t         h0;    ngx_http_fastcgi_begin_request_t  br;    ngx_http_fastcgi_header_small_t   h1;} ngx_http_fastcgi_request_start_t;static ngx_int_t ngx_http_fastcgi_create_request(ngx_http_request_t *r);static ngx_int_t ngx_http_fastcgi_reinit_request(ngx_http_request_t *r);static ngx_int_t ngx_http_fastcgi_process_header(ngx_http_request_t *r);static ngx_int_t ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p,    ngx_buf_t *buf);static ngx_int_t ngx_http_fastcgi_process_record(ngx_http_request_t *r,    ngx_http_fastcgi_ctx_t *f);static void ngx_http_fastcgi_abort_request(ngx_http_request_t *r);static void ngx_http_fastcgi_finalize_request(ngx_http_request_t *r,    ngx_int_t rc);static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf);static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf);static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf,    void *parent, void *child);static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static char *ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static char *ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static char *ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post,    void *data);static char *ngx_http_fastcgi_upstream_max_fails_unsupported(ngx_conf_t *cf,    ngx_command_t *cmd, void *conf);static char *ngx_http_fastcgi_upstream_fail_timeout_unsupported(ngx_conf_t *cf,    ngx_command_t *cmd, void *conf);static ngx_conf_post_t  ngx_http_fastcgi_lowat_post =    { ngx_http_fastcgi_lowat_check };static ngx_conf_bitmask_t  ngx_http_fastcgi_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_fastcgi_commands[] = {    { ngx_string("fastcgi_pass"),      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,      ngx_http_fastcgi_pass,      NGX_HTTP_LOC_CONF_OFFSET,      0,      NULL },    { ngx_string("fastcgi_index"),      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_fastcgi_loc_conf_t, index),      NULL },    { ngx_string("fastcgi_store"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_fastcgi_store,      NGX_HTTP_LOC_CONF_OFFSET,      0,      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.store_access),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.ignore_client_abort),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.connect_timeout),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.send_timeout),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.send_lowat),      &ngx_http_fastcgi_lowat_post },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.buffer_size),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.pass_request_headers),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.pass_request_body),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.intercept_errors),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.read_timeout),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.bufs),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.busy_buffers_size_conf),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.temp_path),      (void *) ngx_garbage_collector_temp_handler },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.max_temp_file_size_conf),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.temp_file_write_size_conf),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.next_upstream),      &ngx_http_fastcgi_next_upstream_masks },    { ngx_string("fastcgi_upstream_max_fails"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_fastcgi_upstream_max_fails_unsupported,      0,      0,      NULL },    { ngx_string("fastcgi_upstream_fail_timeout"),      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,      ngx_http_fastcgi_upstream_fail_timeout_unsupported,      0,      0,      NULL },    { ngx_string("fastcgi_param"),      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_fastcgi_loc_conf_t, params_source),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.pass_headers),      NULL },    { ngx_string("fastcgi_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_fastcgi_loc_conf_t, upstream.hide_headers),      NULL },    { ngx_string("fastcgi_catch_stderr"),      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_fastcgi_loc_conf_t, catch_stderr),      NULL },      ngx_null_command};static ngx_http_module_t  ngx_http_fastcgi_module_ctx = {    ngx_http_fastcgi_add_variables,        /* preconfiguration */    NULL,                                  /* postconfiguration */    NULL,                                  /* create main configuration */    NULL,                                  /* init main configuration */    NULL,                                  /* create server configuration */    NULL,                                  /* merge server configuration */    ngx_http_fastcgi_create_loc_conf,      /* create location configuration */    ngx_http_fastcgi_merge_loc_conf        /* merge location configuration */};ngx_module_t  ngx_http_fastcgi_module = {    NGX_MODULE_V1,    &ngx_http_fastcgi_module_ctx,          /* module context */    ngx_http_fastcgi_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 ngx_http_fastcgi_request_start_t  ngx_http_fastcgi_request_start = {    { 1,                                               /* version */      NGX_HTTP_FASTCGI_BEGIN_REQUEST,                  /* type */      0,                                               /* request_id_hi */      1,                                               /* request_id_lo */      0,                                               /* content_length_hi */      sizeof(ngx_http_fastcgi_begin_request_t),        /* content_length_lo */      0,                                               /* padding_length */      0 },                                             /* reserved */    { 0,                                               /* role_hi */      NGX_HTTP_FASTCGI_RESPONDER,                      /* role_lo */      0, /* NGX_HTTP_FASTCGI_KEEP_CONN */              /* flags */      { 0, 0, 0, 0, 0 } },                             /* reserved[5] */    { 1,                                               /* version */      NGX_HTTP_FASTCGI_PARAMS,                         /* type */      0,                                               /* request_id_hi */      1 },                                             /* request_id_lo */};static ngx_str_t  ngx_http_fastcgi_script_name =    ngx_string("fastcgi_script_name");static ngx_str_t  ngx_http_fastcgi_hide_headers[] = {    ngx_string("Status"),    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_int_tngx_http_fastcgi_handler(ngx_http_request_t *r){    ngx_int_t                     rc;    ngx_http_upstream_t          *u;    ngx_http_fastcgi_loc_conf_t  *flcf;    if (r->subrequest_in_memory) {        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,                      "ngx_http_fastcgi_module does not support "                      "subrequest in memory");        return NGX_HTTP_INTERNAL_SERVER_ERROR;    }    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));    if (u == NULL) {        return NGX_HTTP_INTERNAL_SERVER_ERROR;    }    u->schema = flcf->upstream.schema;    u->peer.log = r->connection->log;    u->peer.log_error = NGX_ERROR_ERR;#if (NGX_THREADS)    u->peer.lock = &r->connection->lock;#endif    u->output.tag = (ngx_buf_tag_t) &ngx_http_fastcgi_module;    u->conf = &flcf->upstream;

⌨️ 快捷键说明

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