当 Perl CGI 脚本从控制台运行时,为什么它可能无法连接到 MySQL?

当 Perl CGI 脚本从控制台运行时,为什么它可能无法连接到 MySQL?

我正在迁移到新的服务器硬件,这也意味着学习新的 Linux 发行版 (Debian buster) 的特性。

我有一个 Perl CGI 脚本,当从控制台运行时,它会运行,但无法连接到 MySQL:

AH01215: DBI connect('my_db','my_db_user',...) 失败:无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器

鉴于它在相同的硬件上运行,因此它将是相同的 Perl 安装等。我不知道为什么它不起作用?我知道在 Centos 上,SELinux 可能会妨碍,但我不相信 Debian 默认有这个功能,但是我需要做类似的事情来允许子进程建立连接吗?

mysqladmin 建议这是正确的地方(即我没有点击这个问题):

# mysqladmin 版本 -p
输入密码:
mysqladmin Ver 8.0.17 适用于 i686 上的 Linux(源代码发行版)
版权所有 (c) 2000、2019,Oracle 和/或其附属公司。版权所有。

Oracle 是 Oracle Corporation 和/或其公司的注册商标
附属机构。其他名称可能是其各自的商标
拥有者。

服务器版本8.0.17
协议版本10
通过 UNIX 套接字连接本地主机
UNIX 套接字 /tmp/mysql.sock
正常运行时间:3 天 26 分 34 秒

线程:2 问题:74254 慢速查询:0 打开:1042 刷新表:3 打开表:962 每秒查询平均值:0.284

并且套接字显然存在(因为从控制台执行有效)

$ ls -lF /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 0 九月 6 日 22:33 /tmp/mysql.sock=

答案1

Debian 9 和 10 上的 Apache2 从 systemd 启动。它有

PrivateTmp=true

在其定义中。因此从服务器启动的进程无法访问常规 /tmp 和 /var/tmp 目录。相反,他们有自己的目录。

您可以将套接字移出 /tmp 或启动 apache2

PrivateTmp=false

相关内容