Nginx進程管理

Nginx進程管理

nginx進程管理==> master + 多個worker進程

master進程:全局的初始化 和管理 worker進程

worker進程:主要業務邏輯,事件處理

通信:socketpair ==> 每次fork完一個子進程後都把句柄傳給前面已經存在的進程,以達到子進程間通信

nginx有多進程啟動和單進程啟動

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

Nginx進程管理


分享到:


相關文章: