zoukankan      html  css  js  c++  java
  • 【Nginx】显示器port管理

    监听port属于server虚拟主机,由server{}块内的listen配置项决定。

    也就是说,在server{}块配置项内定义了该虚拟主机所要监听的port。


    在处理配置文件http块内main级别的配置项时。每一个HTTP模块都会调用create_main_conf、create_srv_conf、create_loc_conf三个方法建立三个结构体。用来分别存储http块、server块、location块内的配置项。

    ngx_http_core_module是HTTP模块。所以它会调用ngx_http_module_t接口内的ngx_http_core_create_main_conf方法创建存储main级别配置项的结构体,函数例如以下:

    static void *
    ngx_http_core_create_main_conf(ngx_conf_t *cf)
    {
        ngx_http_core_main_conf_t  *cmcf;
     
        ....
     
        return cmcf;
    }


    从代码能够看出创建了一个ngx_http_core_main_conf_t结构体用于存储配置项。此结构体定义例如以下:
    typedef struct {
        ....
        ngx_array_t               *ports;           /* 保存http块配置项内监听的全部端口 */
        ....
    } ngx_http_core_main_conf_t;
    


    当中的ports成员就保存着全部须要监听的端口。

    每个端口用结构体ngx_http_conf_port_t表示:

    typedef struct {
        ngx_int_t                  family;
        in_port_t                  port;
        ngx_array_t                addrs;     /* array of ngx_http_conf_addr_t */
    } ngx_http_conf_port_t;


    port成员就保存要监听的port,而addrs成员则保存有一系列的IP地址,每个地址用一个ngx_http_conf_addr_t表示,每个IP地址都与一个port绑定。比如:
    • 127.0.0.1:8000
    • 173.39.160.51:8000
    这样。假设一台机器有多个IP。就行同一时候监听这些IP的port了。假设配置项直接就是listen 80,那么相当于默认监听该port下的全部地址,即*.80。

    以下再来看看ngx_http_conf_addr_t的定义:
    typedef struct {
        ngx_http_listen_opt_t      opt;
     
        ngx_hash_t                 hash;
        ngx_hash_wildcard_t       *wc_head;
        ngx_hash_wildcard_t       *wc_tail;
     
    #if (NGX_PCRE)
        ngx_uint_t                 nregex;
        ngx_http_server_name_t    *regex;
    #endif
     
        /* the default server configuration for this address:port */
        ngx_http_core_srv_conf_t  *default_server;
        ngx_array_t                servers;  /* array of ngx_http_core_srv_conf_t */
    } ngx_http_conf_addr_t;


    这里关注servers数组,它把监听的port与server{}虚拟主机关联起来了。什么意思呢?假如ngx_http_conf_addr_t相应的port为8080,且servers成员包括虚拟主机A和虚拟主机B,那么在这两个块配置项中就存在listen 8080这个配置项。

    也就是说。每一个监听地址ngx_http_conf_addr_t中的servers数组中关联着监听地址相应的server{}虚拟主机。


    总的关系图例如以下:


    从上图的关系中能够得出例如以下事实:
    • server A虚拟主机监听了两个port。各自是*.80和127.0.0.1:8000
    • server B虚拟主机监听了三个port。各自是*.8080、*.80、173.39.160.51:8000

    參考:
    《深入了解Nginx》 P367-P369.

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    enmo_day_07
    enmo_day_04
    enmo_day_05
    数据仓库的模型设计
    Lucene 概念,定义应用场景
    enum 枚举的简单应用
    单例模式&synchronized
    Spark的 DAGschedule & task schedule 区别以及相互联系
    Spark的stage & job & task 到底是什么 ,以及划分原理
    Java基本数据类型&引用类型总结
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4877480.html
Copyright © 2011-2022 走看看