我正在尝试使用 CodeIgniter PHP 框架版本 3 从 Heroku 连接到 Amazon RDS MySQL。我按照 Heroku 文档中列出的有关 Amazon RDS 的所有步骤操作,但无法弄清楚我做错了什么?
以下是我的 CodeIgniter 数据库设置:
$db['rds'] = array(
'dsn' => '',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE,
'port' => 3306,
'encrypt' => [
'ssl_ca' => APPPATH."../.config/rds-combined-ca-bundle.pem",
'ssl_verify' => TRUE
]
);
$db['rds']['hostname'] = getenv('RDS_DATABASE_HOSTNAME');
$db['rds']['username'] = getenv('RDS_DATABASE_USERNAME');
$db['rds']['password'] = getenv('RDS_DATABASE_PASSWORD');
$db['rds']['database'] = getenv('RDS_DATABASE_DBNAME');
但是我不断收到此错误:
mysqli::real_connect(): (HY000/2002): Connection timed out /app/vendor/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php 201
这是我检查的内容:
- 我已签入 RDS 安全组和 CIDR/IP - 出站 0.0.0.0/0 在那里
- 我添加了一个单独的MySQL用户,具有授予权限选择,更新,插入,删除和需要SSL
- 将组合的证书文件添加到项目根目录
.config/rds-combined-ca-bundle.pem
并部署在 Heroku 上 - 在本地计算机上,相同的代码工作正常
- 尝试重启 RDS 实例
如果某些设置错误,我还应该在哪里查看?
您的 CodeIgniter 代码需要连接到您的数据库,而不是相反。RDS 安全组中的出站规则无济于事;您需要一个入站规则(粗体添加(:
您必须授予 Heroku dynos 对您的 RDS 实例的访问权限。建议的方法是将 RDS 实例配置为仅接受来自授权用户的 SSL 加密连接,并将实例的安全组配置为允许来自所有 IP 的入口,例如
0.0.0.0/0
。
由于这有效地为整个Internet打开了防火墙上的漏洞,因此遵循其余说明并仅接受来自授权用户的加密连接非常重要。