apache DBD 未连接到 MySQL

apache DBD 未连接到 MySQL

我使用 mod_dbd 和 mod_authn_dbd 来保护对我网站的访问。但它似乎不稳定,重新启动 apache 并发出一些请求几分钟后,身份验证不再起作用,apache 错误日志中出现以下消息:

[authn_dbd:error] [pid 21308] [client xxxxx] AH01656: Query execution error looking up 'mylogin' in database []

编辑 apache 日志以获得更多详细信息:

[authz_core:debug] [pid 9307] mod_authz_core.c(809): [client x.x.x.x] AH01626: authorization result of Require dbd-group mygroup: denied (no authenticated user yet)
[authn_dbd:error] [pid 9307] [client x.x.x.x] AH01656: Query execution error looking up 'mylogin' in database []
[core:trace3] [pid 9307] request.c(119): [client x.x.x.x] auth phase 'check user' gave status 500: /private

在 mysql 错误日志中:

[Note] Aborted connection 5000 to db: 'httpauthdb' user: 'httpauth' host: 'xxx.xxx.xxx.xxx' (Got an error reading communication packets)

我必须重新启动 apache 才能使其工作,但很长时间都无法正常工作。我发现将 DBDPersist(在 dbd conf 中)设置为 Off 可以解决我的问题,但根据 apache 文档,不建议这样做。

编辑:即使发生错误,使用 mysql 客户端查询同一个数据库仍然有效。

这里是 vhost 中的一个配置:

<Location /private>
  AuthName 'My private space'
  AuthType Basic
  AuthBasicProvider dbd
  AuthDBDUserPWQuery "SELECT password FROM clients WHERE username = %s"
  AuthzDBDQuery "SELECT groups FROM clients WHERE username = %s"
  Require dbd-group mygroup
</Location>

这是我的 dbd_mysql.conf 由 apache 加载

DBDriver mysql
DBDParams "sock=/var/run/mysqld/mysqld.sock,user=httpauth,dbname=httpauthdb,pass=xxxxxxxx"
DBDMin  4
DBDKeep 2
DBDMax  10
DBDExptime 300
DBDPersist On

apachectl -V的结果:

Server version: Apache/2.4.25 (Debian)
Server built:   2017-01-25T22:59:26
Server's Module Magic Number: 20120211:67
Server loaded:  APR 1.5.1, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

和 mysql 版本:

mysql  Ver 14.14 Distrib 5.7.17-13, for debian-linux-gnu (x86_64) using  6.3

对于问题出在哪里您有什么想法吗?

答案1

这是一个老问题,但我想说的是设置

DBDPersist 关闭

为我解决了这个问题。

答案2

对我们来说,这个问题似乎是因为 Apache 没有正确意识到持久的 MySQL 连接因长时间等待而超时而发生的。它应该只需打开一个新的连接,但我猜它不行。

比简单地禁用 DBDPersist 更好的解决方法似乎是将 DBDExptime 减少到低于 MySQL 等待超时的值。

相关内容