将 SQL Server 虚拟机连接到同一 Azure 虚拟网络中的 Web 角色



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

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

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

我有:

  • 创建了
    虚拟网络
    • 自己的亲和力组
    • 单个子网
  • 已将虚拟机添加到其中
    • 确保将其放在与我为 VNet 创建的地缘组相同的地缘组中
  • 已安装的 SQL Server
  • 根据本教程配置的 SQL Server
  • 添加了我的数据库和我已验证的登录名可以访问数据库
  • 双:
    1. 将现有 Asp.NET 网站转换为 Web 应用并添加了 Azure 部署包,请参阅此处了解我遵循的教程
      • 我为此使用了r-click->Publish to Azure/Publish,配置为使用已在 VNet 中部署的现有云服务和 SQL VM,并确保它与 VM 位于同一子网中。
      • 还值得注意的是,此应用程序确实连接到部署在虚拟网络外部(仍在 Azure 中(的类似 VM,方法是在端口 1433 上打开公共终结点并使用公共 IP 地址连接到该终结点。
    2. 在按照本教程配置的全新 Azure 云服务项目中使用了转换后的 Web 应用代码(我提到的第一个(
      • 我尝试通过以下方式发布:
        • r-click->Publish to Azure/Publish
        • r-click->Package并将其上传到 Azure 门户
      • 在这两种情况下,都
        • VNet(和子网(中的现有云服务
        • 以及在 VNet(和子网(中创建的全新云服务,并在创建期间上传包,或在启动后立即发布到服务。
  • 仔细检查我经历的所有云服务和虚拟机是否都在 VNet 中,并且位于同一子网中。

    • 我的云服务通常为内部 IP 10.4.2.5,VM 为 10.4.2.4。我的连接字符串与我提到的第一个教程相同,只是使用正确的身份验证和指定的 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 角色或网站需要执行哪些操作才能连接到其虚拟网络中的虚拟机?这将大大简化故障排除。

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

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

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

  1. 登录到虚拟机 (RDP(
  2. 打开 SQL Server 配置管理器
  3. 展开左侧面板中的"SQL Server 网络配置"。
  4. 单击左侧面板中的"{SQL 实例名称此处}的协议"。
  5. 右键单击右侧面板中的"TCP/IP">,转到"属性...">
  6. 仔细检查"已启用">是否设置为"是"。
  7. 切换到"IP 地址">选项卡。
  8. 此时,您应该看到至少域 IP 的">TCP 端口"应该是 1433(在我的例子中是"IP2"部分中的 10.4.2.4(,如果不是"IPALL"或其他一些。
    • 请注意,所有"IP{X}"部分上的"TCP 端口">设置可能具有不同的值。

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

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

这使我能够仅使用 VM 的内部 IP 地址从该 VNet 中的所有云服务访问 SQL Server 实例,而无需为我配置的端口 (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"/>

确保替换:

  • 使用您的内部 IP 地址{VM Internal IP}
  • {InstanceName} SQL Server 实例的名称,或者如果您有默认实例,则完全保留它和前面的
  • {port}应为 1433 或你在 VM 中为该 Sql Server 实例设置打开的任何端口。
  • {Table}要使用的数据库表
  • {username}{passwd} SQL Server 用户的那些。请注意,我在这里使用的是 SQL Server 身份验证。

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

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

最新更新