2

我正在使用以下内容从本地主机连接到 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 实例上的远程数据库?

我将如何传递身份验证参数(例如私钥)

4

2 回答 2

3

您可能应该考虑为您的数据库使用 RDS,而不是在 EC2 上实施,除非您有一个非常独特的数据库,需要高度自定义(即集群配置等)。在 EBS 支持的卷上运行(您需要这样做才能持久保存物理数据文件),这将使您遇到缓慢的磁盘 I/O。如果您没有在 EBS 支持的 EC2 上运行,那么您的数据是瞬态的,不能被视为在可靠的物理存储上。如果这适合您的设计(您只需要数据库中的临时信息),那么您可能会得到更好的服务,但只需将您的信息放入 Elasticache 或某种形式的内存缓存中。

RDS 使用 MySQL(当然,您也可以选择使用 Oracle)。您可以完全像访问自己的 MySQL 服务器一样访问它(相同的 PHP 抽象、相同的 SQL、几乎所有内容(您没有 root 访问权限,而是一种超级用户访问权限)。RDS 还为您提供了易于为多可用区(高可用性、同步更新的备用)、复制从属、数据库实例重新调整大小和数据快照实现(即按钮)配置。

无论哪种情况(对于 RDS 或 EC2),您都需要确保您的 EC2 或 RDS 安全组允许从托管您的应用程序的 EC2 实例(或其他服务器)进行访问。如果只有 EC2,您可以将服务器放在同一个安全组中,并在该组上提供端口 3306 访问权限,或者更好的是创建两个安全组(一个用于应用程序,一个用于 db)。在 db 安全组中,将端口 3306(或您正在使用的任何端口)提供给应用服务器所属的安全组。

对于 RDS,您需要应用服务器的 EC2 安全组和 RDS 实例的数据库安全组)。您需要在 RDS 安全配置中提供对应用服务器安全组的访问权限。

于 2012-09-24T17:01:29.527 回答
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 转发到远程 DB 服务器上的 3306。因此,在 PHP 中,您将连接到 3307。如果您愿意,可以选择 3306,我选择本地端口 3307 以防万一您有本地 MySQL 和远程 MySQL。-p 开关是远程机器上运行 SSH 的端口。

您可以将此命令添加到/etc/rc.local(至少在 CentOS 上)以在服务器启动时建立 SSH 隧道。

希望这可以帮助!

于 2012-09-24T17:33:39.580 回答