日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

supervisor nginx_Supervisor 的使用和进阶 (3)

發(fā)布時(shí)間:2024/9/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 supervisor nginx_Supervisor 的使用和进阶 (3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文主要介紹 supervisor 對 fastcgi 進(jìn)程的管理

在php 中,php-fpm 有主進(jìn)程來管理和維護(hù)子進(jìn)程的數(shù)量。但是并不是所有的服務(wù)都有類似的主進(jìn)程來做子進(jìn)程的維護(hù)。在其他語言中,有很多比較有名的fastcgi 服務(wù),例如py 的flup, c++ 實(shí)現(xiàn)的 FastCgi++等,如果這些服務(wù)在單機(jī)中啟動(dòng)多個(gè)進(jìn)程(極有可能),那如何管理這些進(jìn)程是個(gè)比較頭疼的問題。

supervisor 的fastcgi 管理功能就是為了解決這個(gè)問題。supervisor 提供了如下配置,用于對fastcgi 的管理。在普通進(jìn)程配置參數(shù)的基礎(chǔ)上,添加如下配置:

123456[fcgi-program:x]socket = "tcp://10.3.2.10:9002" ; 支持 tcp ,或者 Unix socketsocket_backlog = 1024 ; 2 的N次方, 根據(jù)機(jī)器配置設(shè)置, 默認(rèn)是端口最大監(jiān)聽量socket_owner = chrism:wheel ; 監(jiān)聽用戶組socket_mode = 0700 ; 監(jiān)聽模式

下面通過一個(gè)簡單的例子說明fastcgi的管理模式

1. 實(shí)現(xiàn)一個(gè)簡單的fastcgi 服務(wù)

通過監(jiān)聽127.0.0.1:9001 端口對 fastcgi 請求做處理。處理流程為:暫停1s,打印處理的進(jìn)程id。(為了能看到不同進(jìn)程做了響應(yīng),因此對進(jìn)程暫停1s處理,并打印進(jìn)程id。)

12345678910111213141516171819202122232425// fastcgi.gopackage mainimport ( "net" "net/http" "net/http/fcgi" "os" "strconv" "time")type FastCGIServer struct{}// 暫停1s, 打印標(biāo)識的進(jìn)程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)}

通過如下命令得到一個(gè)簡單的fastcgi 二進(jìn)制文件。

1go build -o fastcgi fastcgi.go

生成的fastcgi 就是一個(gè)簡單的fastcgi 服務(wù)。

2. 修改 supervisor 的配置

修改supervisor 的配置,將fastcgi 服務(wù)添加到supervisor 管理,并啟動(dòng)6個(gè)fastcgi 進(jìn)程。

在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 的配置,并啟動(dòng)fastcgi。

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

Nginx 配置如下:

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

并通過如下命令重新加載 nginx 配置。

1nginx -s reload

4. 做一個(gè)簡單的請求實(shí)驗(yàn)

對nginx 重新加載配置后,我們請求8080 端口,看服務(wù)的請求情況:

異步 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

結(jié)果顯示,http請求被均勻的分配到不同的fastcgi 上。

5. 做進(jìn)程意外退出的實(shí)驗(yàn)

當(dāng)某個(gè) fastcgi 進(jìn)程意外退出時(shí)(通過手動(dòng) kill 進(jìn)程),supervisor 自動(dòng)再次啟動(dòng)一個(gè)fastcgi 做為補(bǔ)充(這是supervisor的基本功能),這就實(shí)現(xiàn)了PHP-FPM master 進(jìn)程的主要功能。

實(shí)現(xiàn)原理

正常情況下,一個(gè)端口只能被一個(gè)進(jìn)程監(jiān)聽。但是剛剛看到的情況是,多個(gè)fastcgi同時(shí)啟動(dòng),監(jiān)聽 9001 端口。這是因?yàn)閘inux 系統(tǒng)中,如果父進(jìn)程監(jiān)聽端口拿到監(jiān)聽的文件描述符,fork 的子進(jìn)程可以繼承父進(jìn)程的文件描述符,因此多個(gè)進(jìn)程可以監(jiān)聽同一個(gè)端口(php-fpm,nginx 的進(jìn)程管理均是如此)。
通過pstree 命令我們可以看到supervisord 是父進(jìn)程,管理了6個(gè)fastcgi子進(jìn)程:

實(shí)現(xiàn)的功能

supervisor 在管理fastcgi 的進(jìn)程中,和管理普通進(jìn)程的差別是,supervisord 進(jìn)程會創(chuàng)建socket 鏈接,共享給 supervisor 子進(jìn)程 fastcgi ,但是非fastcgi 的進(jìn)程不會被共享。

總結(jié)

以上是生活随笔為你收集整理的supervisor nginx_Supervisor 的使用和进阶 (3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。