Apache-2.4

AIX 6.1 上的 Apache 2.4,具有 Proxy/BalancerMember 的多個虛擬主機 -> 共享記憶體 (shm) slotmem 文件的問題

  • February 1, 2019

我有一個啟用了 mod_proxy/mod_proxy_balancer/mod_slotmem_shm/mod_lbmethod_byrequests 的 Apache 2.4.23 配置。

此外,我有多個 VirtualHost 使用這樣的設置在不同的埠上偵聽(PORT 和 COMPONENT 是唯一的):

Listen PORT

<VirtualHost *:PORT>
   Include "eib/conf/default-proxy-params"

   ErrorLog "logs/PORT-COMPONENT-error.log"
   CustomLog "logs/PORT-COMPONENT-access.log" common

   <Proxy balancer://COMPONENT/>
           BalancerMember https://HOST1:PORT
           BalancerMember https://HOST2:PORT
           ProxySet lbmethod=byrequests
   </Proxy>

   ProxyPass / balancer://COMPONENT/ lbmethod=byrequests nofailover=Off maxattempts=3
   ProxyPassReverse / balancer://COMPONENT/
</VirtualHost>

當我的配置中只有一個 VirtualHost 條目時,一切正常。一旦我添加另一個 VirtualHost,Apache 就會崩潰並出現配置失敗錯誤:

[Wed Oct 12 21:59:38.211829 2016] [slotmem_shm:error] [pid 4129010:tid 1] (24)Too many open files: AH02611: create: apr_shm_create(/apache/logs/slotmem-shm-pf3f0916c.shm) failed
[Wed Oct 12 21:59:38.211927 2016] [:emerg] [pid 4129010:tid 1] AH00020: Configuration Failed, exiting

我已經檢查了 ulimit 是否設置為無限的文件數,所以這不是問題。為 BalancerMemebers 創建的 slotmem 文件之間似乎存在衝突。

當我僅從一個 VirtualHost 開始時,一切都會按預期工作,並且我會創建以下 slotmem 文件:

slotmem-shm-p99964586.shm
slotmem-shm-p99964586_COMPONENT.shm

一個對於虛擬主機來說似乎是唯一的 (_COMPONENT),但第二個看起來可能會導致名稱衝突。

有人知道如何解決這個問題嗎?

讚美和榮幸召集!使用

truss -f apachectl -X 

我能夠將錯誤追溯到 shmat 呼叫

6226262:    45089225: shmat(39845990, 0x00000000, 0)    Err#24 EMFILE

AIX 上的 man shmat 揭示了這個秘密:

提供了擴展的 shmat 功能。如果定義了環境變數 EXTSHM=ON,那麼在該環境中執行的程序將能夠創建和附加超過 11 個共享記憶體段。

我在執行從原始碼編譯的 Apache 的 MacOS 上遇到了類似的錯誤,如果您知道它的含義,事實證明該錯誤實際上是非常具有描述性的。顯然有一些圍繞共享記憶體管理的工具(在 Linux 和 OS X 上)。

在我的情況下執行:

ipcs -m

給了我一些輸出,例如:

IPC status from <running system> as of Fri Feb  1 15:43:45 CET 2019
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x52043973 --rw-------     root    wheel
m 393217 0xe3046b9b --rw-------  myuser1    staff

…然後再說20個。我試圖通過這樣做來釋放它:

ipcrm -m 393217

之後錯誤沒有發生並且apache啟動了。我希望這對任何人都有幫助,它應該可以在 Linux 和 MacOS 上執行,並且可能在 *nix 上執行。

引用自:https://serverfault.com/questions/808708