Azure 云服务上 WebRole 的自定义端口号

Custom port number for a WebRole on Azure Cloud Service

我有一个运行良好的现有云服务。它使用 2 个端点(http 80 和 https 443)

我正在尝试在端口 4443 上添加一个新端点,但它不可访问,当我尝试通过此端口访问我的网站时收到 ERR_CONNECTION_TIMED_OUT。

这里是 csdef :

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
  <WebRole name="MyWebRole" vmsize="Small">
    <Sites>
       <Site name="Web">
        <Bindings>
          <Binding name="httpsN" endpointName="httpsN" />
          <Binding name="httpsIn" endpointName="httpsIn" />
          <Binding name="httpIn" endpointName="http" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="httpsN" protocol="https" port="4443" certificate="myCert" />
      <InputEndpoint name="httpsIn" protocol="https" port="443" certificate="myCert" />
      <InputEndpoint name="http" protocol="http" port="80" />
    </Endpoints>
    <Certificates>
      <Certificate name="myCert" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
  </WebRole>
</ServiceDefinition>

注意:您可以定义多个端点,它们是 HTTP、HTTPS、UDP 和 TCP 端点的组合。您可以指定为输入端点选择的任何端口号,但为服务中的每个角色指定的端口号必须是唯一的。例如,如果您指定 Web 角色将端口 80 用于 HTTP,将端口 443 用于 HTTPS,则您可以指定第二个 Web 角色将端口 8080 用于 HTTP,将端口 8043 用于 HTTPS。

详情请参考“Azure Cloud Services – WebRole Schema”。

您的配置是正确的。您现在必须确保在您的 Web 角色中确实有东西在该端口上侦听。

这是进入我的 Web 角色的远程桌面会话,请注意 LISTENING 状态。

PS> netstat -an | select-string '443'

  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:4443           0.0.0.0:0              LISTENING

我用 PowerShell 伪造了两个监听器:

$listener1 = [System.Net.Sockets.TcpListener]4443
$listener1.Start();

$listener2 = [System.Net.Sockets.TcpListener]443
$listener2.Start();

nmap扫描自网络:

$ nmap -vvv -p 4443,443,80 multiendpointwebrole.cloudapp.net -Pn

Starting Nmap 6.47 ( http://nmap.org )
...
PORT     STATE SERVICE
80/tcp   open  http
443/tcp  open  https
4443/tcp open  pharos

所有三个侦听器均可访问。

.csdef:

...
<Bindings>
  <Binding name="Binding1" endpointName="Endpoint1" />
  <Binding name="Binding2" endpointName="Endpoint2" />
  <Binding name="Binding3" endpointName="Endpoint3" />
</Bindings>
...
<Endpoints>
  <InputEndpoint name="Endpoint1" protocol="http" port="80" />
  <InputEndpoint name="Endpoint2" protocol="tcp" port="4443" />
  <InputEndpoint name="Endpoint3" protocol="tcp" port="443" />
</Endpoints>
...

已针对两个端口和适当的证书使用 protocol="https" 进行了测试,

$ curl -kIi https://multiendpointwebrole.cloudapp.net/
HTTP/2 403
content-length: 1233
content-type: text/html
server: Microsoft-IIS/10.0
x-powered-by: ASP.NET
date: Tue, 30 Jan 2018 20:13:27 GMT


$ curl -kIi https://multiendpointwebrole.cloudapp.net:4443/
HTTP/2 403
content-length: 1233
content-type: text/html
server: Microsoft-IIS/10.0
x-powered-by: ASP.NET
date: Tue, 30 Jan 2018 20:13:43 GMT

// Ignore the 403, i had no index page.

嘿,来自 Windows Server 2016 的免费 HTTP/2 支持!微软真好。