我使用 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 等待超时的值。