Nginx Internals

Joshua Zhu
Joshua ZhuSenior Software Engineer at Taobao
Nginx Internals

   Joshua Zhu
   09/19/2009
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
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
        -n1
        110953 total
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
Nginx Architecture
   Non-blocking
   Event driven
   Single threaded[*]
   One master process and several worker
    processes
   Resource efficient
   Highly modular
The Big Picture
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
Memory Pool
   Avoid memory fragmentation
   Avoid memory leak
   Allocation and deallocation can be very
    fast
   Lifetime and pool size
       Cycle
       Connection
       Request
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
Memory Pool Example (1 Chunk)
Memory Pool Example (2 Chunks)
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
             …
Buffer Management (cont’d)
   Buffer chain
       Singly-linked list of buffers
   Output chain
       Context
            in/free/busy chains
       Output filter
   Chain writer
       Writer context
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
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
Logging
   Error log
       Level
       Debug
   Access log
       Multiple logs
       Log format
            variables
       Per location
   Rotation
Configuration File
   Directive
        name
        type
        set
        conf
        offset
        post
   Parsing
        ngx_conf_parse
   Values
        init
        merge
Configuration File (cont’d)
   Block
        events
        http
        server
        upstream
        location
        if
   Variables
        Buildins
        Other types
               http_
               sent_http_
               upstream_http_
               cookie_
               arg_
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
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
Master Process Cycle
Worker Process Cycle
Inter-process Communication
   Signals
       Channel
            socketpair
            command
   Shared memory
       Connection counter
       Stat
       Atomic & spinlock
       Mutex
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
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()
Events and Timers Processing
Timer Management
   Actions
       Add a timer
       Delete a timer
       Get the minimum timer
   Red black tree[*]
       O(log n) complexity
Accept Mutex
   Thundering herd
   Serialize accept()
   Lock/unlock
   Listening sockets
   Delay
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
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
Important Structures
   Connection
       ngx_connection_t
   HTTP connection
       ngx_http_connection_t
   HTTP request
       ngx_http_request_t
            headers_in
            headers_out
            …
Virtual Servers
   Address
   Port
   Server names
   Core server conf
Locations
   Location tree
       Static
       Regex
            = ^~ ~ ~*
   Per-location configuration
       Value
            inheritance
            override
       Handler
   Named location
       try_files/post_action/error_page
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
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
Request Parsing
   Request line
   Headers
   Interesting tricks
       Finite state machine
       ngx_strX_cmp
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
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
Phases and Handlers (cont’d)
phase            modules
POST_READ        realip
SERVER_REWRITE   rewrite
REWRITE          rewrite
PREACCESS        limit_req, limit_zone, realip
ACCESS           access, auth_basic
CONTENT          autoindex, dav, gzip, index,
                 random_index, static
LOG              log
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
Filter Chain Example
HTTP Handling Example
   curl -i http://localhost/
HTTP Keep-Alive
   Request memory reuse
   Connection memory shrink
   Keep-alive timeout
   Request count
Subrequest
   Filters
       Addition filter
       SSI filter
   Maximum subrequests
Internal Redirect
   Return a different URL than originally
    requested
   Examples
       try_files
       index/random_index
       post_action
       send_error_page
       upstream_process_headers
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
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
Mail Proxy
   Sequence diagram
Mail Proxy (cont’d)
   Mail session
       Command parsing
       Packets relay
   Things you can do
       Load balancing
       Authentication rewriting
       Black lists/white lists
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
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
Core Module Interface
   Name
   Hooks
       create_conf
       init_conf
   Examples
       Core
       Events
       Log
       HTTP
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
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
HTTP Module Interface
   Hooks
       preconfiguration
       postconfiguration
       create_main_conf
       init_main_conf
       create_srv_conf
       merge_srv_conf
       create_loc_conf
       merge_loc_conf
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
Agenda
   Source code layout
   Key concepts and infrastructure
   The event-driven architecture
   HTTP request handling
   Mail proxying process
   Nginx module development
   Misc. topics
Auto Scripts
   Handle the differences
       OS
       Compiler
       Data types
       Libraries
   Module enable/disable
   Modules order
Reconfiguration
Hot Code Swapping
Thank You!
   My site: http://www.zhuzhaoyuan.com
   My blog: http://blog.zhuzhaoyuan.com
1 of 61

Recommended

NGINX: Basics and Best Practices EMEA by
NGINX: Basics and Best Practices EMEANGINX: Basics and Best Practices EMEA
NGINX: Basics and Best Practices EMEANGINX, Inc.
809 views44 slides
5 things you didn't know nginx could do by
5 things you didn't know nginx could do5 things you didn't know nginx could do
5 things you didn't know nginx could dosarahnovotny
8.9K views31 slides
NGINX: Basics and Best Practices by
NGINX: Basics and Best PracticesNGINX: Basics and Best Practices
NGINX: Basics and Best PracticesNGINX, Inc.
6.7K views32 slides
Nginx Essential by
Nginx EssentialNginx Essential
Nginx EssentialGong Haibing
929 views53 slides
Tips on High Performance Server Programming by
Tips on High Performance Server ProgrammingTips on High Performance Server Programming
Tips on High Performance Server ProgrammingJoshua Zhu
13.1K views35 slides
Introduction to Nginx by
Introduction to NginxIntroduction to Nginx
Introduction to NginxKnoldus Inc.
6.5K views18 slides

More Related Content

What's hot

NGINX: High Performance Load Balancing by
NGINX: High Performance Load BalancingNGINX: High Performance Load Balancing
NGINX: High Performance Load BalancingNGINX, Inc.
2.2K views40 slides
The basics of fluentd by
The basics of fluentdThe basics of fluentd
The basics of fluentdTreasure Data, Inc.
40.2K views43 slides
Fluentd v1.0 in a nutshell by
Fluentd v1.0 in a nutshellFluentd v1.0 in a nutshell
Fluentd v1.0 in a nutshellN Masahiro
16K views23 slides
NGINX Installation and Tuning by
NGINX Installation and TuningNGINX Installation and Tuning
NGINX Installation and TuningNGINX, Inc.
10.3K views33 slides
Stream processing with Apache Flink (Timo Walther - Ververica) by
Stream processing with Apache Flink (Timo Walther - Ververica)Stream processing with Apache Flink (Timo Walther - Ververica)
Stream processing with Apache Flink (Timo Walther - Ververica)KafkaZone
606 views48 slides
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12... by
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...TomBarron
823 views46 slides

What's hot(20)

NGINX: High Performance Load Balancing by NGINX, Inc.
NGINX: High Performance Load BalancingNGINX: High Performance Load Balancing
NGINX: High Performance Load Balancing
NGINX, Inc.2.2K views
Fluentd v1.0 in a nutshell by N Masahiro
Fluentd v1.0 in a nutshellFluentd v1.0 in a nutshell
Fluentd v1.0 in a nutshell
N Masahiro16K views
NGINX Installation and Tuning by NGINX, Inc.
NGINX Installation and TuningNGINX Installation and Tuning
NGINX Installation and Tuning
NGINX, Inc.10.3K views
Stream processing with Apache Flink (Timo Walther - Ververica) by KafkaZone
Stream processing with Apache Flink (Timo Walther - Ververica)Stream processing with Apache Flink (Timo Walther - Ververica)
Stream processing with Apache Flink (Timo Walther - Ververica)
KafkaZone606 views
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12... by TomBarron
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...
Practical CephFS with nfs today using OpenStack Manila - Ceph Day Berlin - 12...
TomBarron823 views
Introduction à l’intégration continue avec Jenkins by Eric Hogue
Introduction à l’intégration continue avec JenkinsIntroduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec Jenkins
Eric Hogue9.1K views
Redpanda and ClickHouse by Altinity Ltd
Redpanda and ClickHouseRedpanda and ClickHouse
Redpanda and ClickHouse
Altinity Ltd778 views
The Patterns of Distributed Logging and Containers by SATOSHI TAGOMORI
The Patterns of Distributed Logging and ContainersThe Patterns of Distributed Logging and Containers
The Patterns of Distributed Logging and Containers
SATOSHI TAGOMORI24.9K views
Introduction and Deep Dive Into Containerd by Kohei Tokunaga
Introduction and Deep Dive Into ContainerdIntroduction and Deep Dive Into Containerd
Introduction and Deep Dive Into Containerd
Kohei Tokunaga456 views
NGINX ADC: Basics and Best Practices by NGINX, Inc.
NGINX ADC: Basics and Best PracticesNGINX ADC: Basics and Best Practices
NGINX ADC: Basics and Best Practices
NGINX, Inc.971 views
Autoscaling Flink with Reactive Mode by Flink Forward
Autoscaling Flink with Reactive ModeAutoscaling Flink with Reactive Mode
Autoscaling Flink with Reactive Mode
Flink Forward925 views
NGINX: HTTP/2 Server Push and gRPC by NGINX, Inc.
NGINX: HTTP/2 Server Push and gRPCNGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPC
NGINX, Inc.4.6K views
Introduction to Kafka Streams by Guozhang Wang
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
Guozhang Wang29.7K views
Learn nginx in 90mins by Larry Cai
Learn nginx in 90minsLearn nginx in 90mins
Learn nginx in 90mins
Larry Cai8.5K views

