我刚刚建立了一个新的 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
有两种可能的解决方法:
- 长期的解决办法是使用 fcntl 机制而不是默认机制,这将包括创建互斥文件、授予它们权限、设置套接字、监视它们,以及一大堆痛苦的事情,我不会在这里讨论(主要是因为这超出了我的工资等级)
简单的解决方法是注释掉中的互斥行
/etc/apache2/apache.conf
,如下所示:#Mutex file:${APACHE_LOCK_DIR} default
...这导致 Apache 使用默认机制。