【问题标题】:Digital Ocean connect one droplet to the MySQL DB of another dropletDigital Ocean 将一个 Droplet 连接到另一个 Droplet 的 MySQL DB
【发布时间】:2018-07-23 13:53:45
【问题描述】:

我有 2 个液滴,都带有 LAMP 堆栈(Ubuntu 16.04)。两者都安装了 PHPMyAdmin,运行 PHP 应用程序,并拥有自动重定向到 https 的自签名 SSH 证书。

我想做的是从 Droplet 2 上的应用程序连接到 Droplet 1 上的 MySQL 数据库。我知道您可以通过在 Droplet 1 上运行 MySQL 服务器来做到这一点,但两者都需要运行完整的 PHP 应用程序在这种情况下。

这是我已经做过并尝试过的:

  • 在两个 Droplet 上启用了专用网络(请参阅 this tutorial
  • 在 Droplet 1 上,我使用 sudo ufw allow 3306/tcpsudo service ufw restart 将端口 3306 添加到防火墙
  • 两者都应用了在 DO 界面中配置的相同防火墙设置。我从源“Droplet 2”添加了“所有 TCP”、“所有端口”
  • 防火墙设置上的出站规则是来自“所有端口”和“所有 IPv4”和“所有 IPv6”的“ICMP”、“所有 TCP”和“所有 UDP”
  • 我通过 PMA 在 Droplet 1 上创建了一个 MySQL 用户,主机名为 %

我的 PHP 应用程序连接设置 (CodeIgniter 3.1.7)

$db['remotedb'] = array(
'dsn' => '',
'hostname' => 'PRIVATE IP OF DROPLET HERE', // in the format xx.xx.xx.xx so without https:// in front of it 
'port' => 3306,
'username' => 'user',
'password' => 'password',
'database' => 'database',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'dbdebug' => FALSE,
'cacheon' => FALSE,
'cachedir' => '',
'charset' => 'utf8',
'dbcollat' => 'utf8generalci',
'swappre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'savequeries' => TRUE
);

目前 Droplet 2 上的应用无法连接到 Droplet 1 上运行的数据库。我错过了什么?

几个问题:

  • 安装两个液滴时,我运行了mysql_secure_installation。如果我没记错的话,它会禁用对 mysql 数据库的远程访问,但不确定。我也不知道如何再次启用它(如果需要)。
  • 我需要在 /etc/mysql/my.cnf 文件中使用 bind-address 执行任何操作吗?
  • 通过 PMA 在 Droplet 1 上创建用户时,我是否使用了正确的设置?
  • 我还缺少任何其他设置吗?

编辑 运行netstat -nltp 给出

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               
tcp6       0      0 :::25                   :::*                    LISTEN      -               
tcp6       0      0 :::443                  :::*                    LISTEN      -               
tcp6       0      0 :::80                   :::*                    LISTEN      -     

【问题讨论】:

  • 你能在 droplet 1 上运行netstat -nltp(正在运行 DB 的那个)吗?
  • 将输出添加到原始问题

标签: mysql tcp digital-ocean


【解决方案1】:

确保您的my.cnf 文件中有正确的绑定地址。

bind-address                   = << private IP here >>

请注意,MySQL 仅支持绑定到服务器上的 0、1 或所有 IP 地址,因此如果您不想监听私有和公共 IP,那么您必须使用私有 IP 和设置您在 Droplet 上的 PHP 应用程序连接到该应用程序而不是 127.0.0.1

【讨论】:

  • 如果我这样做,Droplet 1 上的应用程序本身是否仍然可以访问数据库?
  • 我已将私有 IP 添加到 bind-address 并且它现在正在工作。应用程序本身(在 Droplet 1 上)的主机名设置为 localhost,这似乎可以正常工作。我想现在一切都好了吗?
  • 看来你明白了! (ps:如果你使用 localhost 那么应用程序将通过套接字而不是 TCP 连接到 MySQL,这就是它工作的原因)
猜你喜欢
  • 2020-10-02
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多