繁体   English   中英

使用 Amazon RDS MySQL 数据库托管在 Heroku 上的 Laravel 应用程序导致连接超时

[英]Laravel app hosted on Heroku with a Amazon RDS MySQL Database results in a connection time out

我有一个 Heroku 应用程序,用于托管我的 Laravel 应用程序。 我最初使用 MySQL 开始开发,所以我想继续使用 Amazon 的 RDS 服务进行开发。 我在那里创建了实例并设法通过我的 MySQL 客户端、控制台等成功连接。

问题是 Laravel 应用程序在我无数次绝望地尝试修复它之后无法连接数据库。 我发现一些文章建议使用DATABASE_URL环境变量是强制性的,所以我通过 Heroku 应用程序设置添加了它。 它看起来像这样:

mysql://myusername:mypass@myhostnamefromamazon/mydb?sslca=/app/storage/certs/amazon-rds-ca-cert.pem

我在 Heroku 的网站上找到了这个解决方案。 我已将amazon-rds-ca-cert.pem文件放在我的 Laravel 的存储文件夹中,如下所示: /app/storage/certs/amazon-rds-ca-cert.pem

这并没有解决我的问题,所以我一直在寻找并发现一个Stackoverflow 问题,它在 Lumen 上有这个问题。 我根据答案调整了我的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

我对此完全迷失了,不确定如何继续。

您的 AWS 安全组必须允许来自 Heroku 的 IP 地址范围的流量。

https://devcenter.heroku.com/articles/amazon-rds

您必须授予 Heroku dynos 访问您的 RDS 实例的权限。 推荐的方法是将 RDS 实例配置为仅接受来自授权用户的 SSL 加密连接,并为您的实例配置安全组以允许来自所有 IP 的入口,例如0.0.0.0/0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM