I recommend my new book "deep understanding of nginx: module development and Architecture Analysis"

Source: Internet
Author: User
Tags epoll nginx server what is nginx

Http://www.china-pub.com/STATIC/zt_mb/zt_huodong_2013_3.asp? Filename = 2013_jsj_nginx_20130401

A deep understanding of nginx: module development and Architecture Analysis
Preface
Part 1 What Can nginx do for us?
Chapter 2 Preparations before nginx
1.1 What is nginx/2
1.2 Why nginx/4
1.3 preparations/7
1.3.1 Linux/7
1.3.2 use nginx essential software/7
1.3.3 disk directory/8
1.3.4 Linux Kernel Parameter Optimization/9
1.3.5 obtain nginx source code/11
1.4 compile and install nginx/11
1.5 configure details/11
1.5.1 configure command parameters/12
1.5.2 configure Execution Process/18
1.5.3 file generated by Configure/22
1.6 nginx command line control/24
1.7 Summary/27
Chapter 2 nginx configuration/28. 2nd relationship between running nginx processes/28
2.2 general syntax for nginx configuration/31
2.2.1 block configuration items/31
2.2.2 syntax format of the configuration item/32
2.2.3 comments for configuration items/33
2.2.4 unit of configuration item/33
2.2.5 use variable/33 in configuration
2.3 basic configuration of nginx service/34
2.3.1 configuration items used to debug processes and locate problems/34
2.3.2 normal operation configuration item/36
2.3.3 configuration item for optimizing performance/38
2.3.4 event configuration items/39
2.4 use the HTTP core module to configure a static Web server/41
2.4.1 distribution of VM and request/42
2.4.2 file path definition/45
2.4.3 memory and disk resource allocation/48
2.4.4 network connection setting/50
2.4.5 MIME type setting/53
2.4.6 restrictions on client requests/54
2.4.7 file operation optimization/55
2.4.8 special handling of client requests/57
2.4.9 variables provided by ngx_http_core_module/59
2.5 use the HTTP Proxy module to configure a reverse proxy server/60
2.5.1 basic Server Load balancer configuration/62
2.5.2 basic configuration of reverse proxy/64
2.6 Summary/68
Part 2: how to compile the HTTP Module
Chapter 2 develop a simple HTTP module/70
3.1 how to call the HTTP module/70
3.2 preparations/72
3.2.1 integer encapsulation/72
3.2.2 ngx_str_t Data Structure/73
3.2.3 ngx_list_t Data Structure/73
3.2.4 ngx_table_elt_t Data Structure/77
3.2.5 ngx_buf_t Data Structure/77
3.2.6 ngx_chain_t Data Structure/79
3.3 how to compile your HTTP module into nginx/79
3.3.1 write the config file/80
3.3.2 use the configure script to add the customized module to nginx/80
3.3.3 directly modify the makefile/84
3.4 Data Structure of the HTTP module/85
3.5 define your HTTP module/88
3.6 process user requests/92
3.6.1 return value of the processing method/92
3.6.2 retrieve Uri and parameters/95
3.6.3 get http header/98
3.6.4 obtain the http package/101
3.7 send response/102
3.7.1 send HTTP header/102
3.7.2 send the strings in the memory as the package body/104
3.7.3 classic "Hello World" example/106
3.8 send a disk file as a package/107
3.8.1 how to send files on disk/107
3.8.2 clear file handle/110
3.8.3 multi-thread download and resumable data transfer/111
3.9 compile the HTTP module in C ++/112
3.9.1 compilation method modification/112
3.9.2 symbol Conversion/114
3.10 Summary/114
Chapter 2 configuration, error log, and request Context/4th
4.1 Use Cases of HTTP configuration items/115
4.2 How to Use HTTP configuration/117
4.2.1 allocate the data structure used to save configuration parameters/117
4.2.2 resolution of configuration items/119
4.2.3 use 14 preset methods to parse configuration items/125
4.2.4 custom configuration item handling method/136
4.2.5 merge configuration items/137
4.3 HTTP configuration model/140
4.3.1 process for parsing HTTP configurations/141
4.3.2 memory layout of the HTTP configuration model/144
4.3.3 how to merge configuration items/147
4.3.4 working principle of the preset configuration item handling method/149
4.4 error log usage/150
4.5 Request Context/155
4.5.1 relationship between context and fully asynchronous web server/155
4.5.2 How to Use http Context/156
4.5.3 how to maintain the Context Structure of the HTTP framework/157
4.6 Summary/158
Chapter 5 access to third-party services/5th
5.1 usage of Upstream/160
5.1.1 ngx_http_upstream_t struct/163
5.1.2 set upstream's restrictive parameter/164
5.1.3 set the address of the third-party server to be accessed/165
5.1.4 set the callback method/166
5.1.5 how to start upstream/166
5.2 execution scenario of callback method/167
5.2.1 create_request callback method/167
5.2.2 reinit_request callback method/169
5.2.3 finalize_request callback method/170
5.2.4 process_header callback method/171
5.2.5 rewrite_redirect callback method/172
5.2.6 input_filter_init and input_filter callback method/172
5.3 example of upstream use/173
5.3.1 configuration parameters of Upstream/174
5.3.2 request Context/175
5.3.3 construct a request/176 in the create_request Method
5.3.4 parse the header/177 in the process_header Method
5.3.5 release resources in the finalize_request method/180
5.3.6 enable upstream/181 in the ngx_http_mytest_handler Method
5.4 subrequest usage/183
5.4.1 configure the subrequest processing method/183
5.4.2 callback Method for sub-request processing/184
5.4.3 callback method for processing the re-activation of the parent request/185
5.4.4 start subrequest/185
5.5 main scenarios during subrequest execution/186
5.5.1 how to start subrequest/186
5.5.2 how to forward the response body of multiple subrequests/188
5.5.3 how to activate the parent request for a subrequest/192
5.6 subrequest example/193
5.6.1 configuration file neutron request setting/194
5.6.2 request Context/194
5.6.3 Processing Method for subrequest end/195
5.6.4 callback method of the parent request/196
5.6.5 start subrequest/197
5.7 Summary/198
Chapter 2 develop a simple HTTP filter module/6th
6.1 significance of the filter module/199
6.2 Filtering module Call Sequence/200
6.2.1 filter how a linked list is formed/200
6.2.2 filter the sequence of the linked list/203
6.2.3 functions of the official default HTTP filter module/204
6.3 HTTP filter module development step/206
6.4 simple example of HTTP filter module/207
6.4.1 how to compile the config file/208
6.4.2 configuration items and Context/208
6.4.3 define HTTP filter module/210
6.4.4 initialize the HTTP filter module/211
6.4.5 process the HTTP header/212 In the request
6.4.6 process the HTTP packet body in the request/213
6.5 Summary/214
Chapter 2 advanced data structure provided by nginx/7th
7.1 nginx advanced data structure Overview/215
7.2 ngx_queue_t two-way linked list/217
7.2.1 why ngx_queue_t two-way linked list/217
7.2.2 usage of two-way linked list/217
7.2.3 example of using a two-way linked list for sorting/219
7.2.4 how a two-way linked list is implemented/221
7.3 ngx_array_t dynamic array/222
7.3.1 why ngx_array_t dynamic array/223
7.3.2 use of dynamic arrays/223
7.3.3 examples of using dynamic arrays/225
7.3.4 dynamic array resizing method/226
7.4 ngx_list_t unidirectional linked list/226
7.5 ngx_rbtree_t red/black tree/227
7.5.1 why ngx_rbtree_t red/black tree/227
7.5.2 features of the red and black trees/228
7.5.3 how to use the red/black tree/230
7.5.4 simple example of using the red/black tree/233
7.5.5 how to customize the member adding method/234
7.6 ngx_radix_tree_t base tree/236
7.6.1 principle of ngx_radix_tree_t base tree/236
7.6.2 how to use the base tree/238
7.6.3 example of using the base tree/239
7.7 wildcard hash/240
7.7.1 ngx_hash_t basic hash/240
7.7.2 support wildcard hash/243
7.7.3 use case with wildcard hash/250
7.8 Summary/254
Part 3 go deep into nginx
Chapter 2 nginx infrastructure/8th
8.1 key constraints in Web Server Design/256
8.2 nginx Architecture Design/259
8.2.1 excellent modular design/259
8.2.2 event-driven architecture/263
8.2.3 multi-phase Asynchronous processing of requests/264
8.2.4 management process and multi-Working Process Design/267
8.2.5 platform-independent code implementation/268
8.2.6 Memory Pool Design/268
8.2.7 use the HTTP filter module in the unified pipeline filter mode/268
8.2.8 other user modules/269
8.3 core structure ngx_cycle_t/269 in the nginx framework
8.3.1 ngx_listening_t struct/269
8.3.2 ngx_cycle_t struct/271
8.3.3 method supported by ngx_cycle_t/273
8.4 process of the framework when nginx is started/275
8.5 how the worker process works/278
8.6 how the master process works/281
8.7 Summary/286
Chapter 4 event module/9th
9.1 event processing framework Overview/287
9.2 nginx event definition/290
9.3 nginx connection definition/293
9.3.1 passive connection/294
9.3.2 active connection/297
9.3.3 ngx_connection_t connection pool/298
9.4 ngx_events_module core module/300
9.4.1 how to manage configuration items of all event modules/301
9.4.2 event management module/303
9.5 ngx_event_core_module event module/305
9.6 epoll event driver module/310
9.6.1 principles and usage of epoll/311
9.6.2 use epoll/313
9.6.3 implementation of the ngx_epoll_module module/315
9.7 timer event/323
9.7.1 Cache Time Management/324
9.7.2 Cache Time Accuracy/326
9.7.3 timer Implementation/327
9.8 process of event-driven framework/328
9.8.1 how to create a new connection/329
9.8.2 how to solve the "surprise group" problem/330
9.8.3 how to achieve Load Balancing/333
9.8.4 post event queue/334
9.8.5 ngx_process_events_and_timers process/335
Asynchronous I/O/9.9 of 338 files
9.9.1 asynchronous file I/O/339 provided by Linux Kernel
9.9.2 asynchronous I/O/342 for files implemented in the ngx_epoll_module
9.10 Summary/346
Chapter 2 HTTP framework initialization/10th
10.1 HTTP framework Overview/348
10.2 manage configuration items of the HTTP module/351
10.2.1 manage configuration items at the main level/352
10.2.2 manage configuration items at the server level/354
10.2.3 manage configuration items at the location level/357
10.2.4 merging of different levels of configuration items/362
10.3 manage listening ports/367
10.4 server quick search/369
10.5 fast retrieval of Location/371
10.6 11 handling phases of HTTP requests/372
10.6.1 universal rules for HTTP processing/374
10.6.2 ngx_http_post_read_phase stage/376
10.6.3 ngx_http_server_rewrite_phase stage/378
10.6.4 ngx_http_find_config_phase stage/379
10.6.5 ngx_http_rewrite_phase stage/379
10.6.6 ngx_http_post_rewrite_phase stage/379
10.6.7 ngx_http_preaccess_phase stage/379
10.6.8 ngx_http_access_phase stage/380
10.6.9 ngx_http_post_access_phase stage/380
10.6.10 ngx_http_try_files_phase stage/381
10.6.11 ngx_http_content_phase stage/381
10.6.12 ngx_http_log_phase stage/382
10.7 HTTP framework initialization process/383
10.8 Summary/385
Chapter 2 HTTP framework Execution Process/11th
11.1 HTTP framework Execution Process Overview/387
11.2 new connection creation behavior/388
11.3 processing of the first readable event/390
11.4 receive HTTP Request lines/396
11.5 receive HTTP header/399
11.6 process HTTP requests/403
11.6.1 ngx_http_core_generic_phase/409
11.6.2 ngx_http_core_rewrite_phase/411
11.6.3 ngx_http_core_access_phase/412
11.6.4 ngx_http_core_content_phase/415
11.7 subrequest and post requests/419
11.8 handle HTTP packets/421
11.8.1 received package/422
11.8.2 discard the recipient package/429
11.9 send HTTP Response/433
11.9.1 ngx_http_send_header/434
11.9.2 ngx_http_output_filter/436
11.9.3 ngx_http_writer/440
11.10 end HTTP Request/442
11.10.1 ngx_http_close_connection/443
11.10.2 ngx_http_free_request/444
11.10.3 ngx_http_close_request/446
11.10.4 ngx_http_finalize_connection/447
11.10.5 nginx http_terminate_request/447
11.10.6 ngx_http_finalize_request/448
11.11 Summary/452
Chapter 1 Design and Implementation of upstream mechanism/12th
12.1 upstream mechanism Overview/453
12.1.1 design purpose/454
12.1.2 significance of ngx_http_upstream_t Data Structure/456
12.1.3 ngx_http_upstream_conf_t: configure the struct/459
12.2 start upstream/462
12.3 establish a connection with the upstream server/464
12.4 send a request to the upstream server/467
12.5 receiving upstream Server Response Header/470
12.5.1 division of two application layer protocols/470
12.5.2 three methods for handling the package/471
12.5.3 process for receiving the Response Header/473
12.6 handling process when no response is forwarded/476
12.6.1 Design of input_filter method/477
12.6.2 default input_filter method/478
12.6.3 process for receiving a package/479
12.7 or less games give priority to forwarding responses/481
12.7.1 Header/482 of the forwarded response
12.7.2 response packet body/484
Over 12.8 of the game's network speed is prioritized to forward responses/489
12.8.1 significance of ngx_event_pipe_t struct/489
12.8.2 Header/493 of the forwarded response
12.8.3 response packet body/495
12.8.4 ngx_event_pipe_read_upstream method/498
12.8.5 ngx_event_pipe_write_to_downstream method/502
12.9 end upstream request/504
12.10 Summary/508
Chapter 2 mail proxy module/13th
13.1 functions of the mail proxy server/509
13.2 mail module processing framework/512
13.2.1 eight independent processing phases of a request/512
13.2.2 definition of mail module/514
13.2.3 email framework initialization/516
13.3 initialization request/517
13.3.1 ngx_mail_session_t structure of the email request/517
13.3.2 initialize the email request process/519
13.4 receive and parse client requests/520
13.5 email authentication/520
13.5.1 ngx_mail_auth_http_ctx_t struct/520
13.5.2 establish a connection with the authentication server/522
13.5.3 send a request to the authentication server/522
13.5.4 receive and parse the response/525
13.6 authentication interaction with upstream email servers/526
13.6.1 ngx_mail_proxy_ctx_t struct/526
13.6.2 initiate a connection to the upstream email server/527
13.6.3 interaction process with email server authentication/528
13.7 passthrough upstream mail server and client stream/530
13.8 Summary/535
Chapter 2 inter-process communication mechanism/14th
14.1 Overview/536
14.2 shared memory/536
14.3 atomic operation/541
14.3.1 does not support atomic operations in the atomic database/541
14.3.2 atomic operation in X86 architecture/542
14.3.3 spin lock/545
14.4 nginx channel/546
14.5 signal/549
14.6 semaphores/551
14.7 file lock/553
14.8 mutex lock/556
14.8.1 ngx_shmtx_t lock implemented by filelock/558
14.8.2 ngx_shmtx_t lock implemented by atomic variables/560
14.9 Summary/565