Similar to Nginx Internals

Nginx internals by
Nginx internalsNginx internals
Nginx internalsliqiang xu
4.1K views33 slides
Python twisted by
Python twistedPython twisted
Python twistedMahendra M
3.2K views24 slides
Swift profiling middleware and tools by
Swift profiling middleware and toolsSwift profiling middleware and tools
Swift profiling middleware and toolszhang hua
1.4K views20 slides
Node.js Workshop - Sela SDP 2015 by
Node.js Workshop  - Sela SDP 2015Node.js Workshop  - Sela SDP 2015
Node.js Workshop - Sela SDP 2015Nir Noy
937 views98 slides
Copper: A high performance workflow engine by
Copper: A high performance workflow engineCopper: A high performance workflow engine
Copper: A high performance workflow enginedmoebius
6.8K views36 slides
Logging for Production Systems in The Container Era by
Logging for Production Systems in The Container EraLogging for Production Systems in The Container Era
Logging for Production Systems in The Container EraSadayuki Furuhashi
1.4K views46 slides

Similar to Nginx Internals(20)

Nginx internals by liqiang xu
Nginx internalsNginx internals
Nginx internals
liqiang xu4.1K views
Python twisted by Mahendra M
Python twistedPython twisted
Python twisted
Mahendra M3.2K views
Swift profiling middleware and tools by zhang hua
Swift profiling middleware and toolsSwift profiling middleware and tools
Swift profiling middleware and tools
zhang hua1.4K views
Node.js Workshop - Sela SDP 2015 by Nir Noy
Node.js Workshop  - Sela SDP 2015Node.js Workshop  - Sela SDP 2015
Node.js Workshop - Sela SDP 2015
Nir Noy937 views
Copper: A high performance workflow engine by dmoebius
Copper: A high performance workflow engineCopper: A high performance workflow engine
Copper: A high performance workflow engine
dmoebius6.8K views
Logging for Production Systems in The Container Era by Sadayuki Furuhashi
Logging for Production Systems in The Container EraLogging for Production Systems in The Container Era
Logging for Production Systems in The Container Era
Sadayuki Furuhashi1.4K views
Using Apache as an Application Server by Phil Windley
Using Apache as an Application ServerUsing Apache as an Application Server
Using Apache as an Application Server
Phil Windley6.5K views
IT Operations for Web Developers by Mahmoud Said
IT Operations for Web DevelopersIT Operations for Web Developers
IT Operations for Web Developers
Mahmoud Said657 views
Sedna XML Database: Executor Internals by Ivan Shcheklein
Sedna XML Database: Executor InternalsSedna XML Database: Executor Internals
Sedna XML Database: Executor Internals
Ivan Shcheklein1.8K views
Technical Overview of Apache Drill by Jacques Nadeau by MapR Technologies
Technical Overview of Apache Drill by Jacques NadeauTechnical Overview of Apache Drill by Jacques Nadeau
Technical Overview of Apache Drill by Jacques Nadeau
MapR Technologies1.9K views
Clug 2011 March web server optimisation by grooverdan
Clug 2011 March  web server optimisationClug 2011 March  web server optimisation
Clug 2011 March web server optimisation
grooverdan265 views
WebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect Toolbox by WebCamp
WebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect ToolboxWebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect Toolbox
WebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect Toolbox
WebCamp201 views
Set your Data in Motion with Confluent & Apache Kafka Tech Talk Series LME by confluent
Set your Data in Motion with Confluent & Apache Kafka Tech Talk Series LMESet your Data in Motion with Confluent & Apache Kafka Tech Talk Series LME
Set your Data in Motion with Confluent & Apache Kafka Tech Talk Series LME
confluent350 views
A Practical Event Driven Model by Xi Wu
A Practical Event Driven ModelA Practical Event Driven Model
A Practical Event Driven Model
Xi Wu512 views
Rapid java backend and api development for mobile devices by ciklum_ods
Rapid java backend and api development for mobile devicesRapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devices
ciklum_ods1.9K views
Asynchronous I/O in NodeJS - new standard or challenges? by Dinh Pham
Asynchronous I/O in NodeJS - new standard or challenges?Asynchronous I/O in NodeJS - new standard or challenges?
Asynchronous I/O in NodeJS - new standard or challenges?
Dinh Pham2.4K views
Event Processing and Integration with IAS Data Processors by Invenire Aude
Event Processing and Integration with IAS Data ProcessorsEvent Processing and Integration with IAS Data Processors
Event Processing and Integration with IAS Data Processors
Invenire Aude778 views

