我已经设置了一个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 > 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>
我还尝试了各种变体(额外的标签和属性较少),似乎没有任何效果。
答案 0 :(得分:0)
您提供的protocol
值为HttpIn
和HttpsIn
。对于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 > 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文件。