【问题标题】:Laravel Forge how to establish connection between 2 databases on 2 separate serversLaravel Forge 如何在 2 个不同服务器上的 2 个数据库之间建立连接
【发布时间】:2017-03-25 14:26:31
【问题描述】:

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

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

我尝试将其添加到 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';

【问题讨论】:

    标签: laravel laravel-5 laravel-5.3 digital-ocean laravel-forge


    【解决方案1】:

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

    新答案

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

    之后需要用从digitalocean获取的私网IP更新mysql2连接的DB_HOST=

    旧答案 - 手动设置

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

    1. 在站点 2 - 编辑 /etc/mysql/my.cnf 并使用您的服务器 IP 更新 bind-address

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

    1. 在站点 2 - 添加新的防火墙规则

    转到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-with-mysql

    希望这会有所帮助!

    【讨论】:

    • 您的回答为我指明了正确的方向,并且非常有帮助。结果在 Forge 中的 Server > Network 下有一个复选框,允许您连接到同一网络中的其他服务器。我检查了一下并刷新了,现在一切看起来都很好:)。非常感谢!
    • 我昨天做了几乎同样的事情,不客气:)
    • 太有帮助了!非常感谢您与社区分享这些信息,我每天都了解更多关于 Laravel Forge 的信息,我很喜欢。
    • 谢谢,非常感谢。 Forge 本身就是一个糟糕的解决方案,也为我节省了大量时间。
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2011-09-15
    • 2019-03-09
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多