More from Joshua Zhu

阿里开源经验分享 by
阿里开源经验分享阿里开源经验分享
阿里开源经验分享Joshua Zhu
6.8K views35 slides
阿里云CDN技术演进之路 by
阿里云CDN技术演进之路阿里云CDN技术演进之路
阿里云CDN技术演进之路Joshua Zhu
6.4K views43 slides
阿里CDN技术揭秘 by
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘Joshua Zhu
4.9K views40 slides
Nginx深度開發與客制化 by
Nginx深度開發與客制化Nginx深度開發與客制化
Nginx深度開發與客制化Joshua Zhu
5.5K views47 slides
Hacking Nginx at Taobao by
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
4.3K views55 slides
Velocity 2010 Highlights by
Velocity 2010 HighlightsVelocity 2010 Highlights
Velocity 2010 HighlightsJoshua Zhu
3.3K views36 slides

More from Joshua Zhu(6)

阿里开源经验分享 by Joshua Zhu
阿里开源经验分享阿里开源经验分享
阿里开源经验分享
Joshua Zhu6.8K views
阿里云CDN技术演进之路 by Joshua Zhu
阿里云CDN技术演进之路阿里云CDN技术演进之路
阿里云CDN技术演进之路
Joshua Zhu6.4K views
阿里CDN技术揭秘 by Joshua Zhu
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘
Joshua Zhu4.9K views
Nginx深度開發與客制化 by Joshua Zhu
Nginx深度開發與客制化Nginx深度開發與客制化
Nginx深度開發與客制化
Joshua Zhu5.5K views
Hacking Nginx at Taobao by Joshua Zhu
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
Joshua Zhu4.3K views
Velocity 2010 Highlights by Joshua Zhu
Velocity 2010 HighlightsVelocity 2010 Highlights
Velocity 2010 Highlights
Joshua Zhu3.3K views

Recently uploaded

TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc
77 views29 slides
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueShapeBlue
131 views23 slides
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue by
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueCloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueShapeBlue
46 views13 slides
Why and How CloudStack at weSystems - Stephan Bienek - weSystems by
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsWhy and How CloudStack at weSystems - Stephan Bienek - weSystems
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsShapeBlue
111 views13 slides
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueShapeBlue
46 views15 slides
Data Integrity for Banking and Financial Services by
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial ServicesPrecisely
56 views26 slides

Recently uploaded(20)

TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc77 views
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
ShapeBlue131 views
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue by ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueCloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
ShapeBlue46 views
Why and How CloudStack at weSystems - Stephan Bienek - weSystems by ShapeBlue
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsWhy and How CloudStack at weSystems - Stephan Bienek - weSystems
Why and How CloudStack at weSystems - Stephan Bienek - weSystems
ShapeBlue111 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue46 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely56 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue96 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue35 views
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue85 views
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ... by ShapeBlue
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
ShapeBlue34 views
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays40 views
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading... by The Digital Insurer
Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading...
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by ShapeBlue
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
ShapeBlue56 views
Confidence in CloudStack - Aron Wagner, Nathan Gleason - Americ by ShapeBlue
Confidence in CloudStack - Aron Wagner, Nathan Gleason - AmericConfidence in CloudStack - Aron Wagner, Nathan Gleason - Americ
Confidence in CloudStack - Aron Wagner, Nathan Gleason - Americ
ShapeBlue41 views
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ... by ShapeBlue
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
ShapeBlue83 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue54 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker50 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue40 views

