mian 함수 부터 차근차근 nginx 실행 프로 세 스 분석 (1)

37905 단어 nginx
특별한 설명 을 하지 않 으 면 본 블 로그 에서 사용 하 는 nginx 소스 버 전 은 1.0.14 이 고 [] 에서 코드 가 있 는 파일 입 니 다!
우 리 는 먼저 main 함수 의 일부 코드 를 붙 입 니 다.
[core/nginx.c]  
 205 int ngx_cdecl

 206 main(int argc, char *const *argv)

 207 {

 208     ngx_int_t         i;

 209     ngx_log_t        *log;

 210     ngx_cycle_t      *cycle, init_cycle;

 211     ngx_core_conf_t  *ccf;

 212 

 213 #if (NGX_FREEBSD)

 214     ngx_debug_init();

 215 #endif

 216     /*            */

 217     if (ngx_strerror_init() != NGX_OK) {

 218         return 1;

 219     }

 220 

 221     /*        */

 222     if (ngx_get_options(argc, argv) != NGX_OK) {

 223         return 1;

 224     }

main 함 수 는 매우 간단 합 니 다. 모두 함수 의 호출 입 니 다. 모든 기능 은 각 함수 에 놓 여 이 루어 집 니 다!
1. 217 줄 의 첫 번 째 함수 ngxstrerror_init () [os / unix / ngx error. c], 이 함 수 는 비교적 간단 합 니 다. 시스템 의 모든 오류 정 보 를 nginx 자체 의 변수 ngx 에 저장 합 니 다.sys_errlist 에서 나중에 호출 할 수 있 도록 합 니 다.사실 nginx 의 많은 변 수 는 이 렇 습 니 다. 시스템 이 제공 하 는 변 수 를 nginx 의 이름 으로 다시 정의 합 니 다.하면, 만약, 만약...strerror_init () 함수 가 성공 적 으로 되 돌 아 왔 습 니 다. main 함수 가 계속 되 었 습 니 다. 오류 nginx 가 실행 을 중지 하 였 습 니 다.
2. 다음 두 번 째 함수 ngxget_options () [core / nginx. c], 이 함 수 는 두 개의 매개 변수 가 있 습 니 다. argc, argv: 하 나 는 시스템 호출 main 함수 가 전달 하 는 매개 변수의 개수 이 고, 다른 하 나 는 매개 변수 값 배열 입 니 다. 이 함수 도 쉽게 이해 할 수 있 습 니 다.Nginx 를 실행 할 때 nginx - v 와 같은 명령 을 추가 할 수 있다 는 것 을 알 고 있 습 니 다. 이것 은 ngxin 을 실행 한 후에 Nginx 버 전 번 호 를 표시 하 는 명령 입 니 다.이 함 수 는 nginx 명령 이후 의 옵션 (여기 - v) 을 분석 한 다음 전역 변수의 값 을 설정 합 니 다.main 함 수 는 이러한 전역 변수의 값 에 따라 상응하는 동작 을 한다.
이어서 main () 함수 코드 를 보십시오.
 226      /*    nginx    */

 227     if (ngx_show_version) {

 228         ngx_write_stderr("nginx version: " NGINX_VER NGX_LINEFEED);

 229         /*          */

 230         if (ngx_show_help) {

 231             ngx_write_stderr(

 232                 "Usage: nginx [-?hvVtq] [-s signal] [-c filename] "

 233                              "[-p prefix] [-g directives]" NGX_LINEFEED

 234                              NGX_LINEFEED

 235                 "Options:" NGX_LINEFEED

 236                 "  -?,-h         : this help" NGX_LINEFEED

 237                 "  -v            : show version and exit" NGX_LINEFEED

 238                 "  -V            : show version and configure options then      exit"

 239                                    NGX_LINEFEED

 240                 "  -t            : test configuration and exit" NGX_LINEFEE     D

 241                 "  -q            : suppress non-error messages "

242                                    "during configuration testing" NGX_LINEF     EED

 243                 "  -s signal     : send signal to a master process: "

 244                                    "stop, quit, reopen, reload" NGX_LINEFEE     D

 245 #ifdef NGX_PREFIX

 246                 "  -p prefix     : set prefix path (default: "

 247                                    NGX_PREFIX ")" NGX_LINEFEED

 248 #else

 249                 "  -p prefix     : set prefix path (default: NONE)" NGX_LIN     EFEED

 250 #endif

 251                 "  -c filename   : set configuration file (default: "

 252                                    NGX_CONF_PATH ")" NGX_LINEFEED

 253                 "  -g directives : set global directives out of configurati     on "

 254                                    "file" NGX_LINEFEED NGX_LINEFEED

 255                 );

 256         }

 257         /*            */

 258         if (ngx_show_configure) {

 259             ngx_write_stderr(

 260 #ifdef NGX_COMPILER

 261                 "built by " NGX_COMPILER NGX_LINEFEED

 262 #endif

 263 #if (NGX_SSL)

 264 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME

 265                 "TLS SNI support enabled" NGX_LINEFEED

 266 #else

 267                 "TLS SNI support disabled" NGX_LINEFEED

 268 #endif

 269 #endif

 270                 "configure arguments:" NGX_CONFIGURE NGX_LINEFEED);

 271         }

 272 

 273         if (!ngx_test_config) {

 274             return 0;

 275         }

 276     }

3. 이 코드 는 일부 전역 변수 에 따라 해당 하 는 조작 을 합 니 다. 안의 ngxshow_version、ngx_show_help、ngx_show_configure、ngx_test_config 는 전역 변수 입 니 다. 그 값 은 ngx_get_options () 가 설정 되 었 습 니 다.
    a. ngx_show_버 전 디 스 플레이 버 전 번호
    b. ngx_show_도움말 표시
    c. ngx_show_configure 디 스 플레이 프로필
    d. ngx_test_config 는 설정 을 테스트 하기 위해 서 입 니 다. 설정 되 어 있 으 면 nginx 프로그램 은 여기까지 입 니 다.
 278     /* TODO */ ngx_max_sockets = -1;

 279 

 280     /*         ,      ngx_cached_time,ngx_time_init()       ngx_time.h.c     */

 281     ngx_time_init();

 282 

 283 #if (NGX_PCRE)

 284     /*      pcre  ,         */

 285     ngx_regex_init();

 286 #endif

 287 

 288     /*      ID */

 289     ngx_pid = ngx_getpid();

 290     /*        , :        ngx_prefix,        ngx_log_file.fd */

 291     log = ngx_log_init(ngx_prefix);

 292     if (log == NULL) {

 293         return 1;

 294     }

 295 

 296     /* STUB */

 297 #if (NGX_OPENSSL)

 298     ngx_ssl_init(log);

 299 #endif

4. 281 줄 의 ngx_time_init () [core / nginx. h / nginx. c] 함수 도 간단 합 니 다. 현재 시간 을 전역 변수 에 저장 합 니 다.
5. 285 줄 의 ngxregex_init () 함 수 는 prce 라 이브 러 리 의 지원 이 있어 야 호출 됩 니 다. 정규 표현 식 을 초기 화하 여 나중에 일치 하 는 작업 을 편리 하 게 하 는 역할 을 합 니 다.
6. 291 줄 의 ngxlog_init()[core/ngx_log.h/ngx_log.c]  오류 로그 기록 파일 을 초기 화 하 는 것 입 니 다.이 함수 가 하 는 작업 은 오류 로그 기록 파일 을 열 고 로그 등급 을 설정 하 는 등 파일 설명 자 를 구조 체 에 저장 합 니 다.여기 서 우리 가 관심 을 가 져 야 할 두 가지 구조 체 는 다음 과 같다.
    a.struct ngx_log_s 그의 정 의 는 다음 과 같다.
struct ngx_log_s {

    ngx_uint_t           log_level;        /*        */

    ngx_open_file_t     *file;            /*      (       ) */



    ngx_atomic_uint_t    connection;    



    ngx_log_handler_pt   handler;        /*        */

    void                *data;            /*        */



    /*

     * we declare "action" as "char *" because the actions are usually

     * the static strings and in the "u_char *" case we have to override

     * their types all the time

     */

    char                *action;

};

로그 레벨 
 * 로그 표시 오류 * / \ # define NGXLOG_STDERR 0 / * 긴급 * / \ # define NGXLOG_EMERG 1 / * 경고 * / \ # define NGXLOG_ALERT 2 / * 중단 * / \ # define NGXLOG_CRIT 3 / * 오류 * / \ # define NGXLOG_ERR 4 / * 알림 * / \ # define NGXLOG_WARN 5 / * 알림 * / \ # define NGXLOG_NOTICE 6 / * 정보 * / \ # define NGXLOG_INFO 7 / * 디버그 * / \ # define NGXLOG_DEBUG 8
여덟 등급
b. 구조 체 변수 file 은 또 하나의 구조 체 이 고 이 구조 체 코드 는 다음 과 같다.
truct ngx_open_file_s {

    ngx_fd_t              fd;

    ngx_str_t             name;



    u_char               *buffer;

    u_char               *pos;

    u_char               *last;



#if 0

    /* e.g. append mode, error_log */

    ngx_uint_t            flags;

    /* e.g. reopen db file */

    ngx_uint_t          (*handler)(void *data, ngx_open_file_t *file);

    void                 *data;

#endif

};

이 구조 체 의 내 정 의 를 통 해 알 수 있 듯 이 이것 은 파일 을 열 고 파일 설명 자 를 fd 에 저장 하 는 동시에 파일 의 내용 을 * buf 로 버퍼 하 는 구조 체 입 니 다.
자, 로그 초기 화가 완료 되 었 습 니 다. main 함수 코드 를 내 려 다 보 겠 습 니 다.
301     /*

 302      * init_cycle->log is required for signal handlers and

 303      * ngx_process_options()

 304      */

 305 

 306     /*

 307      *       ngx_process_options()       init_cycle->log 

 308      *

 309      */

 310     /*    init_cycle */

 311     ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));

 312 

 313     /*    log   init_cycle */

 314     init_cycle.log = log;

 315 

 316     /* ngx_cycle      ngx_cycle_t *   ,          */

 317     ngx_cycle = &init_cycle;

 318 

 319     /*  u init_cycle      ,    1024B  */

 320     init_cycle.pool = ngx_create_pool(1024, log);

 321     if (init_cycle.pool == NULL) {

 322         return 1;

 323     }

 324 

 325     /*              ngx_os_argv、ngx_argc、ngx_argv     */

 326     if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {

 327         return 1;

 328     }

 329 

 330     /*     ngx_cycle   prefix,conf_prefie,conf_file,ngx_argv   */

 331     if (ngx_process_options(&init_cycle) != NGX_OK) {

 332         return 1;

 333     }

 334 

 335     /*          ,        ngx_pagesize,ngx_cacheline_size,      ngx_max_sockets */

 336   if (ngx_os_init(log) != NGX_OK) {  /*           */

 337         return 1;

 338     }

  7. init_cycle 는 매우 중요 한 변수 로 그의 구조 체 는 ngc 이다.cycle_t. nginx 의 모든 조작 은 이 변 수 를 중심 으로 이 루어 집 니 다.다음은 그 에 대한 조작, 311 번 째 줄, initcycle 메모리 제거
