Heim >Backend-Entwicklung >PHP-Tutorial >[Nginx-Quellcode-Analyse] Konfigurationsanalyse 1
Die gesamte Konfigurationsanalyse wird hauptsächlich von der Funktion ngx_init_cycle(&init_cycle) verarbeitet.
ngx_init_cycle(&init_cycle)
ngx_time_update()//Zeitaktualisierung, auch in der Hauptfunktion erwähnt
/* * 通过加锁和解锁,来更新如下时间 ngx_cached_time = tp; ngx_cached_http_time.data = p0; ngx_cached_err_log_time.data = p1; ngx_cached_http_log_time.data = p2; ngx_cached_http_log_iso8601.data = p3; */
log = old_cycle- > ;log;//Fehlerprotokollobjekt
pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE,log);//Ordnen Sie einen 16-KByte-Speicherpool zu. Wenn ein kleiner Speicherknoten hinzugefügt wird, beträgt die maximale Größe Dieser Knoten ist 4095
cycle->pool = pool; cycle->log = log; cycle->new_log.log_level = NGX_LOG_ERR; cycle->conf_prefix; //设置配置文件dir cycle->prefix; //设置运行环境dir cycle->conf_file; //设置配置文件绝对路径 cycle->conf_param; //保存参数 cycle->pathes; //路径数组 cycle->open_files; //分配打开的文件描述符,其中这个结构是一 个链表,每个链表节点都有一个n个size的 cycle->shared_memory; //分配n个共享内存节点,这个是一个list, 每个节点都存在n个ngx_shm_zone_t结构,通过next指向链表后面的节点。 cycle->listening; //listening数组 cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module*sizeof(void*));
Weisen Sie ngx_max_module-Kontextzeiger dem Zyklus zu
Erstellen Sie zunächst die Kontextstruktur des Kernmoduls und speichern Sie sie im entsprechenden Zyklus-> ;conf_ctx Das
Kernmodul in der Struktur lautet wie folgt:
NGX_CORE_MODULE index Ngx_core_module 0 Ngx_errlog_module 1 Ngx_reg_module 6 Ngx_events_module 3 Ngx_http_module 7Kerncode
for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->type != NGX_CORE_MODULE) { continue; } module = ngx_modules[i]->ctx; if (module->create_conf) { rv = module->create_conf(cycle); if (rv == NULL) { ngx_destroy_pool(pool); return NULL; } cycle->conf_ctx[ngx_modules[i]->index] = rv; } }
nginx erstellt zunächst NGX_CORE_MODULE, um den Weg für die Erstellung des nachfolgenden Modulkontexts zu ebnen, d. h.
NGX_CORE_MODULE ist die Basis für andere Module, wie folgt:
Unter diesen verfügen die Module Ngx_errlog_module, ngx_events_module und ngx_http_module nicht über die Methode create_conf
, die dynamisch basierend auf der tatsächlichen Benutzerkonfiguration erstellt wird.
conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t)); if (conf.args == NULL) { ngx_destroy_pool(pool); return NULL; } conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); if (conf.temp_pool == NULL) { ngx_destroy_pool(pool); return NULL; } conf.ctx = cycle->conf_ctx; conf.cycle = cycle; conf.pool = pool; conf.log = log; conf.module_type = NGX_CORE_MODULE; conf.cmd_type = NGX_MAIN_CONF;
Erstellen Sie Parameter für conf, die zum Speichern des Benutzerkonfigurationsschlüssels und des Werts der Konfigurationsdatei verwendet werden. Erstellen Sie gleichzeitig einen
Speicherpool in temp_pool, conf. >ctx zeigt auf Cycle->conf_ctx, speichert Zyklus, Pool, Protokoll, legt Modultyp und Befehlstyp fest,
beginnt mit dem Parsen der Variablen der Hauptkonfigurationsdatei.
Der Prozess des Parsens der Konfigurationsdatei ist hauptsächlich ein indirekter rekursiver Aufruf von ngx_conf_parse, der hauptsächlich in Hauptbereich, Ereignisbereich, HTTP-Bereich, Serverbereich und Standortbereich unterteilt ist. Anschließend wird die Analyse durchgeführt.
Während des Analysevorgangs wird die Konfigurationsdatei (nginx.conf) in drei Kategorien unterteilt:
enum{ parse_file = 0, //解析文件,比如nginx.conf 还有include文件 parse_block, //解析块,比如http{}块 parse_param //解析参数 比如deamon off }
Geben Sie die Funktion ngx_conf_parse ein, je nachdem, ob dies der Fall ist Eine analysierte Datei, ein analysierter Block und Analyseparameter, um verschiedene Werte festzulegen, und dann ngx_conf_read_token eingeben. Diese Funktion liest hauptsächlich die Datei, setzt dann einige Flag-Variablen, speichert die Benutzerkonfiguration in conf->args und analysiert die Konfigurationsdatei (nginx .conf) verwendet einen Pufferspeicher, liest hauptsächlich die Datei und analysiert dann den Puffer. Wenn nach dem Puffer noch nicht analysierte Daten vorhanden sind, aber keine Semikolons oder Klammern angetroffen werden, werden die nicht analysierten Daten verschoben Lesen Sie die Datei weiter und analysieren Sie sie. Bei jedem Aufruf von ngx_conf_read_token wird ein Befehl analysiert. Wenn ein Problem mit der Konfigurationsdatei vorliegt, wird ein Fehler gemeldet. Nach dem Parsen der Benutzereinstellungen werden diese im Array conf->args gespeichert. Wenn festgestellt wird, dass cf->handler einen Wert hat, rufen Sie cf->handler zur Rückrufverarbeitung auf (im Allgemeinen wird die Datei „mine.types“ verarbeitet. Wenn cf->handler leer ist, rufen Sie ngx_conf_handler auf, um den cmd von zu durchlaufen). Kommen Sie zu jedem Modul, suchen Sie den Befehl und rufen Sie die Set-Callback-Methode des Befehls auf, wenn cmd ein Schlüssel ist Rufen Sie zum Festlegen der Wertvariablen nach dem Festlegen der entsprechenden Modulvariablen ngx_conf_read_token auf. Wenn es sich um einen Blockschlüssel wie http, event, location handelt, erstellt ihre Rückruffunktion (cmd-> set) zunächst die Kontextstrukturvariable und dann indirekt rekursives ngx_conf_parse legt natürlich unterschiedliche Kontexte fest.
Das Obige stellt die Konfigurationsanalyse 1 von [Nginx-Quellcode-Analyse] vor, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.