mian 함수 부터 차근차근 nginx 실행 프로 세 스 분석 (1)
37905 단어 nginx
우 리 는 먼저 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 () 함수 의 코드!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.