8. 전역 변수 ngxcycle init 에 귀속cycle。320 줄 설정 initcycle 의 메모리 탱크 크기 는 1024 B 이 며, ngx 를 호출 합 니 다.create_pool () 함수 가 생 성 됩 니 다.nginx 의 메모리 탱크 는 nginx 작가 가 자체 적 으로 디자인 한 편리 한 메모리 조작 구조 체 로 인터넷 에 큰 소 가 투철 하 게 분석 되 어 있 습 니 다 http://blog.csdn.net/livelylittlefish/article/details/6586946. 저 는 설명 하지 않 습 니 다.이것 은 nginx 가 메모리 에 큰 메모 리 를 신청 하 는 것 임 을 대체적으로 알 고 있 습 니 다. 이후 메모리 신청 작업 은 메모리 에 직접 신청 하지 않 고 이 분 배 된 메모리 에서 직접 가 져 옵 니 다. (이 큰 메모리 도 할당 되 지 않 는 한) 메모리 풀 을 만 드 는 데 실패 하면 프로그램 을 종료 합 니 다.
9. 326 줄 의 ngxsave_argv () [core / nginx. c] 는 간단 합 니 다. argv 에 저 장 된 매개 변 수 를 전역 변수 ngx 에 저장 하 는 것 입 니 다.argv 중.두 매개 변 수 는 각각 initcycle, argv。argv 는 저장 되 어야 하 며 함수 에서 의 조작 은 init 를 사용 해 야 합 니 다.cycle 의 로그 변수
  10.  331 줄 의 함수 가 하 는 일 은 init 를 설정 하 는 것 입 니 다.cycle 구조 체 중의 conffile、conf_param、conf_prefix, prefix 의 값 입 니 다.ngx_cycle_t 구조 체 의 정 의 는 이미 큰 소 가 상세 하 게 분석 한 것 이 있 는데 여 기 는 더 이상 군말 하지 않 겠 습 니 다!상세 참조: http://blog.csdn.net/livelylittlefish/article/details/7247080
