Nginx的server块listen命令详解

本文详细探讨了Nginx中server块的listen命令,解释了它如何影响配置结构,包括ngx_http_core_module的main_conf和srv_conf结构,以及listen指令如何处理多个监听端口和地址。文章还介绍了相关回调函数的作用,如ngx_http_core_server、ngx_http_core_listen、ngx_http_add_listen等,阐述了Nginx如何根据listen指令生成最终的监听配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到了后面才发现其实自己在server块命令这一部分并没有搞的太清楚,因而会影响到以后对代码的理解,因而从头又来看一遍,一定要把它搞明白。

首先我们来看ngx_http_core_module的main_conf结构:

typedef struct {
	 /** 
     * 存储所有的ngx_http_core_srv_conf_t,元素的个数等于server块的个数。 ,因为同一个http块命令可以配置多个server
     */  
    ngx_array_t                servers;         /* ngx_http_core_srv_conf_t */

	/** 
	  * 包含所有phase,以及注册的phase handler,这些handler在处理http请求时, 
	  * 会被依次调用,通过ngx_http_phase_handler_t的next字段串联起来组成一个 
	  * 链表。 
	  */  
    ngx_http_phase_engine_t    phase_engine;

    /** 
     * 以hash存储的所有request header 
     */  
    ngx_hash_t                 headers_in_hash;

    /** 
     * 被索引的nginx变量 ,比如通过rewrite模块的set指令设置的变量,会在这个hash 
     * 中分配空间,而诸如$http_XXX和$cookie_XXX等内建变量不会在此分配空间。 
     */  
    ngx_hash_t                 variables_hash;

    /** 
     * ngx_http_variable_t类型的数组,所有被索引的nginx变量被存储在这个数组中。 
     * ngx_http_variable_t结构中有属性index,是该变量在这个数组的下标。 
     */  
    ngx_array_t                variables;       /* ngx_http_variable_t */
    ngx_uint_t                 ncaptures;

    /** 
     * server names的hash表的允许的最大bucket数量,默认值是512。 
     */  
    ngx_uint_t                 server_names_hash_max_size;
    ngx_uint_t                 server_names_hash_bucket_size;

    ngx_uint_t                 variables_hash_max_size;
    ngx_uint_t                 variables_hash_bucket_size;

    ngx_hash_keys_arrays_t    *variables_keys;

	/** 
	   * 监听的所有端口,ngx_http_conf_port_t类型,其中包含socket地址信息。 
	   */  
    ngx_array_t               *ports;  //保存ngx_http_conf_port_t结构的元素,在ngx_http_optimize_servers函数中,将会用到ports中的元素来创建监听

    ngx_uint_t                 try_files;       /* unsigned  try_files:1 */
	
    /** 
     * 所有的phase的数组,其中每个元素是该phase上注册的handler的数组。 
     */  
    ngx_http_phase_t           phases[NGX_HTTP_LOG_PHASE + 1];
} ngx_http_core_main_conf_t;
其有几个比较重要的域是:

(1)servers,因为整个http块命令中创建的配置结构的main_conf结构都是统一的,但是同一个http块命令中却可以配置多个server块命令,servers数组就是用来保存这些独立的server块配置的,其保存的没一个元素都是ngx_http_core_srv_conf_t类型的。

(2)ports,其也是一个数组,我们在listen指令中会指定监听的地址端口的信息,由于可能会同时监听多个,所以ports数组就用来保存所有的这些监听的信息,在listen指令的回调函数中会将这些配置信息保存到ports数组中,其中保存的元素是ngx_http_conf_port_t结构,而且最后会调用ngx_http_optimize_servers函数来根据其中保存的信息来生成最后的ngx_listening_t结构。

接下来我们来看ngx_http_core_module模块的srv_conf结构:

typedef struct {
    /* array of the ngx_http_server_name_t, "server_name" directive */
    ngx_array_t                 server_names;  //server的名字数组   ngx_http_server_name_t

    /* server ctx */
    ngx_http_conf_ctx_t        *ctx;  // 指向包含它的ngx_http_conf_ctx_t结构,因为在server块命令的回调函数中会重新创建ngx_http_conf_ctx_t结构,但是其中的main_conf结构都是统一的

    ngx_str_t                   server_name;  //名字

    size_t                      connection_pool_size;  //connection池的大小
    size_t                      request_pool_size;
    size_t                      client_header_buffer_size;

    ngx_bufs_t                  large_client_header_buffers;

    ngx_msec_t                  client_header_timeout;   //请求超时时间

    ngx_flag_t                  ignore_invalid_headers;
    ngx_flag_t                  merge_slashes;
    ngx_flag_t                  underscores_in_headers;

    unsigned                    listen:1;  //区别当前server是否监听
#if (NGX_PCRE)
    unsigned                    captures:1;
#endif

    ngx_http_core_loc_conf_t  **named_locations;  //该srv配置的location配置数组
} ngx_http_core_srv_conf_t;
其中有几个比较重要的域:

(1)ctx,我们已经知道在每一个server块命令中都会重新创建ngx_http_conf_ctx_t结构,它的main_conf中的数据都是统一的,ctx就是用来指向当前server块命令中自己创建的ngx_http_conf_ctx_t结构。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值