为啥 mysql CLI 可以连接,而 WordPress 却不能?

Posted

技术标签:

【中文标题】为啥 mysql CLI 可以连接,而 WordPress 却不能?【英文标题】:Why can mysql CLI connect, but not WordPress?为什么 mysql CLI 可以连接,而 WordPress 却不能? 【发布时间】:2017-11-24 22:35:26 【问题描述】:

我有一个全新的 Wordpress (php-fpm/nginx) 服务器。在 CentOS 上运行。我还有一个 docker 容器,由 vanilla mysql-server 映像构建。

MySQL 配置

它运行在3306端口上,所有MySQL用户都在MySQL中注册,主机为172.17.0.1(例如root@172.17.0.1),这是docker的网关IP。 docker 容器是使用 ansible playbook 安装的。所有配置设置都是参数化的,并且这些参数在适当的地方使用,包括 WordPress 配置文件和在 MySQL docker 安装期间填写 root 密码等内容的环境变量。这里是我配置相关数据库的地方:

WordPress 配置:

这分为两部分,我将包括其中相关的部分。在我的 ansible playbook 中,这段代码设置了 WordPress 表和用户(成功):

- name:             Create WordPress database
  mysql_db:
    name:           ' wp_db_name '
    state:          present
    login_user:     root
    login_password: ' mysql_root_password '
    login_host:     ' docker_mysql_ip '

- name:             Create WordPress database user
  mysql_user:
    name:           ' wp_db_user '
    password:       ' wp_db_password '
    priv:           ' wp_db_name .*:ALL'
    state:          present
    login_user:     root
    host:           ' docker_gateway_ip '
    login_password: ' mysql_root_password '
    login_host:     ' docker_mysql_ip '

相关的 wp-config.php:

define('DB_NAME', 'wordpress');
define('DB_USER', ' wp_db_user ');
define('DB_PASSWORD', ' wp_db_password ');
define('DB_HOST', ' docker_mysql_ip ');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

当我导航到 wp-admin 时,具体问题是“Warning: mysql_connect(): Permission denied in /srv/wordpress/wp-includes/wp-db.php on line 1473”,标题为“建立数据库连接时出错”,状态码 500。

令人困惑的部分

当我检查 wp-config.php 文件时,用户名、密码和数据库名称都与它们应有的完全一样。当我将主机、用户和密码从wp-config.php 复制/粘贴到命令行上的相应位置(例如mysql -u wordpress -p -h 172.17.0.2)时,我可以连接并查看 Wordpress 数据库。

总结一下

使用命令行时 MySQL 可以正常连接,但 Wordpress 不能。我对 Wordpress 或 PHP 也不是很熟悉,因此对于与问题相关的日志可以位于何处的任何想法将不胜感激。

【问题讨论】:

这不应该指向本地主机:define('DB_HOST', '127.0.0.1: mysql_port '); 对不起。我在 3 个会话中写了这个,忘记更新我对 wp-config.php 的更改。已编辑。 CentOS 主机是否运行 SELinux?默认情况下,可能不允许与 MySQL 建立 TCP 连接。检查getenforce 另见***.com/questions/8139451/… 【参考方案1】:

我刚刚在使用 MariaDB 的 Debian 9.1 上遇到了这个问题,但这在 Oracle MySQL 中应该是一样的。我可以从命令行轻松登录,但 PHP 无法访问数据库。

我花了几分钟才弄明白,但我记得当我以前在旧服务器上使用 Arch Linux 时(顺便说一句,这是一个愚蠢的想法),需要命令 mysql_secure_installation 来让它接受连接.

试试看,这对我有用。

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

【讨论】:

以上是关于为啥 mysql CLI 可以连接,而 WordPress 却不能?的主要内容,如果未能解决你的问题,请参考以下文章

为啥hive与mysql整合

为啥 angular-cli 生成 ngOnInit 而无需输入函数结果?

MYSQL为啥用IP地址无法连接

MYSQL为啥用IP地址无法连接

MYSQL为啥用IP地址无法连接

为啥我的mysql用本机的mysql front可以连接,用旁边电脑的就不可以