11. 336 줄 의 ngxos_init 함수 가 운영 체제 와 관련 된 변 수 를 설정 합 니 다. 예 를 들 어 ngxpagesize (페이지 크기), ngxcacheline_size (캐 시 줄 크기), ngxmax_sockets (최대 연결 수)
main 함수 코드 계속 붙 이기
/*

 342      * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()

 343      */

 344     /*     CRC  ---    CRC         ,    */

 345     if (ngx_crc32_table_init() != NGX_OK) {

 346         return 1;

 347     }

 348 

 349      /*    ngx_add_inherited_sockets    sockets; ---                init_cycle->listening      */

 350     if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {

 351         return 1;

 352     }

 353 

 354     /*         index    ,    ngx_max_moudle */

 355     ngx_max_module = 0;

 356     for (i = 0; ngx_modules[i]; i++) {

 357         ngx_modules[i]->index = ngx_max_module++;

 358     }

 359 

 360     /*     init_cycle    ---            ,              */

 361     /* ngx_init_cycle()   ngx_cycle.h/c     */

 362     cycle = ngx_init_cycle(&init_cycle);

 363     if (cycle == NULL) {

 364         if (ngx_test_config) {

 365             ngx_log_stderr(0, "configuration file %s test failed",

 366                            init_cycle.conf_file.data);

 367         }

 368 

 369         return 1;

 370     }

 371     /**/

 372     if (ngx_test_config) {

 373         if (!ngx_quiet_mode) {

 374             ngx_log_stderr(0, "configuration file %s test is successful",

 375                            cycle->conf_file.data);

 376         }

 377 

 378         return 0;

 379     }

 380     /**/

 381     if (ngx_signal) {

 382         return ngx_signal_process(cycle, ngx_signal);

 383     }

 384 

 385     ngx_os_status(cycle->log);

 386 

 387     ngx_cycle = cycle;

 388 

 389     /*    ngx_core_moudle      ,     */

 390     ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

 391 

 392     /*   master      ngx_process   */

 393     if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {

 394         ngx_process = NGX_PROCESS_MASTER;

 395     }

 396 

 397 #if !(NGX_WIN32)

 398     /*       */

 399     if (ngx_init_signals(cycle->log) != NGX_OK) {

 400         return 1;

 401     }

 402     /*      sockets,          ,    ngx_daemon()        */

 403      if (!ngx_inherited && ccf->daemon) {

 404         /*       

 405         if (ngx_daemon(cycle->log) != NGX_OK) { 

 406             return 1;

 407         }

 408         */

 409         ngx_daemonized = 1;

 410     }

12. 344 줄 의 ngxcrc32_table_init () 함 수 는 CRC 표 시 를 초기 화 하 는 것 입 니 다. 후속 CRC 검 사 는 직접 검사 표를 통 해 진행 되 며 효율 이 높 습 니 다!
13. 350 줄 중 ngxadd_inherited_sockets () 함수  http://blog.csdn.net/livelylittlefish/article/details/7277607  분석 중!매우 상세 하 니, 여 기 는 더 이상 군말 하지 않 겠 다!
14. 355 - 357 줄 은 각 모듈 구조 체 변수 중의 index 변 수 를 설정 하고 모듈 의 개 수 를 통계 하기 위 한 것 이다.
15. 362 줄 호출 ngx_init_cycle() init 에 의 하면cycle 초기 화 cycle 변 수 는 블 로그 에서 구체 적 으로 분석 할 수 있 습 니 다. http://blog.csdn.net/livelylittlefish/article/details/7247080 !상세 하고 중요 합 니 다. 반드시 진지 하 게 보고 이해 해 야 합 니 다. 프로필 의 해석 을 설정 하고 전체 변수 에 저장 하 는 것 은 모두 이 함수 에서 진행 되 며 더 이상 군말 하지 않 습 니 다!초기 화 에 실패 하고 ngx 를 설정 하 였 습 니 다.test_cnfig 가 1 이면 표준 오류 로 오류 정 보 를 출력 하고 main 함수 가 돌아 갑 니 다!
16. 381 줄 이 신 호 를 기다 리 고 있 습 니 다. master 프로 세 스 (main 함 수 를 실행 하 는 프로 세 스) 가 신 호 를 받 으 면 이 프로 세 스 는 해당 하 는 처 리 를 해 야 합 니 다. ngxsingal_process () [core / ngx cycle. c] 함수 실행!
17. 390 줄 획득 ngxcore_module 모듈 의 설정 정보, 393 - 395 줄: 설정 중 master 변수 > 1 및 ngxprocess 는 NGXPROCESS_SINGLE 모드 그러면 ngxprocess 를 NGX 로 설정PROCESS_MASTER 
18. 399 줄 의 ngxinit_signals () 함수 초기 화 신호 블 로그  http://blog.csdn.net/livelylittlefish/article/details/7308100  매우 상세 하 게 분석 하 였 으 니, 여 기 는 더 이상 군말 하지 않 겠 다!
19. 403 - 410 설정 에 있 는 daemon 변수 와 sockets 계승 여부 (ngx inherited, ngx add inherited sockets () 함수 에 설정) 에 따라 master 프로 세 스 (main 함 수 를 실행 하 는 프로 세 스) 가 데 몬 인지 설정 합 니 다!디 버 깅 을 편리 하 게 하기 위해 데 몬 코드 주석 으로 설정 합 니 다.
main () 함수 코드 계속 붙 이기
 440     /*       */

 441     /* ngx_single_process()   ngx_master_process_cycle()     OS/ngx_process_cycle.h/c    */

 442     if (ngx_process == NGX_PROCESS_SINGLE) {

 443         ngx_single_process_cycle(cycle);   /*    NGX_PROCESS_SINGLE = 1   ,    ngx_single_process_cycle()      */

 444 

 445     } else {

 446         ngx_master_process_cycle(cycle);   /*     master-worker   ,   ngx_master_process_cycle()      */

 447     }

 448 

 449     return 0;

 450 }

20. ngx프로 세 스 가 다른 처리 함 수 를 주 순환 에 호출 합 니 다!
이로써 main () 함수 분석 이 완료 되 었 습 니 다. 다음 절 에 우 리 는 분석 을 ngx 에 들 어 갈 것 입 니 다.master_process_cycle () 함수 의 코드!

좋은 웹페이지 즐겨찾기