我有几个想要访问的远程数据库,但它们位于只能通过 SSH 使用密钥访问的服务器上。
在 Sequel Pro 中,我连接到这个远程数据库,如下所示:
我将如何配置我的 Laravel 应用程序以连接到这样的数据库?
'mysql_EC2' => array(
'driver' => 'mysql',
'host' => '54.111.222.333',
'database' => 'remote_db',
'username' => 'ubuntu',
'password' => 'xxxxxxxxxxxxxxxxxxxx',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
这是一个可行的解决方案,可以通过 SSH 使用密钥来使用 EC2 实例上托管的数据库。
首先,在数据库配置中设置相应的连接:
'mysql_EC2' => array(
'driver' => 'mysql',
'host' => '127.0.0.1:13306',
'database' => 'EC2_website',
'username' => 'root',
'password' => 'xxxxxxxxxxxxxxxx',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
二、建立隧道:
ssh -i ~/dev/awskey.pem -N -L 13306:127.0.0.1:3306 [email protected]
(我们将SSH密钥传入i参数并建立SSH连接,绑定到端口13306)
第三,像平常在 Laravel 应用程序中一样使用数据库:
$users = DB::connection('mysql_EC2')
->table('users')
->get();
var_dump($users);
stechstudio/laravel-ssh-tunnel
composer require stechstudio/laravel-ssh-tunnel
注册
TunnelerServiceProvider::class
并在您的 .env
中设置配置。
如果 ssh 服务器只是隧道并且数据库不位于那里。你可以用这个。
ssh -i ~/path/your-key.pem -N -L 13306:your-db-hostname.com:3306 [email protected]
并将 Laravel .env 或数据库配置文件中的数据库主机名设置为
127.0.0.1
端口 13306
如果您使用带有私钥授权的 Laravel Sail/Docker 通过 SSH 连接到 MySQL 数据库,这里是解决方案。
第一步:
运行以下命令:
ssh -i "YOUR_PUBLIC_KEY_PATH.pem" -N -L 13306:YOUR_DATABASE_HOST:YOUR_DATABASE_PORT SSH_USER@SERVER_ADDRESS
-N
告诉 SSH 不要执行远程命令。
-L
将本地端口 13306 转发到 mysql 端口
-i
指定您的私钥路径。
一旦你按下命令,如果 命令运行成功。
第二步
更新 docker-compose.yml 文件中的
laravel.test
服务以允许另一个端口 13306
ports:
- "13306:13306"
重建容器
第三步:
更新您的
.env
文件中的以下条目:
DB_HOST=host.docker.internal
DB_PORT=13306
DB_USERNAME="keep the same as your db username"
DB_PASSWORD="keep the same as your db password"
此设置将指示 Laravel 连接到转发的本地端口 13306,从而允许通过 SSH 访问远程数据库。