codeigniter连接amazon rds本质是将其作为远程mysql/postgresql服务器使用,需严格配置endpoint地址、显式端口、安全组放行、正确dbdriver及账号权限,并通过telnet验证网络连通性。

CodeIgniter 项目连接 Amazon RDS 数据库,本质就是把 RDS 实例当作一个远程 MySQL(或 PostgreSQL 等)服务器来用,配置上和本地数据库没区别,但有几处关键参数必须对得上,否则连不上、报错、超时都是常见现象。
确认 RDS 实例的连接地址和端口
RDS 控制台里显示的「Endpoint」才是真正的主机名,不是 localhost 或内网 IP。它形如 myapp-db.xxxxxxx.us-east-1.rds.amazonaws.com,端口默认是 3306(MySQL)、5432(PostgreSQL),不能漏填或写错。
- 在
application/config/database.php中,hostname必须设为这个 Endpoint 字符串 -
port字段要显式写出(CI 默认不读取端口,除非你用dsn或手动加到hostname后面) - 如果用了非默认端口(比如 RDS Proxy 或自定义安全组规则改了端口),务必同步更新
- 别直接复制控制台里带
:3306的完整字符串进hostname——CI 的mysqli驱动不识别这种写法,会解析失败
检查安全组与网络连通性
即使配置全对,90% 的“Connection refused”或“timeout”错误都卡在这一步:EC2 或本地开发机根本访问不到 RDS 实例。
- RDS 实例的安全组入站规则必须放行对应端口(如
MYSQL/Aurora类型),源(Source)应设为 EC2 实例所在的安全组 ID,而不是0.0.0.0/0(生产环境严禁) - 确保 EC2 和 RDS 在同一个 VPC;跨 VPC 需 VPC Peering 或 Transit Gateway,且路由表、NACL 都要配通
- 本地调试时,RDS 不能设为“仅私有访问”,需临时放开安全组允许你的公网 IP(或走 SSH tunnel / bastion 主机)
- 用
telnet myapp-db.xxxxxxx.us-east-1.rds.amazonaws.com 3306在 EC2 上实测是否能通——不通就别调代码,先查网络层
适配 CI 的 database.php 配置项
CI 对 RDS 没特殊支持,但几个字段容易配错导致静默失败:
-
dbdriver要严格匹配 RDS 引擎:MySQL 用mysqli(不是mysql,已废弃),PostgreSQL 用postgre,不要拼错 -
username和password是你在 RDS 创建实例时设置的主用户凭证,不是 AWS IAM 用户 -
database是 RDS 实例初始化时指定的数据库名(如myapp_prod),不是 RDS 实例名 -
pconnect建议保持FALSE:RDS 连接池由服务端管理,PHP 持久连接反而可能触发连接数限制 -
db_debug在开发环境设为TRUE,否则连接失败时只报空错误,看不到真实原因
验证连接与权限是否生效
光改完配置不等于能用,RDS 的账号权限和字符集也得对得上。
- RDS 默认用户只有对自身创建的数据库有全部权限,如果你在
database.php里填的是information_schema或其他系统库,必然拒绝访问 - 首次连接后执行
SELECT VERSION(), @@character_set_database;,确认返回的是 RDS 实例版本,且字符集是utf8mb4(推荐)而非过时的utf8 - 如果模型中执行
$this->db->query()报 “Access denied for user”,大概率是用户名密码错,或该用户没被授权到目标数据库 - CI 的
$this->db->initialize()可以强制重连,适合在长任务中途检测连接断开后恢复
真正卡住人的往往不是代码,而是 RDS 安全组规则没开、Endpoint 写成内网地址、或者误以为 RDS 用户等同于 IAM 用户——这些点一旦忽略,花半天调配置都不如花两分钟 telnet 一下来得快。











