Supervisor 的使用和进阶 (2)
路漫漫其修远兮,吾将上下而求索。
本文主要介绍 supervisor 对 fastcgi 进程的管理
fastcgi 进程的管理
在php 中,php-fpm 有主进程来管理和维护子进程的数量。但是并不是所有的服务都有类似的主进程来做子进程的维护。 在很多其他语言中,有很多比较有名的fastcgi 服务,例如py 的flup, c++ 实现的 FastCgi++等。如果这些服务在单机中启动多个进程(极有可能),那如何管理这些进程是个比较头疼的问题。 supervisor 的fastcgi 管理的功能就是为了解决这个问题。
配置
在普通进程的基础上,添加如下配置:
|
|
举个例子
实现一个简单的fastcgi 服务
通过监听127.0.0.1:9001 端口对 fastcgi 请求做处理。处理流程为:暂停1s,打印处理的进程id。(为了能看到不同进程做了响应,因此对进程暂停1s处理,并打印进程id。)
|
|
通过如下命令得到一个简单的fastcgi 二进制文件。通过监听127.0.0.1:9001 端口做fastcgi 处理。处理内容为暂停1s,并打印处理的进程id。(为了能看到不同进程做了响应,因此对进程暂停1s处理,并打印进程id。)
|
|
生成的fastcgi 就是一个简单的fastcgi 服务。功能为暂停1s,并输出当前进程的进程ID。
修改 supervisor 的配置
修改supervisor 的配置,将fastcgi 服务添加到supervisor 管理,并启动6个fastcgi 进程。
在supervisord.conf 添加如下配置:
|
|
修改完成后,需要刷新supervisord 的配置,并启动fastcgi。
|
|
修改nginx 的配置
Nginx 配置如下:
|
|
并通过如下命令重新加载 nginx 配置。
|
|
做一个简单的请求实验
对nginx 重新加载配置后,我们请求8080 端口,看服务的请求情况:
post 10次请求:
|
|
返回结果,processId 被均匀的分到不同的fastcgi 上。
当某个 fastcgi_test 意外退出时,supervisor 可以再次启动一个fastcgi_test 做补充,这就实现了PHP-FPM master 进程的主要功能。
实现原理
我们知道,正常情况下,一个端口只能被一个进程监听。但是刚刚看到的情况是,多个fastcgi同时启动,监听 9001 端口。这是因为linux 系统中,如果父进程监听端口后,fork 的子进程可以继承父进程的文件描述符,因此多个进程可以监听同一个端口。 通过pstree 命令我们可以看到:
实现的功能
supervisor 在管理fastcgi 的进程中,和管理普通进程的差别是,supervisord 进程会创建socket 链接,共享给 supervisor fork 的fastcgi 进程,但是非fastcgi 的进程不会被共享。