AIX 6.1 上的 Apache 2.4,具有 Proxy/BalancerMember 的多個虛擬主機 -> 共享記憶體 (shm) slotmem 文件的問題
我有一個啟用了 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 上執行。