我正在使用以下内容从localhost连接到mysql数据库
<?php
function testdb_connect ()
{
$dbh = new PDO("mysql:host=localhost;dbname=test", "testuser", "testpass");
return ($dbh);
}
?>
但是,当我尝试从其他服务器连接到此数据库(数据库在ec2-12-34-56-78.compute-1.amazonaws.com
上运行)时,使用以下代码
$dbh = new PDO("mysql:host=ec2-12-34-56-78.compute-1.amazonaws.com;dbname=test", "testuser", "testpass");
我无法连接。
是否可以使用php pdo连接到ec2实例上的远程数据库?
我如何传递身份验证参数(例如私钥)
答案 0 :(得分:3)
您应该考虑将RDS用于您的数据库,而不是在EC2上实现,除非您有一个非常独特的数据库,需要高度自定义(即群集配置等)。在EBS支持的卷上运行(为了能够持久保存物理数据文件,您需要这样做)将使您受到磁盘I / O的缓慢影响。如果您没有在EBS支持的EC2上运行,那么您的数据是暂时的,不能被视为可靠的物理存储。如果你的设计没问题(你只需要数据库中的瞬态信息),那么你可能会更好地服务,只需将你的信息放入Elasticache或某种形式的内存缓存中。
RDS使用MySQL(嗯,您也可以选择使用Oracle)。您可以像访问自己的MySQL服务器一样访问它(相同的PHP抽象,相同的SQL,几乎所有内容(您没有root权限,而是一种超级用户访问形式).RDS还为您提供方便实现(即按钮)配置多个az(高可用性,同步更新的备用),复制从站,数据库实例重新调整大小和数据快照。
在任何一种情况下(对于RDS或EC2),您都需要确保您的EC2或RDS安全组允许从托管您的应用程序的EC2实例(或其他服务器)进行访问。如果只是EC2,您可以将服务器放在同一个安全组中,并在该组上提供端口3306访问,或者更好的方法是创建两个安全组(一个用于app,一个用于db)。在db安全组中,将端口3306(或您正在使用的任何端口)提供给应用服务器所属的安全组。
对于RDS,您需要针对应用服务器的EC2安全组和针对RDS实例的数据库安全组。您需要在RDS安全配置中提供对应用服务器安全组的访问权限。
答案 1 :(得分:2)
我不知道这可能如何与AWS一起使用,但我要做的第一件事是在机器之间运行SSH隧道。
然后PHP / PDO基本上只是认为你正在连接到本地数据库。根据我的经验,它还可以更快地建立连接,因为它不需要进行DNS查找来查找远程服务器...当您认为每个PHP页面加载可能必须连接到远程数据库时,这非常重要。
当应用程序需要管理存储在远程数据库中的数据并且它像冠军一样工作时,我在Intranet上使用它。
我发现SSH隧道非常稳定,但是我使用一个名为autossh的程序尝试在SSH隧道出现故障时重新连接它们。
为了完整性,这里是我用来启动autossh的命令,因此它建立并维护一个特定的SSH隧道。这里添加了因为我发现autossh文档很难弄清楚我想要的选项。
autossh -M 0 -f -L3307:127.0.0.1:3306 -p 22 -N -f username@xxx.xxx.xxx.xxx
这会将Web服务器上的端口3307转发到远程数据库服务器上的3306。所以在PHP中你可以连接到3307.你可以选择3306,如果你愿意的话,我选择了本地端口3307,万一你有一个本地MySQL和一个遥控器。 -p开关是SSH在远程计算机上运行的端口。
您可以将此命令添加到/etc/rc.local
(至少在CentOS上)以在服务器启动时建立SSH隧道。
希望这有帮助!