【问题标题】:Connecting SQL Server Virtual Machine to Web Role in same Azure Virtual Network将 SQL Server 虚拟机连接到同一 Azure 虚拟网络中的 Web 角色
【发布时间】:2013-09-30 19:35:43
【问题描述】:

我正在尝试在 Windows Azure 中设置一个虚拟网络并使用它来避免在我的 (CUSTOM) SQL Server 虚拟机上打开一个公共端点。但是,当我尝试通过云服务的 URL 访问我的 Web 应用程序时,我不断收到与网络相关的错误,指出 SQL Server 不会及时回复。

我在网上寻找了有关如何连接到自己的自定义创建的 VM 而不是 Windows Azure 的预配置虚拟机之一的教程,但发现几乎没有什么用处。我发现的所有建议我都试过了。

我在 Windows 7 中工作,使用安装了 Windows Azure SDK SP1 的 Visual Studio 2010。
以下是我尝试做的一些无济于事的细节。

我有:

  • 使用
      创建了虚拟网络
    • 自己的亲和组
    • 单个子网
  • 向其中添加了虚拟机
    • 确保将其与我为 VNet 创建的关联组放在同一个关联组中
  • 已安装 SQL Server
  • 按照this tutorial 配置 SQL Server
  • 添加了我的数据库,并且我已验证的登录名可以访问该数据库
  • 两者:
    1. 将现有的 Asp.NET 网站转换为 Web 应用程序并添加了 Azure 部署包事物 see here for the tutorial I followed
      • 我为此使用了 r-click->Publish to Azure/Publish,配置为使用我已经部署在带有 SQL VM 的 VNet 中的现有云服务,并确保它与 VM 位于同一子网中。
      • 还值得注意的是,此应用程序确实通过在端口 1433 上打开公共端点并使用公共 IP 地址连接到部署在虚拟网络外部(仍在 Azure 中)的类似 VM。李>
    2. 在按照this tutorial (the first one I mentioned) 配置的全新 Azure 云服务项目中使用了转换后的 Web 应用程序代码
      • 我尝试了两种发布方式:
        • r-click->Publish to Azure/Publish
        • r-click->Package 并将其上传到 Azure 门户
      • 在这两种情况下
        • VNet(和子网)中的现有云服务
        • 以及在 VNet(和子网)中创建的全新云服务,并在创建过程中上传包或在启动后立即发布到服务。
  • 仔细检查了我经历过的所有云服务和虚拟机都在 VNet 中,并且在同一个子网中。

    • My Cloud 服务通常位于内部 IP 10.4.2.5,VM 位于 10.4.2.4。我的连接字符串与the first tutorial I mentioned 相同,只有正确的身份验证和我的VM 的内部IP 指定。连接字符串如下:

      <add name="SQLServerinWAConnection"
      connectionString="Data Source=tcp:SQLVMInternalIPAddress;Initial Catalog=MyTableName;User ID=loginName;Password=thepassword;Encrypt=true;Trusted_Connection=false;TrustServerCertificate=true"
      providerName="System.Data.SqlClient" />
      
      • 我也试过指定Trusted_Connection=true

无论我如何尝试,我都无法让此应用程序连接到该 VM 上的 SQL Server 实例。我什至在端口 1433 向 VM 添加了一个公共端点,并尝试使用其公共 IP 和私有 IP,但无济于事。那是我的后备力量,所以现在我损失惨重。

一些可能有也可能没有任何影响的实现细节:

  • SQL Server 实例是命名的,而不是默认的,因此在 SQL Server Management Studio 的对象资源管理器中,它不仅仅是“SQLServerVM”,而是“SQLServerVM\SQLServerDB”。
  • 我在 VM 的防火墙上为任何 IP 范围和任何用户打开了端口 1433

我会根据要求添加任何其他详细信息(如果您不想阅读整个教程来弄清楚我做了什么)。

根本没有可用的清单来说明 Web 角色或网站需要执行哪些操作才能连接到其虚拟网络中的虚拟机?这将大大简化故障排除。

任何建议将不胜感激。我非常希望能在一天结束前完成这项工作。

