nginx進程管理==> master + 多個worker進程
master進程:全局的初始化 和管理 worker進程
worker進程:主要業務邏輯,事件處理
通信:socketpair ==> 每次fork完一個子進程後都把句柄傳給前面已經存在的進程,以達到子進程間通信
nginx有多進程啟動和單進程啟動
主要分析多進程啟動:
nginx中的fork在ngx_spawn_process函數中進行
ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,char *name, ngx_int_t respawn)
第一個參數是全局的配置,第二個參數是子進程需要執行的函數,第三個參數是proc的參數,第四個類型
/*作用::
1 有一個ngx_processes全局數組,包含了所有的存貨的子進程,這裡會fork出來的子進程放入到相應的位置。
並設置這個進程的相關屬性。
2 創建socketpair,並設置相關屬性。
3 在子進程中執行傳遞進來的函數。
*/
nginx進程結構:
typedef struct
{
ngx_pid_t pid; //進程的ID
int status; //進程的退出狀態
ngx_socket_t channel[2]; //用於socketpair通信的一對socket句柄
ngx_spawn_proc_pt proc; //進程的執行函數
void *data; //proc的參數
char *name; //進程的title標識
unsigned respawn:1; //進程的狀態:重新創建的
unsigned just_spawn:1; //進程的狀態: 第一次創建的
unsigned detached:1; //進程的狀態: 分離的,獨立的
unsigned exiting:1; //進程的狀態: 正在退出的
unsigned exited:1; //進程的狀態: 已經退出的
} ngx_process_t;(src/os/unix/ngx_process.h)
master每創建一個worker都會把一個設置好的ngx_process_t結構變量放入ngx_processes中,新創建的進程存放在ngx_process_slot位置(遍歷數組,查看是否空閒 id == -1)
master進程向worker子進程發送命令是通過socketpair創建的一對socket實現的,之間傳輸的是ngx_channel_t結構變量:
typedef struct
{
ngx_uint_t command; //發送的命令
ngx_pid_t pid; //發送方進程的進程id
ngx_int_t slot; //發送方進程在進程表中偏移位置
ngx_fd_t fd; //發送給對方的文件句柄
} ngx_channel_t;(src/os/unix/ngx_channel.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
閱讀更多 Java高級架構技術 的文章