我有一个Apache 2.4.23configuration,启用了mod_proxy / mod_proxy_balancer / mod_slotmem_shm / mod_lbmethod_byrequests。
此外,我有多个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>
当我在我的configuration只有一个VirtualHost条目,一切工作正常。 只要我添加另一个VirtualHost,Apache崩溃configuration失败的错误:
[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创build的slotmem文件之间存在冲突。
当我从一个单一的虚拟主机开始,一切都会按预期工作,我得到以下slotmem文件创build:
slotmem-shm-p99964586.shm slotmem-shm-p99964586_COMPONENT.shm
一个似乎是唯一的(_COMPONENT)的虚拟主机,但第二个看起来像它可能会导致名称冲突。
有人有一个想法如何解决这个问题?
赞美和荣誉包容! 运用
truss -f apachectl -X
我能够跟踪到错误的呼叫
6226262: 45089225: shmat(39845990, 0x00000000, 0) Err#24 EMFILE
AIX上的man shmat揭示了这个秘密:
扩展shmatfunction可用。 如果定义了一个环境variablesEXTSHM = ON,那么在该环境中执行的进程将能够创build并附加多于十一个共享内存段。