【问题讨论】:

  • Windows Azure Platform Training Kit 有一个动手实验室,其中网站部署到 PaaS 云服务中,SQL Server 部署到 IaaS 云服务中。两种云服务都在同一个 VNET 中 - 尽管不是同一个子网 - 允许网站通过 VNET 而不是公共端点连接到 SQL Server。
  • 所以我从中得到的是,VNET 中的 2 个服务必须位于单独的子网中,以便在没有公共端点的情况下相互连接。那是对的吗?因为这在逻辑上没有意义。我现在正在查看链接。
  • 我不知道它们是否必须位于不同的子网中 - 但这样做可能会让您的生活更轻松。

标签: sql-server azure azure-web-roles azure-virtual-machine azure-virtual-network


【解决方案1】:

在我的例子中,由于我们的客户端使用命名数据库实例在 VM 上安装了 SQL Server,因此托管我需要连接的实例的服务没有正确设置其 TCP 端口。所以我命名 SQL Server 实例的细节确实很重要。

如果您无法弄清楚为什么您的 Web 角色(云服务)没有连接到同一虚拟网络中的虚拟机,除了检查问题中的上述所有内容外,请检查以下设置:

  1. 登录到虚拟机 (RDP)
  2. 打开 SQL Server 配置管理器
  3. 在左侧面板中展开“SQL Server 网络配置”
  4. 点击左侧面板中的“{SQL Instance name here} 的协议”
  5. 在右侧面板中右键单击“TCP/IP”,转到“属性...”
  6. 仔细检查 "Enabled" 是否设置为 "Yes"
  7. 切换到“IP 地址”标签。
  8. 此时,如果不是“ IPALL”或其他一些。
    • 请注意,所有“IP{X}”部分的“TCP 端口” 设置可能具有不同的值。

如果您没有看到此 SQL Server 实例在 1433(或您尝试配置的其他端口)上侦听:

  1. 转到 "IPALL" 并将 "TCP 端口" 更改为 1433(或您喜欢的任何端口,1433 是默认发送到的端口)。
    • 这将允许在该端口上侦听从任何地方进入此服务器的地址。
    • 请注意,可能有一种更简洁的方法可以做到这一点,但这对我们来说效果很好。

这允许我从该 VNet 中的所有云服务访问 SQL Server 实例,仅使用 VM 的内部 IP 地址,而无需为我配置的端口 (1433) 打开公共终结点。
以防万一,这里是工作连接字符串:

<add name="ApplicationServices"
    connectionString="Data Source=tcp:{VM Internal IP}\{InstanceName},{port};Initial Catalog={Table};User ID={username};Password={passwd};Encrypt=true;Trusted_Connection=false;TrustServerCertificate=true" providerName="System.Data.SqlClient"/>

确保替换:

  • {VM Internal IP} 带有您的内部 IP 地址
  • {InstanceName} 与您的 SQL Server 实例的名称一起使用,或者如果您有默认实例,则将其和前面的 \ 完全去掉。
  • {port} 应该是 1433 或您在 VM 中为该 Sql Server 实例打开的任何端口。
  • {Table} 与您要默认使用的数据库表
  • {username}{passwd} 以及您的 SQL Server 用户。请注意,我在这里使用的是 SQL Server 身份验证。

还值得注意的是,这并没有将我的服务器打开到互联网(如预期的那样),因为我仍然无法从外部世界访问它,因此它仍然以这种方式在 VNet 中保持安全。

希望这对将来的某人有所帮助。

【讨论】:

  • 我的 TCP 端口(在我命名实例的 TCP/IP 属性中)是 1533。我应该按照您的建议将其更改为 1433 吗?
  • @Rez.Net :这完全取决于你。只要您对使用的端口保持一致,即你记得设置两边的端口,你可以使用任何你想要的端口。
  • 你在哪里设置客户端的端口?
  • @Rez.Net:如果你像我一样使用 Asp.NET,那么它就在 Web.config 的连接字符串中。具体在数据源中:Asp.NET v4.5 中的Data Source=tcp:[IP address],[port]\[Instance name]。如果您需要有关连接字符串的帮助,请查看this MSDN article
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多