1

我有一个基于 app.mydomain.com(服务器 1)的应用程序和一个位于 support.mydomain.com(服务器 2)的支持票务系统。 如何在我的 laravel 应用程序中的两个数据库之间建立连接?两者都使用 Laravel Forge 和 Digital Ocean。

我在 SO 上阅读了这篇文章,看起来很棒,但我收到“连接超时错误”。我相信这与 Forge 在连接到数据库时需要 SSH 密钥文件(id_rsa.pub)有关吗? 来源在这里

我尝试将其添加到 database.php:

//Server/Site 1
'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'support',
    'username'  => 'user',
    'password'  => 'mysecretpassword',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

//Server/Site 2
'mysql2' => array(
    'driver' => 'mysql',
    'host' => '123.456.789.101',
    'port' => '3306',
    'database' => 'app',
    'username' => 'forge',
    'password' => 'mysecretpassword',
    'charset' => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
),

然后将其添加到我的模型中:

protected $connection = 'mysql2';
4

1 回答 1

9

当您使用 Forge 配置服务器时,出于安全原因,MySQL 配置会限制外部连接。只有同一服务器上的应用程序可以访问您的数据库。

新答案

由于您使用的是 forge,因此比我之前建议的要容易。如果您使用 forge 配置了两个服务器,请转到forge -> networking -> server network并选择can connect to复选框并点击更新。

伪造服务器网络配置

之后,您需要DB_HOST=使用从 digitalocean 获得的专用网络 IP 更新 mysql2 连接。

旧答案 - 手动设置

现在,为了以安全的方式允许外部连接,需要做几件事:

  1. 在 site2 -使用您的服务器 IP编辑/etc/mysql/my.cnf和更新bind-address

由于您使用的是数字海洋,如果您的服务器位于同一个数据中心,您应该能够使用您的 droplet 的专用网络 IP 地址。这是更安全的解决方案,服务器之间的任何连接都不会离开数据中心基础设施。记得重启mysql。

  1. 在 site2 - 添加新的防火墙规则

转到Forge -> Networking -> New Firewall Rule并为您的站点 1 的端口 3306 和 IP 地址添加新规则,如果可能,再次添加私有 IP。

  1. 在 site1 - 为远程连接创建 mysql 用户

使用 ssh 连接到 site1 打开 mysql 控制台并添加新用户

CREATE USER 'some-username'@'site1_ip' IDENTIFIED BY 'some_password';
GRANT ALL PRIVILEGES on your_database.* TO 'some-username'@'site1_ip';
FLUSH PRIVILEGES;

有关更多信息,请参阅本教程,它解决了与您类似的问题https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-与-mysql

希望这可以帮助!

于 2017-03-27T20:39:30.873 回答