星期六, 5月 11, 2024

Apache CGI 的中止行為

最近忽然好奇 Linux 下 Apache httpd CGI 的一些 Signal 相關的事情。 特此紀錄一些資訊.

以下的測試結果來自 docker hub 的 apache httpd:2.4.59

被 Block 的訊號

在 CGI 剛啟動時,會直接繼承 httpd 所 Block 的訊號. 根據使用的 mpm (multiple-process-module) 不同,被 Block 的訊號也不同
event prefork worker
SigBlk fffffffe3ffbea07 0000000000000000 fffffffe3ffbe807
底下為 mpm event 比較好閱讀的 Block 列表, prefork 沒有 block 任何 signal, worker 少 block SIGUSR1
1 SIGHUP: 1
2 SIGINT: 1
3 SIGQUIT: 1
4 SIGILL: 0
5 SIGTRAP: 0
6 SIGABRT: 0
6 SIGIOT: 0
7 SIGBUS: 0
8 SIGFPE: 0
9 SIGKILL: 0
10 SIGUSR1: 1
11 SIGSEGV: 0
12 SIGUSR2: 1
13 SIGPIPE: 0
14 SIGALRM: 1
15 SIGTERM: 1
16 SIGSTKFLT: 1
17 SIGCHLD: 1
17 SIGCLD: 1
18 SIGCONT: 1
19 SIGSTOP: 0
20 SIGTSTP: 1
21 SIGTTIN: 1
22 SIGTTOU: 1
23 SIGURG: 1
24 SIGXCPU: 1
25 SIGXFSZ: 1
26 SIGVTALRM: 1
27 SIGPROF: 1
28 SIGWINCH: 1
29 SIGIO: 1
29 SIGPOLL: 1
30 SIGPWR: 1
31 SIGSYS: 0
34 SIGRTMIN: 1
當 CGI 有想要控制 signal 會 fork 出 daemon 之類時,最好對整個 signal 進行一次重設會比較保險

若 Apache Gateway Timeout

三種 mpm module 結果一致
  1. CGI Process 會立即收到 SIGTERM
  2. CGI Process 數秒(測試 3 秒)後收到 SIGKILL
  3. SIGTERM 與 SIGKILL 不發送給 CGI 另外 fork 的 process

若 HTTP Client 切斷連線的話

三種 mpm module 結果一致
  1. 切斷連線後有對 stdout 發送訊息的情況下
    1. 數杪後(測試 3 秒)會收到 SIGTERM
    2. 收到 SIGTERM 後如果對 stdout 繼續發送訊息,會收到 SIGPIPE
    3. 數杪後(測試 3 秒)會收到 SIGKILL
  2. 切斷連線後沒對 stdout 發送訊息的情況下,以 Gateway Timeout 的方式處理
  3. SIGTERM 與 SIGKILL 不發送給 CGI 另外 fork 的 process