Nginx學習筆記六Nginx的模塊開發
1.Nginx配置文件主要組成:
main(全局配置)這部分的指令將影響其他所有部分.
server(虛擬主機配置)這部分指令主要用于指定虛擬主機域名,IP和端口.
upstream(主要為反向代理,負載均衡相關配置)這部分指令用于設置反向代理及后端服務
器的負載均衡.
location(目錄匹配配置)這部分指令用于匹配網頁位置(例如,根目錄"/","/images",等
等).
location部分會繼承server部分的指令,而server部分會繼承main部分的指令.upstream
既不會繼承指令也不會影響其他部分.它有自己的特殊指令,不需要在其他地方應用.
2.Nginx模塊概述.
Nginx的模塊不能夠像Apache那樣動態添加,所有的模塊都要預先編譯進Nginx的二進制可
執行文件中.Nginx模塊有三種角色.
(1)Handlers(處理模塊)——用于處理HTTP請求并輸出內容.
(2)Filters(過濾模塊)——用于過濾Handler輸出的內容.
(3)Load-balancers(負載均衡模塊)——當有多于一臺的后端服務器供選擇時,選擇一臺
后端服務器并將HTTP請求轉發到該服務器.
3.Nginx模塊的處理流程:
Nginx發送文件或請求到其他服務器時,可以用Handlers處理模塊為其服務:當需要Nginx
把輸出壓縮或在服務端加一些東西時,可以用Filters過濾模塊.Nginx的核心模塊主要管
理網絡層和應用層協議,以及啟動針對特定應用的一系列候選模塊.
客戶端發送HTTP請求到Nginx服務器
|
Nginx基于配置文件中的位置選擇一個合適的處理模塊
|
負載均衡模塊選擇一臺后端服務器(反向代理情況下)
|
處理模塊進行處理并把輸出緩沖放到第一個過濾模塊上
|
第一個過濾模塊處理后輸出給第二個過濾模塊
|
然后第二個過濾模塊又到了第三個過濾模塊
|
第N個過濾模塊
|
最后把處理結果發送給客戶端
4.模塊執行的位置
模塊相當于鉤子,可以掛在Nginx的以下位置,在某些時候執行某些功能.
(1)當服務讀配置文件之前.
(2)當讀取在location和server部分或其他任何部分的每一個配置指令時。
(3)當Nginx初始化全局部分的配置時.
(4)當Nginx初始化主機部分(比如主機/端口)的配置時.
(5)當Nginx將全局部分的配置與主機部分的配置合并時.
(6)當Nginx初始化匹配位置部分配置時.
(7)當Nginx將其上層主機配置與位置部分配置合并時.
(8)當Nginx的主進程(master)開始時.
(9)當一個新的工作進程(worker)開始時.
(10)當一個工作進程退出時.
(11)當主進程退出時.
(12)處理HTTP請求時.
(13)過濾HTTP回復的頭部時.
(14)過濾HTTP回復的主體時.
(15)選擇一臺后端服務器時.
(16)初始化到后端服務器的請求時.
(17)重新初始化到后端服務器的請求時.
(18)處理來自后端服務器的回復時.
(19)完成與后端服務器的交互時.
5.Nginx模塊編寫例子
(1)執行以下命令創建一個目錄,將在該目錄內編寫我們的Nginx模塊:
mkdir -p /opt/nginx_hello_world
cd /opt/nginx_hello_world
(2)開始創建Nginx模塊所需的配置文件(名稱為config)
vi /opt/nginx_hello_world/config
輸入以下內容并保存退出.
ngx_addon_name=ngx_http_hello_world_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
CORE_LIBS="$CORE_LIBS -lpcre"
(3)創建Nginx模塊的c程序文件(名稱格式為"ngx_http_模塊名稱_module.c",在本實例中
,文件名稱為ngx_http_hello_world_module.c)
vi /opt/nginx_hello_world/ngx_http_hello_world_module.c
(4)下載Nginx源碼包,并將hello world模塊編譯到其中.如下所示
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz
tar zxvf pcre-7.9.tar.gz
cd pcre-7.9/
./configure
make && make install
cd ../
wget http://sysoev.ru/nginx/nginx-0.8.14.tar.gz
tar zxvf nginx-0.8.14.tar.gz
cd nginx-0.8.14/
./configure --prefix=/usr/local/nginx --add-module=/opt/nginx_hello_world
make
make install
(5)配置nginx.conf,在server部分增加以下內容:
location = /hello {
hello_world ;
}
(6)啟動Nginx,用瀏覽器訪問http://localhost/hello,就可以看到編寫的Nginx Hello
World 模塊輸出的文字"Hello World"
6.Hello World模塊分析:
在ngx_http_hello_world_module.c代碼中,ngx_command_t函數用于定義包含模塊指令的
靜態數組ngx_http_hello_world_commands,代碼如下
static ngx_command_t ngx_http_hello_world_commands[] =
{
{
ngx_string ("hello_world"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
ngx_http_hello_world,
0,
0,
NULL
},
ngx_null_command
}
(1)在數組中,第一項參數ngx_string("hello_world")為指令名稱字符串,不能含有空格,
數據類型是ngx_str_t,經常用來進行字符串實例化.ngx_str_t結構體由包含有字符串的
data成員和表示字符串長度的len成員組成.Nginx用這個數據類型來存放字符串.
(2)第二項參數用來設置指令在配置文件位置的哪一部分使用是合法的.可選值如下,多個
選項以"|"隔開:
NGX_HTTP_MAIN_CONF——指令出現在全局配置部分是合法的.
NGX_HTTP_SRV_CONF——指令出現在server主機配置部分是合法的.
NGX_HTTP_LOC_CONF——指令出現在location配置部分是合法的.
NGX_HTTP_UPS_CONF——指令出現在upstream配置部分是合法的.
(3)第三項參數ngx_http_hello_world是一個回調函數.
(4)第四項參數用于告訴Nginx是把要保持的值放在全局配置部分,server主機配置部分還
是location位置配置部分(使用NGX_HTTP_MAIN_CONF_OFFSET,
NGX_HTTP_SRV_CONF_OFFSET,NGX_HTTP_LOC_CONF_OFFSET)
(5)第五項參數用于設置指令的值保存在結構體的哪個位置
(6)第六項參數一般為NULL。
六個參數都設置完畢后,數組在讀入ngx_null_command后停止.