Heim >Backend-Entwicklung >PHP-Tutorial >Nginx-Quellcode (4) Hauptprozess

Nginx-Quellcode (4) Hauptprozess

WBOY
WBOYOriginal
2016-08-08 09:27:59928Durchsuche

Fortsetzung von oben.

nginx wird als einzelner Prozess auf der Konsole ausgeführt. Der vorangehende Code ist der gesamte Initialisierungscode Ring voller Details. Finden Sie die Definition von ngx_single_process_cycle direkt in os/unix/ngx_process_cycle.c.

Fügen Sie den folgenden Code in der ersten for-Schleife hinzu:

<code><span>for</span> (i = <span>0</span>; ngx_modules[i]; i++) {
        <span>char</span> * p = NULL;
        <span>if</span> (ngx_modules[i]->commands != NULL)
        {
            p = ngx_modules[i]->commands->name.data;
        }
        <span>if</span> (ngx_modules[i]->init_process) {
            <span>if</span> (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
                <span>/* fatal */</span><span>exit</span>(<span>2</span>);
            }
            <span>printf</span>(<span>"[ngx_process_cycle] module ctx_index=%d index=%d name=%s init process\n"</span>, ngx_modules[i]->ctx_index, ngx_modules[i]->index, p);
        }
        <span>else</span>
        {
            <span>printf</span>(<span>"[ngx_process_cycle] module ctx_index=%d index=%d name=%s\n"</span>, ngx_modules[i]->ctx_index, ngx_modules[i]->index, p);
        }
    }
    <span>printf</span>(<span>"[ngx_process_cycle] for ngx_modules init done\n"</span>);</code>

Die Funktion besteht darin, auszudrucken, welche Module und zugehörigen Indizes und Namen derzeit in Nginx vorhanden sind.

In der zweiten for-Schleife handelt es sich hauptsächlich um die Methode ngx_process_events. Nach der Suche haben wir festgestellt, dass es sich um ein Makro handelt. Da wir das Epoll-Modul geladen haben, handelt es sich um ein Ereignis /modules/ngx_epoll_module. c
Code gefunden in:

<code>ngx_event_actions = ngx_epoll_module_ctx.actions;</code>

Es wurde festgestellt, dass die Methode ngx_process_events tatsächlich die Methode ngx_epoll_process_events in den Aktionen im Modul ngx_epoll_module_ctx ist. Suchen Sie die Stelle, an der die epoll_wait-Methode in dieser Methode aufgerufen wird, und fügen Sie den folgenden Code hinzu:

<code><span>printf</span>(<span>"[ngx_epoll_module] epoll wait\n"</span>);
    events = epoll_wait(ep, event_list, nevents, timer);
    <span>printf</span>(<span>"[ngx_epoll_module] epoll wait ---\n"</span>);</code>

Erstellen Sie das laufende Ergebnis neu:

[main], um ngx_single_process_cycle [ngx_process_cycle] Modul ctx_index=0 Index=0 Name=Daemon
[ngx_process_cycle] Modul ctx_index=0 index=1 name=error_log
[ngx_process_cycle] Modul ctx_index=0 index=2 name=include
[ngx_process_cycle] Modul ctx_index=0 index=3 name=events
[ngx_process_cycle] Modul ctx_index=0 Index=4 Name=Verbindungen Init-Prozess
[ngx_process_cycle] Modul ctx_index=1 index=5 name=rtsig_signo
[ngx_process_cycle] Modul ctx_index=2 index=6 name=epoll_events
[ngx_process_cycle] Modul ctx_index=0 index=7 name=http
[ngx_process_cycle] Modul ctx_index=0 index=8 name=server
[ngx_process_cycle] Modul ctx_index=1 index=9 name=log_format
[ngx_process_cycle] Modul ctx_index=2 index=10 name=(null)
[ngx_process_cycle] Modul ctx_index=3 index=11 name=index
[ngx_process_cycle] Modul ctx_index=4 index=12 name=allow
[ngx_process_cycle] Modul ctx_index=5 index=13 name=rewrite
[ngx_process_cycle] Modul ctx_index=6 index=14 name=proxy_pass
[ngx_process_cycle] Modul ctx_index=7 index=15 name=(null)
[ngx_process_cycle] Modul ctx_index=8 index=16 name=(null)
[ngx_process_cycle] Modul ctx_index=9 index=17 name=(null)
[ngx_process_cycle] Modul ctx_index=10 index=18 name=(null)
[ngx_process_cycle] Modul ctx_index=11 index=19 name=gzip
[ngx_process_cycle] Modul ctx_index=12 index=20 name=charset_map
[ngx_process_cycle] Modul ctx_index=13 Index=21 Name=Benutzer-ID
[ngx_process_cycle] Modul ctx_index=14 index=22 name=expires
[ngx_process_cycle] Modul ctx_index=15 index=23 name=output_buffers
[ngx_process_cycle] Modul ctx_index=16 index=24 name=(null)
[ngx_process_cycle] Modul ctx_index=17 index=25 name=(null)
[ngx_process_cycle] für ngx_modules init done
[ngx_epoll_module] epoll warte
^C[ngx_epoll_module] epoll wait —

