敬请关注公众号:搬砖程序员带你飞,学习更多。本文主要介绍supervisor对fastcgi进程的管理。在php中,php-fpm有一个主进程来管理和维护子进程的数量。但并不是所有的服务都有类似的主流程来维护子流程。在很多其他语言中,有很多知名的fastcgi服务,比如py的flup,c++实现的FastCgi++等,如果这些服务在单机上启动了多个进程(很有可能),如何管理这些进程是个头疼的问题.supervisor的fastcgi管理功能就是为了解决这个问题。配置在正常流程的基础上,增加如下配置:[fcgi-program:x]socket="tcp://10.3.2.10:9002"//支持tcp,或者Unixsocketsocket_backlog=1024//2toN次方,根据机器配置设置,默认为最大监听端口socket_owner=chrism:wheel//监听用户组socket_mode=0700//以监听模式为例实现一个简单的fastcgi服务,通过监听处理fastcgi请求到端口127.0.0.1:9001。处理流程为:暂停1s,打印处理后的进程id。(为了看到不同进程有响应,进程暂停1s,打印进程id。)//fastcgi.gopackagemainimport("net""net/http""net/http/fcgi""os""strconv""time")typeFastCGIServerstruct{}//暂停1s,打印识别到的进程idfunc(sFastCGIServer)ServeHTTP(resphttp.ResponseWriter,req*http.Request){time.Sleep(time.Second)resp.Write([]byte("ProcessId:"+strconv.Itoa(os.Getpid())+"\n"))}funcmain(){listener,_:=net.Listen("tcp","127.0.0.1:9001")srv:=new(FastCGIServer)fcgi.Serve(listener,srv)}通过以下命令获取一个简单的fastcgi二进制文件。通过监听127.0.0.1:9001端口进行fastcgi处理。处理内容是暂停1s,打印处理完的进程id。(为了查看不同进程的响应,进程暂停1s,打印进程id)gobuild-ofastcgifastcgi.go生成的fastcgi是一个简单的fastcgi服务。作用是暂停1s,输出当前进程的进程ID。修改supervisor的配置修改supervisor的配置,在supervisor管理中添加fastcgi服务,启动6个fastcgi进程。在supervisord.conf中添加如下配置:[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。supervisorctlupdatesupervisorctlstartfastcgi_test:*#因为有多个fastcgis启动,需要添加:*修改nginx配置Nginx配置如下:server{listen127.0.0.1:8080;位置/{包括fastcgi.conf;fastcgi_pass127.0.0.1:9001;}}并通过以下命令重新加载nginx配置。nginx-sreload做一个简单的请求实验重载nginx配置后,我们请求8080端口,看服务请求:post10requests:#foriin`seq110`;请curl'http://127.0.0.1:8080/app?helledorld'&dook#processID:11319ProcessID:11299ProcessID:11300ProcessID:11307ProcessID:11307ProcessID:11307ProcessID:11307ProcessID:11311ProcessID:11311Processid:11311ProcessId:11311Processid:11313153131531315.11315结果不同的fastcgi上。当一个fastcgi_test意外退出时,supervisor可以再次启动一个fastcgi_test作为补充,实现了PHP-FPMmaster进程的主要功能。实现原理我们知道,一般情况下,一个端口只能被一个进程监听。但是刚才看到的是多个fastcgis同时启动,监听9001端口。这是因为在Linux系统中,如果父进程监听该端口,那么fork的子进程可以继承父进程的文件描述符process,所以多个进程可以监听同一个端口。通过pstree命令可以看出supervisor在管理fastcgi的过程中实现的功能与管理普通进程不同。supervisord进程会创建一个socket链接,共享给supervisorfork的fastcgi进程,非fastcgi进程不会共享。主管的其他介绍:主管的使用和进阶(3)主管的使用和进阶(2)主管的使用和进阶(1)
