supervisor nginx_Supervisor 的使用和进阶 (3)

本文主要介绍 supervisor 对 fastcgi 进程的管理

在php 中,php-fpm 有主进程来管理和维护子进程的数量。但是并不是所有的服务都有类似的主进程来做子进程的维护。在其他语言中,有很多比较有名的fastcgi 服务,例如py 的flup, c++ 实现的 FastCgi++等,如果这些服务在单机中启动多个进程(极有可能),那如何管理这些进程是个比较头疼的问题。

supervisor 的fastcgi 管理功能就是为了解决这个问题。supervisor 提供了如下配置,用于对fastcgi 的管理。在普通进程配置参数的基础上,添加如下配置:

123456
[fcgi-program:x]socket = "tcp://10.3.2.10:9002"     ; 支持 tcp ,或者 Unix socketsocket_backlog = 1024               ; 2 的N次方, 根据机器配置设置, 默认是端口最大监听量socket_owner = chrism:wheel         ; 监听用户组socket_mode = 0700                  ; 监听模式

下面通过一个简单的例子说明fastcgi的管理模式

1. 实现一个简单的fastcgi 服务

通过监听127.0.0.1:9001 端口对 fastcgi 请求做处理。处理流程为:暂停1s,打印处理的进程id。(为了能看到不同进程做了响应,因此对进程暂停1s处理,并打印进程id。)

12345678910111213141516171819202122232425
// fastcgi.gopackage mainimport (	"net"	"net/http"	"net/http/fcgi"	"os"	"strconv"	"time")type FastCGIServer struct{}// 暂停1s, 打印标识的进程idfunc (s FastCGIServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) {	time.Sleep(time.Second)	resp.Write([]byte("ProcessId: " + strconv.Itoa(os.Getpid()) + "\n"))}func main() {	listener, _ := net.Listen("tcp", "127.0.0.1:9001")	srv := new(FastCGIServer)	fcgi.Serve(listener, srv)}

通过如下命令得到一个简单的fastcgi 二进制文件。

1
go build -o fastcgi fastcgi.go

生成的fastcgi 就是一个简单的fastcgi 服务。

2. 修改 supervisor 的配置

修改supervisor 的配置,将fastcgi 服务添加到supervisor 管理,并启动6个fastcgi 进程。

在supervisord.conf 添加如下配置:

123456789
[fcgi-program:fastcgi_test]socket=tcp://127.0.0.1:9001command=/root/test/fastcgiautostart=truestopwaitsecs=1000autorestart=trueuser=rootprocess_name=%(program_name)s_%(process_num)02dnumprocs=6

修改完成后,需要刷新supervisord 的配置,并启动fastcgi。

12
supervisorctl updatesupervisorctl start fastcgi_test:*
3. 修改nginx 的配置

Nginx 配置如下:

1234567
server {        listen 127.0.0.1:8080;        location / {                include         fastcgi.conf;                fastcgi_pass    127.0.0.1:9001;        }}

并通过如下命令重新加载 nginx 配置。

1
nginx -s reload

4. 做一个简单的请求实验

对nginx 重新加载配置后,我们请求8080 端口,看服务的请求情况:

异步 post 10次 (同步不会均匀分配)http 请求:

12
#  for i in `seq 1 10`; do curl 'http://127.0.0.1:8080/app?helloworld' & done#  ProcessId: 11319ProcessId: 11299ProcessId: 11300ProcessId: 11307ProcessId: 11307ProcessId: 11311ProcessId: 11311ProcessId: 11315ProcessId: 11315ProcessId: 11319

结果显示,http请求被均匀的分配到不同的fastcgi 上。

5. 做进程意外退出的实验

当某个 fastcgi 进程意外退出时(通过手动 kill 进程),supervisor 自动再次启动一个fastcgi 做为补充(这是supervisor的基本功能),这就实现了PHP-FPM master 进程的主要功能。

实现原理

正常情况下,一个端口只能被一个进程监听。但是刚刚看到的情况是,多个fastcgi同时启动,监听 9001 端口。这是因为linux 系统中,如果父进程监听端口拿到监听的文件描述符,fork 的子进程可以继承父进程的文件描述符,因此多个进程可以监听同一个端口(php-fpm,nginx 的进程管理均是如此)。
通过pstree 命令我们可以看到supervisord 是父进程,管理了6个fastcgi子进程:

6dc5348b05106d6a056e9c97379cfaac.png

实现的功能

supervisor 在管理fastcgi 的进程中,和管理普通进程的差别是,supervisord 进程会创建socket 链接,共享给 supervisor 子进程 fastcgi ,但是非fastcgi 的进程不会被共享。

ab34549ee1a265b13bde9ebfbfdd31ae.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值