Insgesamt 25 Module gefunden, nur das Verbindungsmodul verfügt über die Methode init_process und einige Modulnamen sind leer. Schließlich betritt das Programm das Epoll-Modul und wird beim Aufruf von Epoll_wait blockiert. Die anschließende Druckanweisung wird erst ausgeführt, nachdem STRG C gestartet wurde.

Hier können Sie sich die Definition von Nginx-Modulen genauer ansehen. Wenn Sie sich den Code ansehen, können Sie leicht feststellen, dass die tatsächlich in Nginx verwendeten Typen alle mit _t enden , die tatsächlichen Typen enden mit _s, nginx_module_s ist in der Datei core/ngx_conf_file.h definiert:

<code><span>struct</span> ngx_module_s {
    ngx_uint_t       ctx_index;
    ngx_uint_t       index;
    <span>void</span>            *ctx;
    ngx_command_t   *commands;
    ngx_uint_t       type;
    ngx_int_t      (*init_module)(ngx_cycle_t *cycle);
    ngx_int_t      (*init_process)(ngx_cycle_t *cycle);
<span>#if 0</span>
    ngx_int_t      (*init_thread)(ngx_cycle_t *cycle);
<span>#endif</span>
};</code>
Es gibt zwei Indexnummern, Befehle und 3 Funktionen. Die spezifische Bedeutung wird später verwendet.

Es gibt zwei weitere Strukturen, ngx_event_module_t und ngx_event_actions_t; ersteres ist das Nginx-Ereignismodul, aber es ist abstrakt und wird auf einer bestimmten Plattform unterschiedliche Typen haben, hier ist epoll.

ngx_event_module_t lautet wie folgt:

<code>typedef struct {
    ngx_str_t              <span>*name</span>;

    void                 <span>*(</span><span>*create_conf</span>)(ngx_cycle_t <span>*cycle</span>);
    char                 <span>*(</span><span>*init_conf</span>)(ngx_cycle_t <span>*cycle</span>, void <span>*conf</span>);

    ngx_event_actions_t     actions;
} ngx_event_module_t;</code>
epoll-Instanz lautet wie folgt:

<code>ngx_event_module_t  ngx_epoll_module_ctx = {
    &epoll_name,
    ngx_epoll_create_conf,               <span>/* create configuration */</span>
    ngx_epoll_init_conf,                 <span>/* init configuration */</span>    {
        ngx_epoll_add_event,             <span>/* add an event */</span>
        ngx_epoll_del_event,             <span>/* delete an event */</span>
        ngx_epoll_add_event,             <span>/* enable an event */</span>
        ngx_epoll_del_event,             <span>/* disable an event */</span>
        ngx_epoll_add_connection,        <span>/* add an connection */</span>
        ngx_epoll_del_connection,        <span>/* delete an connection */</span><span>NULL</span>,                            <span>/* process the changes */</span>
        ngx_epoll_process_events,        <span>/* process the events */</span>
        ngx_epoll_init,                  <span>/* init the events */</span>
        ngx_epoll_done,                  <span>/* done the events */</span>
    }
};</code>
Es kommt vor, dass die Aktionsmitglieder in ngx_event_module_t in ngx_epoll_module_ctx als einige mit Epoll verbundene Funktionen definiert sind Vorherige ngx_process_events werden durch die folgenden zwei Codezeilen definiert:


<code><span>#<span>define</span> ngx_process_events   ngx_event_actions.process_events</span></code>
in event/ngx_event.h

<code><span>   ngx_event_actions </span>=<span> ngx_epoll_module_ctx.actions;</span></code>
ngx_event_actions ist als globale Variable in event/ngx_event.c definiert:

<code>ngx_event_actions_t               ngx_event_actions;</code>
Als nächstes wollen wir Schauen Sie sich die Verwendung von Epoll in Nginx an.

Fortsetzung folgt …

Das Obige stellt den Hauptprozess des Nginx-Quellcodes (4) vor, einschließlich verschiedener Aspekte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn