我有一个Heroku应用程序,托管我的Laravel应用程序。我最初是从MySQL开始开发的,所以我想继续使用Amazon的RDS服务进行开发。我在那里创建实例,并设法通过MySQL客户端,控制台等成功连接。
问题是Laravel应用程序经过无数次拼命尝试修复数据库后无法连接数据库。我发现有些文章建议必须使用DATABASE_URL
环境变量,因此我通过Heroku应用程序设置添加了它。看起来像这样:
mysql://myusername:mypass@myhostnamefromamazon/mydb?sslca=/app/storage/certs/amazon-rds-ca-cert.pem
I found this solution on Heroku's website.我已经将amazon-rds-ca-cert.pem
文件放置在Laravel的存储文件夹中,如下所示:/app/storage/certs/amazon-rds-ca-cert.pem
这并不能解决我的问题,因此我一直寻找并找到Stackoverflow question,它在流明上存在此问题。我根据答案调整了config/database.php
,但对我来说仍然无效!
<?php
$credentials = get_db_credentials();
$config = [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', $credentials->host),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', $credentials->database),
'username' => env('DB_USERNAME', $credentials->username),
'password' => env('DB_PASSWORD', $credentials->password),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
],
];
if (env('APP_ENV') == 'production') {
$config['connections']['mysql']['options'] = [PDO::MYSQL_ATTR_SSL_CA => '../storage/certs/amazon-rds-ca-cert.pem'];
}
return $config;
get_db_credentials()
函数只是解析DATABASE_URL
环境变量。
我得到的确切例外是:
[2018-10-25 19:32:16] production.ERROR: SQLSTATE[HY000] [2002] Connection timed out {"exception":"[object] (Doctrine\\DBAL\\Driver\\PDOException(code: 2002): SQLSTATE[HY000] [2002] Connection timed out at /tmp/build_05920c42a6de0a378402b798320d3f04/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:50
我对此一无所知,不确定如何进行。
答案 0 :(得分:1)
您的AWS安全组必须允许Heroku的IP地址范围内的流量。
https://devcenter.heroku.com/articles/amazon-rds
您必须授予Heroku dynos访问您的RDS实例的权限。推荐的方法是将RDS实例配置为仅接受来自授权用户的SSL加密连接,并为您的实例配置安全组以允许从所有IP(例如
0.0.0.0/0
)进入。