Laravel Forge 如何在 2 个独立服务器上的 2 个数据库之间建立连接
Laravel Forge how to establish connection between 2 databases on 2 separate servers
我有一个基于 app.mydomain.com(服务器 1)构建的应用程序和一个位于 support.mydomain.com(服务器 2)的支持票务系统。 如何在我的 laravel 应用程序中建立两个数据库之间的连接?两者都在使用 Laravel Forge 和 Digital Ocean。
我读了 which looked great but I am getting a "connection timed out error". I believe it has to do with Forge needing the SSH key file (id_rsa.pub) when connecting to a database? 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';
当您使用 Forge 配置服务器时,MySQL 出于安全原因,配置会限制外部连接。只有同一台服务器上的应用程序才能访问您的数据库。
新答案
由于您使用的是 Forge,因此比我之前建议的更容易。如果您为两台服务器都配置了 forge,请转到 forge -> networking -> server network
和 select can connect to
复选框并点击更新。
之后你需要更新 DB_HOST=
of mysql2 与从 digitalocean 获得的私有网络 IP 连接。
旧答案 - 手动设置
现在,为了允许以安全的方式进行外部连接,需要做几件事:
- 在站点 2 - 编辑
/etc/mysql/my.cnf
并使用您的服务器 IP bind-address
更新
由于您使用的是数字海洋,如果您的服务器位于同一个数据中心,您应该可以使用您的 Droplet 的私有网络 IP 地址。这是更安全的解决方案,服务器之间的任何连接都不会离开数据中心基础设施。记得重启mysql.
- 在站点 2 - 添加新的防火墙规则
转到 Forge -> Networking -> New Firewall Rule
并为您的站点 1 的端口 3306 和 IP 地址添加新规则,如果可能,再次添加一个私有 IP。
- 在站点 1 - 为远程连接创建 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
希望对您有所帮助!
我有一个基于 app.mydomain.com(服务器 1)构建的应用程序和一个位于 support.mydomain.com(服务器 2)的支持票务系统。 如何在我的 laravel 应用程序中建立两个数据库之间的连接?两者都在使用 Laravel Forge 和 Digital Ocean。
我读了
我尝试将此添加到 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';
当您使用 Forge 配置服务器时,MySQL 出于安全原因,配置会限制外部连接。只有同一台服务器上的应用程序才能访问您的数据库。
新答案
由于您使用的是 Forge,因此比我之前建议的更容易。如果您为两台服务器都配置了 forge,请转到 forge -> networking -> server network
和 select can connect to
复选框并点击更新。
之后你需要更新 DB_HOST=
of mysql2 与从 digitalocean 获得的私有网络 IP 连接。
旧答案 - 手动设置
现在,为了允许以安全的方式进行外部连接,需要做几件事:
- 在站点 2 - 编辑
/etc/mysql/my.cnf
并使用您的服务器 IPbind-address
更新
由于您使用的是数字海洋,如果您的服务器位于同一个数据中心,您应该可以使用您的 Droplet 的私有网络 IP 地址。这是更安全的解决方案,服务器之间的任何连接都不会离开数据中心基础设施。记得重启mysql.
- 在站点 2 - 添加新的防火墙规则
转到 Forge -> Networking -> New Firewall Rule
并为您的站点 1 的端口 3306 和 IP 地址添加新规则,如果可能,再次添加一个私有 IP。
- 在站点 1 - 为远程连接创建 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
希望对您有所帮助!