Nginx Internals

  • 1. Nginx Internals Joshua Zhu 09/19/2009
  • 2. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 3. 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 -n1 110953 total
  • 4. 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
  • 5. Nginx Architecture  Non-blocking  Event driven  Single threaded[*]  One master process and several worker processes  Resource efficient  Highly modular
  • 7. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 8. Memory Pool  Avoid memory fragmentation  Avoid memory leak  Allocation and deallocation can be very fast  Lifetime and pool size  Cycle  Connection  Request
  • 9. 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
  • 10. Memory Pool Example (1 Chunk)
  • 11. Memory Pool Example (2 Chunks)
  • 12. 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  …
  • 13. Buffer Management (cont’d)  Buffer chain  Singly-linked list of buffers  Output chain  Context  in/free/busy chains  Output filter  Chain writer  Writer context
  • 14. 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
  • 15. 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
  • 16. Logging  Error log  Level  Debug  Access log  Multiple logs  Log format  variables  Per location  Rotation
  • 17. Configuration File  Directive  name  type  set  conf  offset  post  Parsing  ngx_conf_parse  Values  init  merge
  • 18. Configuration File (cont’d)  Block  events  http  server  upstream  location  if  Variables  Buildins  Other types  http_  sent_http_  upstream_http_  cookie_  arg_
  • 19. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 20. 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
  • 23. Inter-process Communication  Signals  Channel  socketpair  command  Shared memory  Connection counter  Stat  Atomic & spinlock  Mutex
  • 24. 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
  • 25. 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()
  • 26. Events and Timers Processing
  • 27. Timer Management  Actions  Add a timer  Delete a timer  Get the minimum timer  Red black tree[*]  O(log n) complexity
  • 28. Accept Mutex  Thundering herd  Serialize accept()  Lock/unlock  Listening sockets  Delay
  • 29. 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
  • 30. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 31. Important Structures  Connection  ngx_connection_t  HTTP connection  ngx_http_connection_t  HTTP request  ngx_http_request_t  headers_in  headers_out  …
  • 32. Virtual Servers  Address  Port  Server names  Core server conf
  • 33. Locations  Location tree  Static  Regex  = ^~ ~ ~*  Per-location configuration  Value  inheritance  override  Handler  Named location  try_files/post_action/error_page
  • 34. 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
  • 35. 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
  • 36. Request Parsing  Request line  Headers  Interesting tricks  Finite state machine  ngx_strX_cmp
  • 37. 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
  • 38. 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
  • 39. Phases and Handlers (cont’d) phase modules POST_READ realip SERVER_REWRITE rewrite REWRITE rewrite PREACCESS limit_req, limit_zone, realip ACCESS access, auth_basic CONTENT autoindex, dav, gzip, index, random_index, static LOG log
  • 40. 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
  • 42. HTTP Handling Example  curl -i http://localhost/
  • 43. HTTP Keep-Alive  Request memory reuse  Connection memory shrink  Keep-alive timeout  Request count
  • 44. Subrequest  Filters  Addition filter  SSI filter  Maximum subrequests
  • 45. Internal Redirect  Return a different URL than originally requested  Examples  try_files  index/random_index  post_action  send_error_page  upstream_process_headers
  • 46. 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
  • 47. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 48. Mail Proxy  Sequence diagram
  • 49. Mail Proxy (cont’d)  Mail session  Command parsing  Packets relay  Things you can do  Load balancing  Authentication rewriting  Black lists/white lists
  • 50. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 51. 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
  • 52. Core Module Interface  Name  Hooks  create_conf  init_conf  Examples  Core  Events  Log  HTTP
  • 53. 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
  • 54. 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
  • 55. HTTP Module Interface  Hooks  preconfiguration  postconfiguration  create_main_conf  init_main_conf  create_srv_conf  merge_srv_conf  create_loc_conf  merge_loc_conf
  • 56. 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
  • 57. Agenda  Source code layout  Key concepts and infrastructure  The event-driven architecture  HTTP request handling  Mail proxying process  Nginx module development  Misc. topics
  • 58. Auto Scripts  Handle the differences  OS  Compiler  Data types  Libraries  Module enable/disable  Modules order
  • 61. Thank You!  My site: http://www.zhuzhaoyuan.com  My blog: http://blog.zhuzhaoyuan.com