nginx internals

61
Nginx Internals Joshua Zhu 09/19/2009

Upload: joshua-zhu

Post on 08-Sep-2014

86.026 views

Category:

Technology


7 download

DESCRIPTION

Nginx Internals

TRANSCRIPT

Page 1: Nginx Internals

Nginx Internals

Joshua Zhu09/19/2009

Page 2: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 3: Nginx Internals

Source Code Layout

Files $ find . -name "*\.[hc]" -print | wc –l

234 $ ls src

core event http mail misc os Lines of code

$ find . -name "*\.[hc]" -print | xargs wc -l | tail -n1110953 total

Page 4: Nginx Internals

Code Organization

core/ The backbone and infrastructure

event/ The event-driven engine and modules

http/ The HTTP server and modules

mail/ The Mail proxy server and modules

misc/ C++ compatibility test and the Google perftools module

os/ OS dependent implementation files

Page 5: Nginx Internals

Nginx Architecture

Non-blocking Event driven Single threaded[*]

One master process and several worker processes

Resource efficient Highly modular

Page 6: Nginx Internals

The Big Picture

Page 7: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 8: Nginx Internals

Memory Pool

Avoid memory fragmentation Avoid memory leak Allocation and deallocation can be very

fast Lifetime and pool size

Cycle Connection Request

Page 9: Nginx Internals

Memory Pool (cont’d)

ngx_pool_t Small blocks Large blocks Free chain list Cleanup handler list

API ngx_palloc

memory aligned ngx_pnalloc ngx_pcalloc

Page 10: Nginx Internals

Memory Pool Example (1 Chunk)

Page 11: Nginx Internals

Memory Pool Example (2 Chunks)

Page 12: Nginx Internals

Buffer Management

Buffer Pointers

memory start/pos/last/end

file file_pos/file_last/file

Flags last_buf last_in_chain flush in_file memory …

Page 13: Nginx Internals

Buffer Management (cont’d)

Buffer chain Singly-linked list of buffers

Output chain Context

in/free/busy chains Output filter

Chain writer Writer context

Page 14: Nginx Internals

String Utilities

ngx_str_t data len sizeof() - 1

Memory related String formatting String comparison String search Base64 encoding/decoding URI escaping/unescaping UTF-8 decoding String-to-number conversion

Page 15: Nginx Internals

Data Structures

Abstract data types Array List Queue Hash table Red black tree Radix tree

Characteristic Set object values after added

keep interfaces clean Chunked memory (part)

efficient

Page 16: Nginx Internals

Logging

Error log Level Debug

Access log Multiple logs Log format

variables Per location

Rotation

Page 17: Nginx Internals

Configuration File

Directive name type set conf offset post

Parsing ngx_conf_parse

Values init merge

Page 18: Nginx Internals

Configuration File (cont’d)

Block events http server upstream location if

Variables Buildins Other types

http_ sent_http_ upstream_http_ cookie_ arg_

Page 19: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 20: Nginx Internals

Master and Workers

Master Monitor workers, respawn when a worker dies Handle signals and notify workers

exit reconfiguration update log rotation …

Worker Process client requests

handle connections Get cmd from master

Page 21: Nginx Internals

Master Process Cycle

Page 22: Nginx Internals

Worker Process Cycle

Page 23: Nginx Internals

Inter-process Communication

Signals Channel

socketpair command

Shared memory Connection counter Stat Atomic & spinlock Mutex

Page 24: Nginx Internals

Event

ngx_event_t Read Write Timeout

Callbacks Handlers

ngx_event_accept ngx_process_events_and_timers ngx_handle_read_event ngx_handle_write_event

Posted events Posted accept events queue Posted events queue

Page 25: Nginx Internals

Time Cache

The overhead of gettimeofday() Time cache variables

ngx_cached_time ngx_current_msec Time strings

ngx_cached_err_log_time ngx_cached_http_time ngx_cached_http_log_time

Timer resolution Interval timer

setitimer()

Page 26: Nginx Internals

Events and Timers Processing

Page 27: Nginx Internals

Timer Management

Actions Add a timer Delete a timer Get the minimum timer

Red black tree[*]

O(log n) complexity

Page 28: Nginx Internals

Accept Mutex

Thundering herd Serialize accept() Lock/unlock Listening sockets Delay

Page 29: Nginx Internals

I/O

Multiplexing kqueue/epoll

NGX_USE_CLEAR_EVENT (edge triggered) select/poll/dev/poll

NGX_USE_LEVEL_EVENT (level triggered) …

Advanced I/O sendfile() writev() direct I/O mmap() AIO TCP/IP options

TCP_CORK/TCP_NODELAY/TCP_DEFER_ACCEPT

Page 30: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 31: Nginx Internals

Important Structures

Connection ngx_connection_t

HTTP connection ngx_http_connection_t

HTTP request ngx_http_request_t

headers_in headers_out …

Page 32: Nginx Internals

Virtual Servers

Address Port Server names Core server conf

Page 33: Nginx Internals

