簡體   English   中英

通過fast-cgi連接php-fpm和nginx之間的連接是持久的(保持活動)連接嗎?

[英]Whether the connection between php-fpm and nginx by fast-cgi are persistent (keep-alive) connection?

我正在嘗試編寫一個服務器演示來連接php-fpm,但我不知道php-fpm和nginx之間的連接是否是fast-cgi是持久的(保持活動)連接? 每當http請求到nginx時,nginx會再次通過tcp 3-Way Handshake連接php-fpm嗎? 或者nginx和php-fpm之間的連接是一個keep-alive連接,而nginx嘗試重用它?

PHP-FPM是fastCGI協議的一種實現,因此它遵守所有fastCGI規范要求。

其中一個要求是在規范的第3.5節中 ,特別是關於Closing連接:

Web服務器控制傳輸連接的生命周期。 沒有請求處於活動狀態時,Web服務器可以關閉連接。 或者Web服務器可以將關閉權限委派給應用程序(請參閱FCGI_BEGIN_REQUEST)。 在這種情況下,應用程序在指定請求結束時關閉連接。 這種靈活性適用於各種應用程序樣式。 簡單應用程序將一次處理一個請求,並為每個請求接受新的傳輸連接。 更復雜的應用程序將通過一個或多個傳輸連接處理並發請求,並使傳輸連接長時間保持打開狀態。

通過在完成寫入響應時關閉傳輸連接,簡單的應用程序可以顯着提升性能。 Web服務器需要控制長期連接的連接生存期。

當應用程序關閉連接或發現連接已關閉時,應用程序將啟動新連接。

這意味着由Web服務器決定連接是否會持續存在。 這是通過fastcgi_keep_conn選項在nginx中實現的,該選項指出:

默認情況下,FastCGI服務器將在發送響應后立即關閉連接。 但是,當此偽指令設置為on時,nginx將指示FastCGI服務器保持連接打開。 特別是,這對於與FastCGI服務器的keepalive連接起作用是必要的。

此語句用於反映規范行為以及可以為fastCGI生成的內容提供服務以修改默認行為的Web服務器的功能。

我的假設是,由於網絡服務器的線程不斷被回收,因此保持連接不存在真正的意義。 也許有一定數量的停放線程,但通常的線程池策略是殺死最近最少使用的線程,通常這意味着生成一個新線程將確保預先退出的線程被殺死。

不可否認,我沒有找到任何資源來支持nginx的池收集策略是LRU的說法,但它不是不可能的,在這種情況下保持連接存活不會節省太多。

一年后,我問這個問題,我似乎找到了答案。

(gdb) bt
#0  close () at ../sysdeps/unix/syscall-template.S:84
#1  0x0000000000a40dff in fcgi_close (req=0x1dae3c0, force=0, destroy=1) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1311
#2  0x0000000000a41a0d in fcgi_finish_request (req=0x1dae3c0, force_close=0) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1670
#3  0x0000000000a4d3b3 in sapi_cgi_deactivate () at /home/dinosaur/Downloads/php-7.2.2/sapi/fpm/fpm/fpm_main.c:828
#4  0x00000000008bcf35 in sapi_deactivate () at /home/dinosaur/Downloads/php-7.2.2/main/SAPI.c:532
#5  0x00000000008afa0e in php_request_shutdown (dummy=0x0) at /home/dinosaur/Downloads/php-7.2.2/main/main.c:1913
#6  0x0000000000a50614 in main (argc=1, argv=0x7ffc8b6936e8) at /home/dinosaur/Downloads/php-7.2.2/sapi/fpm/fpm/fpm_main.c:1994

當php-fpm啟動時,在init之后,它在while循環中處理每個請求

while (fcgi_accept_request(request) >= 0) {
   ...
   php_execute_script(&file_handle);   // zend engine compile and run the opcode
   ...
   php_request_shutdown((void *) 0);  // close connection
}

在函數fcgi_accept_request ,套接字fd為4

1411    req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
(gdb) n
1414    client_sa = sa;
Breakpoint 6, fcgi_accept_request (req=0x1dae3c0) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1414
1414    client_sa = sa;
(gdb) p req->fd
$18 = 4

關閉時,關閉插座fd 4

Breakpoint 4, fcgi_close (req=0x1dae3c0, force=0, destroy=1) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1272
1272    {
(gdb) p req->fd
$19 = 4

結論

所以,我認為在php7中,fpm在請求完成時關閉,所以它不是持久連接?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM