在Azure上为node.js辅助角色配置SSL端点

时间:2013-06-14 15:48:37

标签: node.js azure https azure-worker-roles

我已经设置了一个node.js应用程序,用于在Azure云服务上运行辅助角色(而不是Web角色)。使用在HTTP上运行的标准应用程序,一切正常。

现在我正在尝试通过HTTPS在SSL上运行它,并且已成功按照http://www.windowsazure.com/en-us/develop/nodejs/common-tasks/enable-ssl-worker-role/上的说明操作,但它没有产生正确的结果!

现在,当通过HTTP或HTTPS访问URL时,连接超时并且不返回任何内容。

我可能会遗漏任何内容或上面链接的指南中没有任何步骤吗?

我在指南中注意到的一件事是线条......

<InputEndpoint name="HttpIn" protocol="tcp" port="443" />

......实际上应该 Http s In ?虽然改变这似乎并没有产生很大的差异。


更新:这是我的一些配置文件

ServiceConfiguration.cloud.cscfg

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" serviceName="*removed*" osFamily="2" osVersion="*" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="WorkerRole1">
    <ConfigurationSettings />
    <Instances count="1" />
    <Certificates>
      <Certificate name="certificateName" thumbprint="*removed*" thumbprintAlgorithm="sha1" />
    </Certificates>
  </Role>
</ServiceConfiguration>

ServiceDefinition.csdef中

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="*removed*" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1" vmsize="ExtraSmall">
    <Startup>
      <Task commandLine="setup_worker.cmd &gt; log.txt" executionContext="elevated">
        <Environment>
          <Variable name="EMULATED">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
          <Variable name="RUNTIMEID" value="node" />
          <Variable name="RUNTIMEURL" value="http://az413943.vo.msecnd.net/node/0.8.4.exe" />
        </Environment>
      </Task>
      <Task commandLine="node.cmd .\startup.js" executionContext="elevated" />
    </Startup>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
      <InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="certificateName" />
    </Endpoints>
    <Certificates>
      <Certificate name="certificateName" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    <Runtime>
      <Environment>
        <Variable name="PORT">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='HttpIn']/@port" />
        </Variable>
        <Variable name="EMULATED">
          <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
        </Variable>
      </Environment>
      <EntryPoint>
        <ProgramEntryPoint commandLine="node.cmd .\server.js" setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>
  </WorkerRole>
</ServiceDefinition>

我还尝试了各种变体(额外的标签和属性较少),似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

您提供的protocol值为HttpInHttpsIn。对于ASP.NET Web角色,您应使用 only 这些值!当您在Worker Roles上运行第三方Web服务器时,您应使用tcp作为protocol属性的值!改变这是使事情不起作用的最简单方法!您可以将它们切换回tcp,从Https端点删除certificate属性并重试吗?

此外,默认示例app server.js仅侦听一个端口。哪个是由为启动任务定义的环境值PORT传递的。如果您想要HTTPS流量,那么您将引用HttpsIn端点。不幸的是,我不知道node.js是否可以通过这种简单的设置处理http和https流量。

<强>更新

请使用以下.csconfig文件(将您在文件夹中看到的所有.csconfig个文件的内容替换为我提供的内容):

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="*removed*" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1" vmsize="ExtraSmall">
    <Startup>
      <Task commandLine="setup_worker.cmd &gt; log.txt" executionContext="elevated">
        <Environment>
          <Variable name="EMULATED">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
          <Variable name="RUNTIMEID" value="node" />
          <Variable name="RUNTIMEURL" value="http://az413943.vo.msecnd.net/node/0.8.4.exe" />
        </Environment>
      </Task>
      <Task commandLine="node.cmd .\startup.js" executionContext="elevated" />
    </Startup>
    <Endpoints>
      <InputEndpoint name="HttpsIn" protocol="https" port="443" />
    </Endpoints>
    <Certificates>
      <Certificate name="certificateName" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    <Runtime>
      <Environment>
        <Variable name="PORT">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='HttpsIn']/@port" />
        </Variable>
        <Variable name="EMULATED">
          <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
        </Variable>
      </Environment>
      <EntryPoint>
        <ProgramEntryPoint commandLine="node.cmd .\server.js" setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>
  </WorkerRole>
</ServiceDefinition>

另外,请提供server.js文件中的代码 - 至少是绑定完成的前10行。并且在更改之后,请执行以下命令行并告诉我们结果是什么:

  

c:&gt; telnet [your_cloud_service] .cloudapp.net 443

还请确认您在执行powershell命令的文件夹中有.pfx文件。