如何解决Apache-2.4 AH02026:无法获取SSL会话缓存锁

如何解决Apache-2.4 AH02026:无法获取SSL会话缓存锁

我刚刚建立了一个新的 AWS Ubuntu 16.04 服务器,该服务器运行 Apache2.4,并通过不同的套接字提供 PHP-FPM 5.6 和 7.1。一切运行正常,但我在 Apache 错误日志中收到以下错误:

[Mon Jun 19 05:48:06.158306 2017] [ssl:warn] [pid 18652:tid 140274127963904] (35)Resource deadlock avoided: AH02026: Failed to acquire SSL session cache lock

现在,我不是服务器专家,这就是我来这里的原因。我想这可能是 SSL 套接字缓存目录的权限问题,但这超出了我的舒适区,所以我需要一些专家的建议/指导。

cd进入 Apache 目录并grep查看该术语,结果APACHE_RUN_DIR如下:

foo@bar:/etc/apache2# grep -R "APACHE_RUN_DIR" ./
./mods-available/cgid.conf:ScriptSock ${APACHE_RUN_DIR}/cgisock
./mods-available/ssl.conf:      #SSLSessionCache                 dbm:${APACHE_RUN_DIR}/ssl_scache
./mods-available/ssl.conf:      SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
./mods-enabled/ssl.conf:        #SSLSessionCache                 dbm:${APACHE_RUN_DIR}/ssl_scache
./mods-enabled/ssl.conf:        SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
./envvars:export APACHE_RUN_DIR=/var/run/apache2$SUFFIX

因此,我们不仅可以看到 mod_ssl 可用且已启用,而且它还运行着一个配置,该配置表明SSLSessionCache位于${APACHE_RUN_DIR}/ssl_scache,这相当于/var/run/apache2/ssl_scache

我注意到该目录不存在,因此我使用 创建了它,cd /var/run/apache2然后使用。在目录上mkdir ssl_scache运行会得到以下结果:ls

foo@bar:/etc/apache2# ls -lsa /var/run/apache2/
total 4
0 drwxr-xr-x  3 root root   80 Jun 19 15:34 .
0 drwxr-xr-x 25 root root 1060 Jun 19 14:44 ..
4 -rw-r--r--  1 root root    6 Jun 19 15:46 apache2.pid
0 drwxr-xr-x  2 root root   40 Jun 19 15:34 ssl_scache
foo@bar:/etc/apache2# ls -lsa /var/run/apache2/ssl_scache/
total 0
0 drwxr-xr-x 2 root root 40 Jun 19 15:34 .
0 drwxr-xr-x 3 root root 80 Jun 19 15:34 ..

另外,我们在使用ps aux寻找 Apache 时也遇到了这种情况:

foo@bar:/etc/apache2# ps aux | grep "apache"
root     16506  0.0  0.1 109328  9104 ?        Ss   Jun18   0:03 /usr/sbin/apache2 -k start
root     17387  0.0  0.0  22780  4808 pts/0    T    15:22   0:00 nano apache.error.log
www-data 18652  0.4  0.3 2044052 23388 ?       Sl   15:46   0:04 /usr/sbin/apache2 -k start
www-data 18720  0.4  0.3 2044728 24104 ?       Sl   15:48   0:03 /usr/sbin/apache2 -k start
www-data 18839  0.4  0.2 2043272 22480 ?       Sl   15:50   0:02 /usr/sbin/apache2 -k start
root     18913  0.0  0.0  12944   964 pts/0    S+   16:01   0:00 grep --color=auto apache

因此我可以看到 Apache 进程以用户身份运行www-data。我猜也许它无法访问文件夹/var/run/apache2/ssl_scache?但正如我所说,我不是专家。

有人能解释一下为什么我总是收到AH02026错误吗?

答案1

所以我找到了问题的根源和解决方案。原来是 Ubuntu 14.04 和 16.04 上的 Apache2.4 中有一个错误(请参阅https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1565744)。

默认情况下,文件中的此行/etc/apache2/apache.conf未被注释:

Mutex file:${APACHE_LOCK_DIR} default

按理说,此配置指令应使互斥文件使用默认机制。如果在 Apache2 的 vanilla 安装中从命令提示符运行以下命令:

apache2ctl -t -D DUMP_RUN_CFG

...它应该给出以下输出:

Mutex default: dir="/var/lock/apache2" mechanism=default

相反,由于这个错误,它产生了这个:

Mutex default: dir="/var/lock/apache2" mechanism=fcntl

有两种可能的解决方法:

  1. 长期的解决办法是使用 fcntl 机制而不是默认机制,这将包括创建互斥文件、授予它们权限、设置套接字、监视它们,以及一大堆痛苦的事情,我不会在这里讨论(主要是因为这超出了我的工资等级)
  2. 简单的解决方法是注释掉中的互斥行/etc/apache2/apache.conf,如下所示:

    #Mutex file:${APACHE_LOCK_DIR} default

...这导致 Apache 使用默认机制。

相关内容