Preface why write this book
When I try to design a high-performance Web server in a critical position of the product, I choose to use mature nginx. The reason for choosing it is: first, it has achieved a high level of server performance mining, it can try to make different hardware (including Nic, hard disk, different CPU cores) code that does not block the process to sleep in the software while running concurrently. In terms of performance, it can challenge any server. Secondly, the efficiency of event-driven server development is often unsatisfactory. The events to be processed are too low-level and detailed, which makes the functional modules unable to focus on the business, the final products have a single function and will not have a wide range of optional functions. However, nginx is not. Due to its excellent design in the software architecture, nginx is completely composed of many simple modules, and each module (especially the HTTP module) does not need to be involved in the underlying details, in a phased, non-blocking event-driven architecture, you can focus on the implementation of business functions, which eventually brings a large number of official and third-party functional modules to nginx, this makes nginx, which has the same powerful functions, sufficient to take on the important responsibilities of the product's core position and withstand the test of massive requests.
When the functions provided by the nginx module cannot fully meet all my business needs, I can create another non-nginx server with missing functions at the nginx backend, forward requests that cannot be implemented by nginx to this server for processing. However, this also has some drawbacks. First, it increases the request processing overhead. Second, the design of the backend server still restricts the overall performance (it still needs to solve the non-blocking problem solved by nginx, in this way, it can be as efficient as nginx). This method is only applicable to scenarios with low performance requirements. Only by developing a custom nginx module that implements the required functions and embedding it into nginx code can our services fully explore the hardware resources of servers like nginx, responds to millions of concurrent TCP connections in a timely manner.
Before developing the nginx module, I tried to find a book on nginx module development in the market (both Chinese and English), but I got nothing. I can only find books on how to use nginx and its existing modules. In order to develop the nginx module, I can only gradually restore the design idea by reading the source code that lacks comments and analyzing various official nginx modules, it has repeatedly tried and verified how modules can use the nginx infrastructure and rich cross-platform tools and methods. At the same time, it conforms to the nginx design philosophy, making nginx comparable to the first-class efficiency of the Linux kernel. This process consumes a lot of energy. Therefore, I hope that in the future, nginx users and developers will not have to read the source code to find a module development method when encountering the same problem, instead, you can quickly find out how to develop the nginx module in a simple and efficient manner and focus on business implementation. This is my first purpose in writing this book.
When nginx running in our product encounters a problem, it is often solved by finding the wrong configuration item and usage method, which can indeed solve most of the problems. However, for deeper problems, such as remote use cases, or incomplete consideration of nginx Code, these problems can only be solved by engineers who spend a lot of energy on nginx source code. The second purpose of writing this book is to thoroughly parse the nginx architecture and help readers understand nginx in depth. It can be used correctly and find the root cause when it encounters any problems, then, use the most appropriate method to fix or avoid the problem.
Nginx is an excellent event-driven framework. Although nginx is excellent in HTTP processing, it is not only used for Web servers. Nginx is ideal for developing server programs that provide external services over TCP at the transmission layer. There are five advantages for developing programs based on the nginx framework:
1) nginx encapsulates asynchronous event drivers, such as networks, disks, and timers. Based on these drivers, the details of event processing can be ignored.
2) nginx encapsulates many platform-independent interfaces and containers for cross-platform development.
3) Excellent modular design allows developers to easily reuse various existing modules, including basic read configurations, logging, and other modules, it also includes advanced functional modules for processing requests, such as HTTP and mail.
4) nginx is used as a server to design its framework. Therefore, nginx is excellent in server process management. Based on it, developing server programs can easily achieve dynamic upgrade of programs, monitoring and management of sub-processes, dynamic modification of configuration items, and so on.
5) nginx fully takes into account the "excellent" features of various operating systems, and will never use inefficient universal interfaces when it can use special systems to call tasks more efficiently. Especially for Linux operating systems, nginx has spared no effort to make a lot of optimizations.
When we want to write a server program that can handle high-concurrency requests with low load and mainly handle TCP-based requests, we recommend nginx, which may surprise us. The third part of this book will help readers understand how to develop efficient TCP server programs based on nginx by analyzing the internal architecture of nginx: by developing a new module type, A new function framework is implemented to provide excellent scalability, so that the function sub-modules only focus on business development and ignore the processing of underlying events. This is the third purpose of writing this book.
In addition to these three main purposes, I also hope to use this book to show you many clever designs of nginx in server development. They are also subtle in abstract design, or use hardware resources precisely and economically through the operating system. The design of these details reflects the extraordinary skills of Igor Sysoev. Even if we do not use nginx at all, learning these skills will also help improve the programming level of our servers.
Target Audience
This book is suitable for the following readers.
Readers interested in nginx and how to build it into a high-performance Web server.
Readers who want to develop specific HTTP modules to implement high-performance Web servers.
Readers who want to learn about nginx architecture design and how to make full use of hardware resources on servers.
Readers who know how to quickly locate and fix deep-level bugs in nginx.
Users who want to use the framework provided by nginx to design any TCP-based, non-blocking, and scalable servers. . Background Knowledge
If you only want to know how to use the existing nginx function to build a server, read this book without any prerequisites. However, if you want to learn module development and architecture design skills of nginx by reading the second and third parts of this book, you must understand the basic syntax of C language. When reading the third part of this book, you need to have a basic understanding of TCP and a brief understanding of the Linux operating system.
How to read this book
I would like to write this book as a "Step by Step" (step by step) book, because it can save readers time. However, since the three major writing purposes are not that simple to solve, this book can only be used as a compromise.
In the first two chapters of the first part, we will only discuss how to use nginx. Readers who read this section can learn how to deploy nginx and how to add various official and third-party functional modules to it without learning the C language, how to modify the configuration file to change the functions of nginx and each module, how to modify parameters on the Linux operating system to optimize server performance, and finally provide enterprise-level Web servers to users. This section introduces the configuration item method, which is more important to guide readers who are familiar with nginx and learn how to modify the configuration of several basic nginx modules, in this way, you can query the official website and third-party websites to learn how to use all nginx modules.
In Chapter 2 ~ In Chapter 7th, we use examples to describe how HTTP modules are developed. Here we are somewhat similar to the "Step by Step" learning method. When I write this part, this step-by-step approach enables readers to get started quickly and introduces the basic principles of common usage.
In the third part, we will begin to introduce the complete nginx framework. Here we will learn why the HTTP module is developed in this way in the second part, and we can easily develop the nginx module. This part is not only intended to describe the nginx architecture, but to explore why it is so designed that the HTTP and email proxy frameworks can be put aside, implement a new business framework and a new module type.
Readers who are not familiar with nginx use should start from Chapter 1st. The first two chapters will help you quickly understand nginx.
If you have used nginx but do not know much about how to develop the HTTP module of nginx, you can start from Chapter 3rd. After reading this chapter, you can compile an HTTP module with roughly complete functions. However, enterprise-level modules can be compiled only after reading chapter 1. This chapter describes three necessary methods for compiling online server programs. Chapter 2 illustrates two methods for compiling complex HTTP modules. In chapter 3, we will further describe these two methods. Chapter 2 describes how to compile a special HTTP module-HTTP filter module. Chapter 4 explores the usage of basic containers, which is also a necessary tool for complex modules.
If you are familiar with the compilation of common HTTP modules and want to implement more complex HTTP modules in depth, or want to understand the design and implementation of the mail proxy server, or you want to write a new module that processes other protocols, or simply want to understand the nginx architecture design, you can start learning from Chapter 1, this chapter systematically introduces the modular design of nginx. The event framework in Chapter 9th is the basis for nginx to process TCP. This chapter cannot be skipped. When reading chapter 8th and Chapter 9th, you may encounter many containers described in Chapter 7th. In this case, you can go back to chapter 7th to query the method and significance. Chapter 2 ~ Chapter 2 introduces the HTTP framework. Through these three chapters, we will have a deep understanding of the development of the HTTP module and can also learn the excellent design of the HTTP framework. Chapter 2 briefly introduces the design of the mail proxy server, which is similar to the simplified HTTP framework. Chapter 2 describes the tools for inter-process synchronization.
In order not to let readers fall into the "Sea of code", this book uses a lot of charts, so that readers can quickly and roughly understand the process and principles. The code is provided directly in the key areas, and comments are added to describe them. It is hoped that this method can help readers reduce the reading time, grasp nginx faster and better, and go deep into the details.
At the beginning of this book, the latest stable version of nginx is 1.0.14, so this book was originally written based on this version. By the end of writing this book, the stable version of nginx has increased to 1.2.4. But this will not bother reading this book, because this book mainly introduces the basic framework code of nginx and how to use these framework code to develop a new nginx module, instead of introducing some nginx functions. In these basic framework codes, nginx generally does not make any changes, otherwise a large number of existing nginx modules will not work, and this loss is also unacceptable. In addition, the nginx framework provides sufficient flexibility for specific functional modules. When modifying a function, you rarely need to modify the Framework Code.
Nginx is a cross-platform server. However, this book will only analyze the most common Linux operating systems, on the other hand, this book mainly aims to show readers how to write code based on nginx, rather than how to modify the configuration on a specific operating system to use nginx. Therefore, even if this book uses a Linux system as its representative to describe nginx, it will not affect readers of other operating systems, because the differences in operating systems have a very small impact on reading this book.
Errata and support
Due to the limited level of the author and the rush of writing time, some errors or inaccuracies may inevitably occur in the book. I urge readers to criticize and correct them. To this end, I specifically created a secondary site for online support and emergency solutions: http://nginx.weebly.com. Readers can publish errors in the book on the bug errata page. If you encounter any problems, you can also visit the Q & A page. I will try my best to provide the most satisfactory answers online. All the source files in the book will be published on this website, and I will release the corresponding function updates in a timely manner. If you have more valuable comments, you are also welcome to send an email to my mailbox russelltao@foxmail.com, expect to hear the sincere feedback from readers.
Thank you
First of all, I would like to thank Igor Sysoev for his amazing performance in nginx design. It is his work that makes the birth of this book meaningful.
Lisa is an excellent editor of the Mechanical Industry Press. It is very trustworthy. During her writing over the past six months, she spent a lot of time and energy reading my books and pointed out many incorrect texts and formats, her suggestion greatly improved the readability of the book.
In the past six months, writing at work has put a lot of pressure on me. Therefore, I would like to thank my parents for taking care of me in my life, so that I can devote myself to writing. In addition to busy work, writing takes up most of the rest time. Thanks to my wife for her understanding and encouragement, I have always devoted myself to writing this book with high morale.
I would like to thank my colleagues who have been working with them for their new insights on technology and those passionate years, so that I love server technology development more and more.
I would like to dedicate this book to my dearest family and many friends who love nginx.
Tao Hui

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.