【问题标题】:Is it possible to connect to a remote database on an ec2 instance with php pdo?是否可以使用 php pdo 连接到 ec2 实例上的远程数据库?
【发布时间】:2012-09-16 04:14:13
【问题描述】:

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

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

【问题讨论】:

  • 完全有可能,但您需要按顺序设置安全组。
  • 能否请您讨论一下您的安全组是如何配置的。这很可能是问题。您在尝试连接时遇到了什么样的错误?
  • 这并不取决于 PHP。这完全是 EC2 配置的问题。如果您可以让 EC2 向世界开放端口,那么您可以连接到它。或者你可以只打开一个到 db 端口的 SSH 隧道,然后连接到 SSH 隧道。或者在您的两个位置之间设置某种 VPN。
  • 我有 1 个安全组,其中端口 22 和 80 与数据库服务器和另一个要调用数据库的服务器一起打开。如何配置安全组以允许其他服务器访问数据库服务器? (我会在我回家后尝试连接时发布错误)

标签: php mysql pdo amazon-ec2 amazon-web-services


【解决方案1】:

您可能应该考虑将 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 安全配置中提供对应用服务器安全组的访问权限。

【讨论】:

  • 感谢您的建议 - 我会调查的。如果我想坚持使用 mysql,你能告诉我如何配置我的安全组吗?
  • 谢谢 Mike - 我回家后会检查一下。
  • Mike 你能评论一下 benjobradley 建议创建一条到数据库服务器的隧道吗?这种方法的优缺点是什么?
  • @user784637 我在使用亚马逊时没有做过这样的配置。对于 RDS,您可以在此处阅读有关 SSL 加密连接的更多信息:aws.amazon.com/rds/faqs/#53 对于 EC2,显然您需要自己实施(证书、SSH、服务器、安全组配置等)。我认为一般的想法是,通过 SSL 的数据库连接会影响连接性能,因此仅应用于传输的数据需要此类额外安全措施(超出安全组配置)的特定情况。
【解决方案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 和远程 MySQL。 -p 开关是 SSH 在远程机器上运行的端口。

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

希望这会有所帮助!

【讨论】:

  • 谢谢你这个讨厌的、令人讨厌的畜生
  • 你的图标是 The Kramer 的肖像,在这一集中引起了艺术鉴赏家的反应 他是一个令人讨厌、令人反感的野蛮人。. .
猜你喜欢
  • 2012-09-06
  • 2021-02-25
  • 2020-08-26
  • 2021-04-11
  • 2023-03-20
  • 2020-10-16
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多