Locations

Location tree Static Regex

= ^~ ~ ~* Per-location configuration

Value inheritance override

Handler Named location

try_files/post_action/error_page

Page 34: Nginx Internals

HTTP Contexts

Types main_conf srv_conf loc_conf

Request ngx_http_get_module_main_conf ngx_http_get_module_srv_conf ngx_http_get_module_loc_conf

Parse conf file ngx_http_conf_get_module_main_conf ngx_http_conf_get_module_srv_conf ngx_http_conf_get_module_loc_conf

Module context ngx_http_get_module_ctx ngx_http_set_ctx

Page 35: Nginx Internals

HTTP Handling

Receive data Parse the request Find the virtual server Find the location Run phase handlers Generate the response Filter response headers Filter the response body Send out the output to the client

Page 36: Nginx Internals

Request Parsing

Request line Headers Interesting tricks

Finite state machine ngx_strX_cmp

Page 37: Nginx Internals

Phases and Handlers

Phases POST_READ SERVER_REWRITE FIND_CONFIG REWRITE POST_REWRITE PREACCESS ACCESS POST_ACCESS TRY_FILES CONTENT LOG

Phase handler Checker Handler Next

Page 38: Nginx Internals

Phases and Handlers (cont’d)

Phase engine Handlers server_rewrite_index location_rewrite_index r->phase_handler

Default checkers ngx_http_core_generic_phase ngx_http_core_find_config_phase ngx_http_core_post_rewrite_phase ngx_http_core_access_phase ngx_http_core_post_access_phase ngx_http_core_try_files_phase ngx_http_core_content_phase

Page 39: Nginx Internals

Phases and Handlers (cont’d)

logLOG

autoindex, dav, gzip, index, random_index, static

CONTENT

access, auth_basicACCESS

limit_req, limit_zone, realipPREACCESS

rewriteREWRITE

rewriteSERVER_REWRITE

realipPOST_READ

modulesphase

Page 40: Nginx Internals

Filter Chain

Singly-linked list like (CoR) Filter response only

Header filter Body filter

Send out the response ngx_http_send_header

top_header_filter ngx_http_output_filter

ngx_http_top_body_filter ngx_http_header_filter ngx_http_copy_filter ngx_http_write_filter

Process order

Page 41: Nginx Internals

Filter Chain Example

Page 42: Nginx Internals

HTTP Handling Example

curl -i http://localhost/

Page 43: Nginx Internals

HTTP Keep-Alive

Request memory reuse Connection memory shrink Keep-alive timeout Request count

Page 44: Nginx Internals

Subrequest

Filters Addition filter SSI filter

Maximum subrequests

Page 45: Nginx Internals

Internal Redirect

Return a different URL than originally requested

Examples try_files index/random_index post_action send_error_page upstream_process_headers

Page 46: Nginx Internals

Upstream

Hooks input_filter_init input_filter create_request reinit_request process_header abort_request finalize_request rewrite_redirect

Modules FastCGI Proxy Memcached

Event pipe Load balancer

Page 47: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 48: Nginx Internals

Mail Proxy

Sequence diagram

Page 49: Nginx Internals

Mail Proxy (cont’d)

Mail session Command parsing Packets relay

Things you can do Load balancing Authentication rewriting Black lists/white lists

Page 50: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 51: Nginx Internals

General Module Interface

Context index & ctx_index

Directives Type

core/event/http/mail Hooks

init_master called at master process initialization

init_module called when the module is loaded

init_process called at worker process initialization

exit_process called at worker process termination

exit_master called at master process termination

Page 52: Nginx Internals

Core Module Interface

Name Hooks

create_conf init_conf

Examples Core Events Log HTTP

Page 53: Nginx Internals

Event Module Interface

Name Hooks

create_conf init_conf event_actions

add del enable disable add_conn del_conn process_changes process_events init done

Page 54: Nginx Internals

Mail Module Interface

Protocol type init_session init_protocol parse_command auth_state

create_main_conf init_main_conf create_srv_conf merge_srv_conf

Page 55: Nginx Internals

HTTP Module Interface

Hooks preconfiguration postconfiguration create_main_conf init_main_conf create_srv_conf merge_srv_conf create_loc_conf merge_loc_conf

Page 56: Nginx Internals

A “Hello World” HTTP Module

• Creating a hello world! module Files

ngx_http_hello_module.c config

Build ./configure –add-module=/path/to/hello/module

Configuration location & directive

Page 57: Nginx Internals

Agenda

Source code layout Key concepts and infrastructure The event-driven architecture HTTP request handling Mail proxying process Nginx module development Misc. topics

Page 58: Nginx Internals

Auto Scripts

Handle the differences OS Compiler Data types Libraries

Module enable/disable Modules order

Page 59: Nginx Internals

Reconfiguration

Page 60: Nginx Internals

Hot Code Swapping

Page 61: Nginx Internals

Thank You!

My site: http://www.zhuzhaoyuan.com My blog: http://blog.zhuzhaoyuan.com