0

我已经设置了一个 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吗?尽管改变这一点似乎并没有太大的不同。


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

服务配置.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>

服务定义.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>

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

4

1 回答 1

0

protocol您提供的值是HttpInHttpsIn您只能将这些值用于 ASP.NET Web 角色!当您在 Worker Roles 上运行 3rd 方 Web 服务器时,您只能用作属性tcpprotocol!改变这是使事情不起作用的最简单方法!您能否将它们切换回tcp,从 Https Endpoint 中删除该certificate属性并重试?

此外,默认示例应用程序 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:>telnet [your_cloud_service].cloudapp.net 443

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

于 2013-06-14T22:22:38.303 回答