### C.1 編譯與安裝[](http://tengine.taobao.org/book/appendix_c.html#c-1 "永久鏈接至標題")
[](http:// "點擊提交Issue,反饋你的意見...")
### 環境要求[](http://tengine.taobao.org/book/appendix_c.html#id1 "永久鏈接至標題")
操作系統:目前Nginx各版本在以下操作系統和平臺測試通過:
> FreeBSD 3 — 10 / i386; FreeBSD 5 — 10 / amd64;
> Linux 2.2 — 3 / i386; Linux 2.6 — 3 / amd64;
> Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
> AIX 7.1 / powerpc;
> HP-UX 11.31 / ia64;
> MacOS X / ppc, i386;
> Windows XP, Windows Server 2003
磁盤空間:必須保證至少10M以上的磁盤工具,并且隨著編譯設置及第三方模塊的安裝而有所不同;
編譯器及相關工具: 必須確保操作系統安裝有GCC編譯器;make工具;用戶可通過yum命令安裝編譯器及相關工具:yum -y install gcc gcc-c++ make;
模塊依賴性:Nginx的一些模塊需要第三方庫的支持,如rewrite模塊需要pcre庫,gzip模塊需要zlib模塊,ssl功能你需要openssl庫等。用戶可通過yum命令安裝這些依賴庫:yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel;
[](http:// "點擊提交Issue,反饋你的意見...")
### 下載[](http://tengine.taobao.org/book/appendix_c.html#id2 "永久鏈接至標題")
Nginx是開源軟件,用戶可以訪問?[http://nginx.org/](http://nginx.org/)?網站獲取源碼包或Windows二進制文件下載。其中1.3.x版本為開發版本,1.2.x版本為穩定版本。開發版本分支會較快的獲得新功能和缺陷修復,但同時也可能會遇到新的缺陷。一旦更新穩定下來,就會被加入穩定版本分支。
作為生產環境,通常建議用戶使用穩定版本。
[](http:// "點擊提交Issue,反饋你的意見...")
### Nginx在Windows環境下安裝[](http://tengine.taobao.org/book/appendix_c.html#nginxwindows "永久鏈接至標題")
nginx的windows版本使用原生win32 API(非Cygwin模擬層)。當前存在的已知問題:1.采用select作為通知方法,所以不具備很高的性能和擴展性;2.雖然可以啟動若干工作進程運行,實際上只有一個進程在處理請求所有請求;3.一個工作進程只能處理不超過1024個并發連接;4.緩存和其他需要共享內存支持的模塊在windows vista及后續版本的操作系統中無法工作,因為在這些操作系統中,地址空間的布局是隨機的;5.除了XSLT過濾器、圖像過濾器、GeoIP模塊和嵌入Perl語言支持以外,Nginx的Windows版本與Unix版本相比,功能幾乎齊全。
安裝Nginx的Windows版本,建議下載最新的1.3.13開發版本,因為開發分支上包含了所有已知的問題修復,尤其是針對Windows版本的問題修復。解壓下載得到的zip文件,進入nginx-1.3.13目錄,運行nginx。
C盤根目錄下安裝例子
[](http:// "點擊提交Issue,反饋你的意見...")
cd c:\
unzip nginx-1.3.13.zip
cd nginx-1.3.13
start nginx
Nginx的Windows版本的控制命令包含如下:
[](http:// "點擊提交Issue,反饋你的意見...")
nginx -s stop 快速退出
nginx -s quit 優雅退出
nginx -s reload 更換配置,啟動新的工作進程,優雅的關閉以往的工作進程
nginx -s reopen 重新打開日志文件
[](http:// "點擊提交Issue,反饋你的意見...")
### Nginx在Linux環境下安裝[](http://tengine.taobao.org/book/appendix_c.html#nginxlinux "永久鏈接至標題")
Nginx在Linux環境下可以通過編譯源碼的方式安裝,最簡單的安裝命令如下:
[](http:// "點擊提交Issue,反饋你的意見...")
wget http://nginx.org/download/nginx-1.2.0.tar.gz
tar zxvf nginx-1.2.0.tar.gz
cd nginx-1.2.0
./configure
make
sudo make install
按照以上命令,Nginx將被默認安裝到/usr/local/nginx目錄下。用戶可以通過./configure –help命令查看Nginx可選擇的編譯選項進行自定義安裝配置。
Nginx的configure腳本支持以下選項:
[](http:// "點擊提交Issue,反饋你的意見...")
--prefix=<PATH> #Nginx安裝路徑。如果沒有指定,默認為 /usr/local/nginx
--sbin-path=<PATH> #Nginx可執行文件安裝路徑。只能安裝時指定,如果沒有指定,默認為<prefix>/sbin/nginx
--conf-path=<PATH> #在沒有給定-c選項下默認的nginx.conf的路徑。如果沒有指定,默認為<prefix>/conf/nginx.conf
--pid-path=<PATH> #在nginx.conf中沒有指定pid指令的情況下,默認的nginx.pid的路徑。如果沒有指定,默認為 <prefix>/logs/nginx.pid
--lock-path=<PATH> #nginx.lock文件的路徑
--error-log-path=<PATH> #在nginx.conf中沒有指定error_log指令的情況下,默認的錯誤日志的路徑。如果沒有指定,默認為 <prefix>/logs/error.log
--http-log-path=<PATH> #在nginx.conf中沒有指定access_log指令的情況下,默認的訪問日志的路徑。如果沒有指定,默認為 <prefix>/logs/access.log。
--user=<USER> #在nginx.conf中沒有指定user指令的情況下,默認的nginx使用的用戶。如果沒有指定,默認為 nobody
--group=<GROUP> #在nginx.conf中沒有指定user指令的情況下,默認的nginx使用的組。如果沒有指定,默認為 nobody
--builddir=DIR #指定編譯的目錄
--with-rtsig_module #啟用 rtsig 模塊
--with-select_module(--without-select_module) #允許或不允許開啟SELECT模式,如果configure沒有找到合適的模式,比如,kqueue(sun os)、epoll(linux kenel 2.6+)、rtsig(實時信號)或/dev/poll(一種類似select的模式,底層實現與SELECT基本相同,都是采用輪詢的方法),SELECT模式將是默認安裝模式
--with-poll_module(--without-poll_module) #允許或不允許開啟POLL模式,如果沒有合適的模式,比如:kqueue(sun os)、epoll(liunx kernel 2.6+),則開啟該模式
--with-http_ssl_module #開啟HTTP SSL模塊,使NGINX可以支持HTTPS請求。這個模塊需要已經安裝了OPENSSL,在DEBIAN上是libssl
--with-http_realip_module #啟用 ngx_http_realip_module
--with-http_addition_module #啟用 ngx_http_addition_module
--with-http_sub_module #啟用 ngx_http_sub_module
--with-http_dav_module #啟用 ngx_http_dav_module
--with-http_flv_module #啟用 ngx_http_flv_module
--with-http_stub_status_module #啟用 "server status" 頁
--without-http_charset_module #禁用 ngx_http_charset_module
--without-http_gzip_module #禁用 ngx_http_gzip_module. 如果啟用,需要 zlib 。
--without-http_ssi_module #禁用 ngx_http_ssi_module
--without-http_userid_module #禁用 ngx_http_userid_module
--without-http_access_module #禁用 ngx_http_access_module
--without-http_auth_basic_module #禁用 ngx_http_auth_basic_module
--without-http_autoindex_module #禁用 ngx_http_autoindex_module
--without-http_geo_module #禁用 ngx_http_geo_module
--without-http_map_module #禁用 ngx_http_map_module
--without-http_referer_module #禁用 ngx_http_referer_module
--without-http_rewrite_module #禁用 ngx_http_rewrite_module. 如果啟用需要 PCRE 。
--without-http_proxy_module #禁用 ngx_http_proxy_module
--without-http_fastcgi_module #禁用 ngx_http_fastcgi_module
--without-http_memcached_module #禁用 ngx_http_memcached_module
--without-http_limit_zone_module #禁用 ngx_http_limit_zone_module
--without-http_empty_gif_module #禁用 ngx_http_empty_gif_module
--without-http_browser_module #禁用 ngx_http_browser_module
--without-http_upstream_ip_hash_module #禁用 ngx_http_upstream_ip_hash_module
--with-http_perl_module #啟用 ngx_http_perl_module
--with-perl_modules_path=PATH #指定 perl 模塊的路徑
--with-perl=PATH #指定 perl 執行文件的路徑
--http-log-path=PATH #指定http默認訪問日志的路徑
--http-client-body-temp-path=PATH #指定http客戶端請求緩存文件存放目錄的路徑
--http-proxy-temp-path=PATH #指定http反向代理緩存文件存放目錄的路徑
--http-fastcgi-temp-path=PATH #指定http FastCGI緩存文件存放目錄的路徑
--without-http #禁用 HTTP server
--with-mail #啟用 IMAP4/POP3/SMTP 代理模塊
--with-mail_ssl_module #啟用 ngx_mail_ssl_module
--with-cc=PATH #指定 C 編譯器的路徑
--with-cpp=PATH #指定 C 預處理器的路徑
--with-cc-opt=OPTIONS #設置C編譯器的額外選項
--with-ld-opt=OPTIONS #設置鏈接的額外選項
--with-cpu-opt=CPU #為特定的 CPU 編譯,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre #禁止 PCRE 庫的使用。同時也會禁止 HTTP rewrite 模塊。在 "location" 配置指令中的正則表達式也需要 PCRE
--with-pcre=DIR #指定 PCRE 庫的源代碼的路徑
--with-pcre-opt=OPTIONS #設置PCRE的額外編譯選項
--with-md5=DIR #使用MD5匯編源碼
--with-md5-opt=OPTIONS #設置MD5庫的額外編譯選項
--with-md5-asm #使用MD5匯編源碼
--with-sha1=DIR #設置sha1庫的源代碼路徑
--with-sha1-opt=OPTIONS #設置sha1庫的額外編譯選項
--with-sha1-asm #使用sha1匯編源碼
--with-zlib=DIR #設置zlib庫的源代碼路徑
--with-zlib-opt=OPTIONS #設置zlib庫的額外編譯選項
--with-zlib-asm=CPU #zlib針對CPU的優化,合法的值是: pentium, pentiumpro
--with-openssl=DIR #設置OpenSSL庫的源代碼路徑
--with-openssl-opt=OPTIONS #設置OpenSSL庫的額外編譯選項
--with-debug #啟用調試日志
--add-module=PATH #添加一個在指定路徑中能夠找到的第三方模塊
在不同版本間,選項可能會有些許變化,請總是使用./configure –help命令來檢查當前的選項列表。
[](http:// "點擊提交Issue,反饋你的意見...")
### 測試[](http://tengine.taobao.org/book/appendix_c.html#id3 "永久鏈接至標題")
將Nginx conf文件的server block部分的配置如下:
[](http:// "點擊提交Issue,反饋你的意見...")
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
用戶可以通過訪問“[http://localhost:80/index.html](http://localhost/index.html)”頁面來查看Nginx的歡迎頁面。
[](http:// "點擊提交Issue,反饋你的意見...")
### Nginx在Windows環境下查看nginx進程[](http://tengine.taobao.org/book/appendix_c.html#nginxwindowsnginx "永久鏈接至標題")
用戶還可以通過命令行運行tasklist命令來查看nginx進程:
[](http:// "點擊提交Issue,反饋你的意見...")
C:\>tasklist /fi "imagename eq nginx.exe"
映像名稱 PID 會話名 會話# 內存使用
========================= ======== ================ =========== ============
nginx.exe 463024 Console 1 5,036 K
nginx.exe 462960 Console 1 5,280 K
如果nginx沒有啟動或沒有得到預期展示頁面,可查看error.log文件以查看失敗原因。如果日志文件不存在,可在Windows事件日志中查看。
[](http:// "點擊提交Issue,反饋你的意見...")
### Nginx在Linux環境下查看nginx進程[](http://tengine.taobao.org/book/appendix_c.html#nginxlinuxnginx "永久鏈接至標題")
用戶可以通過執行ps/top命令來查看nginx進程:
[](http:// "點擊提交Issue,反饋你的意見...")
ps aux|grep nginx
admin 24913 0.0 0.0 58596 1048 ? Ss Feb27 0:00 nginx: master process ./nginx
admin 24914 0.0 0.0 72772 5420 ? S Feb27 0:03 nginx: worker process
同上,如果nginx沒有啟動或者沒有得到預期展示頁面,可以查看error.log文件或調試來查看失敗原因。
[](http:// "點擊提交Issue,反饋你的意見...")
### C.2 調試日志[](http://tengine.taobao.org/book/appendix_c.html#c-2 "永久鏈接至標題")
用戶在使用Nginx的過程中,可能會遇到所請求的資源不正確,Nginx Core Dump,段錯誤等異常情況,這時需要有相應的機制來進行調試及問題定位,特別是面對大量的日志信息,合理的調試處理機制對用戶來說是一件非常重要的事情。以下將著重為大家介紹調試日志。
[](http:// "點擊提交Issue,反饋你的意見...")
### 一,開啟調試日志:[](http://tengine.taobao.org/book/appendix_c.html#id4 "永久鏈接至標題")
要開啟調試日志,首先需要在配置Nginx時打開調試功能,然后編譯:
[](http:// "點擊提交Issue,反饋你的意見...")
./configure --with-debug ...
然后在配置文件中設置error_log的級別為:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log /path/to/log debug;
Nginx的Windows二進制版本總是將調試日志開啟的,因此只需要設置debug的日志級別即可。
[](http:// "點擊提交Issue,反饋你的意見...")
### 二,日志級別分析:[](http://tengine.taobao.org/book/appendix_c.html#id5 "永久鏈接至標題")
在此,我們通過分析Nginx源碼了解下Nginx將日志分為幾個等級及不同日志等級之間的相互關系:
> Ngx_log.h代碼
#define NGX_LOG_STDERR 0
#define NGX_LOG_EMERG 1
#define NGX_LOG_ALERT 2
#define NGX_LOG_CRIT 3
#define NGX_LOG_ERR 4
#define NGX_LOG_WARN 5
#define NGX_LOG_NOTICE 6
#define NGX_LOG_INFO 7
#define NGX_LOG_DEBUG 8#define NGX_LOG_DEBUG_CORE 0x010
#define NGX_LOG_DEBUG_ALLOC 0x020
#define NGX_LOG_DEBUG_MUTEX 0x040
#define NGX_LOG_DEBUG_EVENT 0x080
#define NGX_LOG_DEBUG_HTTP 0x100
#define NGX_LOG_DEBUG_MAIL 0x200
#define NGX_LOG_DEBUG_MYSQL 0x400#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
#define NGX_LOG_DEBUG_CONNECTION 0x80000000
#define NGX_LOG_DEBUG_ALL 0x7ffffff0
其中默認有效的第一級別日志是”stderr”,”emerg”,”alert”,”crit”,”error”,”warn”,”notice”,”info”,”debug”。 而Ngx_log.h內列出的其他debug第二級別日志:”debug_core”,”debug_alloc”,”debug_mutex”,”debug_event”,”debug_http”,”debug_mail”,”debug_mysql”等則需要在配置Nginx時啟動調試日志功能才能使用,并且用戶可以通過修改Ngx_log.h及Ngx_log.c源碼來更新debug第二級別。
我們再通過Ngx_log.c的部分代碼分析下可以如何使用這些日志級別:
> Ngx_log.c代碼
[](http:// "點擊提交Issue,反饋你的意見...")
char *
ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)
{
...
for (n = 1; n <= NGX_LOG_DEBUG; n++) {
if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {
if (log->log_level != 0) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"duplicate log level \"%V\"",
&value[i]);
return NGX_CONF_ERROR;
}
log->log_level = n;
found = 1;
break;
}
}
for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {
if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {
if (log->log_level & ~NGX_LOG_DEBUG_ALL) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid log level \"%V\"",
&value[i]);
return NGX_CONF_ERROR;
}
log->log_level |= d;
found = 1;
break;
}
}
...
if (log->log_level == NGX_LOG_DEBUG) {
log->log_level = NGX_LOG_DEBUG_ALL;
}
...
}
按照以上代碼邏輯,我們可以得出以下結論:
1. 第一級別日志之間是互斥的,如果配置文件內加入如下配置項:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log path/logs/error.log warn;
error_log path/logs/error.log info;
那么啟動Nginx將報錯如下:
[](http:// "點擊提交Issue,反饋你的意見...")
[emerg]: duplicate log level "info" in /path/conf/nginx.conf:XX
但是需要注意的是,在配置文件不同block中是允許重新定義錯誤日志的。但是當用戶在重新定義錯誤日志時,如果沒有指定相應的日志級別,那么調試日志將會被屏蔽。下面的例子里,在server層中重新定義的日志就屏蔽了這個虛擬主機的調試日志:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log /path/to/log debug;
http {
server {
error_log /path/to/log;
...
為了避免這個問題,可以注釋這行重新定義日志的配置,或者也給日志指定debug級別:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log /path/to/log debug;
http {
server {
error_log /path/to/log debug;
...
2. 第二級別日志是多選的,用戶可以根據項目需要配置多個第二級別日志:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log logs/error.log debug_mysql;
error_log logs/error.log debug_core;
3. 在第一級別日志與第二級別日志組合配置時,僅有在第一級別日志為”debug”時才可以有第二級別的配置,其他第一級別日志的情況下指定第二級別日志將無法啟動Nginx,如:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log logs/error.log error;
error_log logs/error.log debug_core;
啟動Nginx將獲得如下錯誤信息:
[](http:// "點擊提交Issue,反饋你的意見...")
[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX
當用戶開啟debug級別日志時,會輸出所有debug_開頭的調試信息,因此可以通過上面組合debug_core|debug_http的形式來獲取用戶所需要的調試信息。
[](http:// "點擊提交Issue,反饋你的意見...")
### 三,日志格式設置:[](http://tengine.taobao.org/book/appendix_c.html#id6 "永久鏈接至標題")
用戶在使用Nginx提供web服務的時候,可能會有很多場景需要記錄日志,如打點日志,訪問日志,數據統計日志,性能分析日志等。為了更加方便的對日志進行分析,我們可以通過設置日志格式的方式來要求Nginx按照用戶要求進行日志的展現。
控制nginx日志輸出的指令如下:
[](http:// "點擊提交Issue,反饋你的意見...")
log_format customLog "$remote_addr^A$remote_user^A$time_local^A$request_method^A$uri^A$args^A$server_protocol"
"^A$status^A$body_bytes_sent^A$http_referer"
"^A$http_user_agent";
access_log /path/logs/access.log customLog;
上面例子中通過使用特殊字符(^A)來作為日志字段的分隔符,用戶后續可以使用sort和grep之類的工具對特定url做分析,如統計各url請求量倒排取前50個:
[](http:// "點擊提交Issue,反饋你的意見...")
awk -F^A '{print $5}' /path/logs/access.log | sort | uniq -c | sort -nr | head -50
類似上面的日志定制化設置,可以讓用戶在調試日志的過程中隨心所欲,如魚得水。 詳細的log_format指令和access_log指令,用戶可以訪問Nginx官網的HttpLog模塊[http://wiki.nginx.org/HttpLogModule](http://wiki.nginx.org/HttpLogModule)?。
[](http:// "點擊提交Issue,反饋你的意見...")
### 四,調試日志的幾個注意點:[](http://tengine.taobao.org/book/appendix_c.html#id7 "永久鏈接至標題")
1. 勘誤:在Nginx Wiki里面error log相關部分([http://wiki.nginx.org/NginxHttpMainModule#error_log](http://wiki.nginx.org/NginxHttpMainModule#error_log)?)的介紹中提到
[](http:// "點擊提交Issue,反饋你的意見...")
Default values for the error level:
in the main section - error
in the HTTP section - crit
in the server section - crit
但是,我們從源碼上看:
[](http:// "點擊提交Issue,反饋你的意見...")
static char *
ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
...
if (cf->args->nelts == 2) {
cf->cycle->new_log.log_level = NGX_LOG_ERR;
return NGX_CONF_OK;
}
...
}
當error_log 的日志級別選項為配置時,默認日志級別為error,無上面提及的三個section的區別。故特在此勘誤。
2. 配置error_log off并不能關閉日志記錄——日志信息會被寫入到文件名為off的文件當中。如果要關閉日志記錄,用戶可以做如下配置:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log /dev/null crit;
3. 如果nginx進程沒有權限將日志信息寫入指定的log地址,那么nginx會在啟動是報錯:
[](http:// "點擊提交Issue,反饋你的意見...")
[alert]: could not open error log file: open() "/path/log/nginx/error.log" failed (13: Permission denied)
4. 通過debug_connection配置項,用戶可以針對某些地址開啟調試日志:
[](http:// "點擊提交Issue,反饋你的意見...")
error_log /path/to/log;
events {
debug_connection 10.232.10.1;
debug_connection 10.232.10.0/24;
}
[](http:// "點擊提交Issue,反饋你的意見...")
### C.3 使用GDB調試[](http://tengine.taobao.org/book/appendix_c.html#c-3-gdb "永久鏈接至標題")
[](http:// "點擊提交Issue,反饋你的意見...")
### C.4 功能測試[](http://tengine.taobao.org/book/appendix_c.html#c-4 "永久鏈接至標題")
[](http:// "點擊提交Issue,反饋你的意見...")
### C.5 性能/壓力測試[](http://tengine.taobao.org/book/appendix_c.html#c-5 "永久鏈接至標題")
[](http:// "點擊提交Issue,反饋你的意見...")
### C.6 常見缺陷分析
- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試