Linux部署Net Core网站,三种自定义绑定端口号的方法(UseUrls,UseKestrel,手动指定)

一、应用场景

现在随着.Net Core的发展,Asp.Net的网站也可以开始跨平台发布了,.Net Core网站有两种形式,一种就是传统Windows自带的IIS服务器发布,还有一种就是在Linux这种没有操作界面的暗黑系统上发布。

IIS发布时端口是可以在可视化界面上配置的,而linux发布的时候,启动网站是系统会给一个默认的http-5000端口和一个https-5001端口,这时候往往会出问题,可能我们并没有配置https协议,导致我们的网站不可访问。或者我们并不想使用默认的5000端口,我们希望设置成8080或者8088,那应该怎么设置呢。这里介绍两种方法:

二、在程序中使用UseKestrel来配置

我们创建一个Web项目时,系统会自动给我们生成一个Program入口文件,如下

这里就是我们要配置端口的地方,这个Program文件如下

  1.  
    using Microsoft.AspNetCore;
  2.  
    using Microsoft.AspNetCore.Hosting;
  3.  
     
  4.  
    namespace ttttt
  5.  
    {
  6.  
    public class Program
  7.  
    {
  8.  
    public static void Main(string[] args)
  9.  
    {
  10.  
    CreateWebHostBuilder(args).Build().Run();
  11.  
    }
  12.  
     
  13.  
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  14.  
    WebHost.CreateDefaultBuilder(args)
  15.  
    //.UseKestrel(o =>
  16.  
    //{
  17.  
    // o.Listen(IPAddress.Loopback, 5080); //HTTP port
  18.  
    // //o.Listen(IPAddress.Loopback, 5443); //HTTPS port
  19.  
    //})
  20.  
    .UseStartup<Startup>();
  21.  
    }
  22.  
    }

需要配置的地方其实就是程序中被我注释掉的地方,如下

  1.  
    .UseKestrel(o =>
  2.  
    {
  3.  
    o.Listen(IPAddress.Loopback, 5080); //HTTP port
  4.  
    //o.Listen(IPAddress.Loopback, 5443); //HTTPS port
  5.  
    })

这段代码里可以看到有两个o.Listen(),o.Listen(IPAddress.Loopback, 5004) 就是进行绑定,其中第一个参数是IPAddress类型。

在文档中介绍,如果你只配置一个o.Listen(),那么系统会认为你配置的是Http端口,如果你配置了两个o.Listen(),则系统会自动把第二个o.Listen()识别成Https的端口。

这样在程序启动时,就可以使用你指定的端口了。

三、程序中使用UseUrls配置

上述方法可行,但是代码中可读性不好,因此我们可以使用一种可读性更好的配置方法:

  1.  
    using Microsoft.AspNetCore;
  2.  
    using Microsoft.AspNetCore.Hosting;
  3.  
     
  4.  
    namespace entConsole
  5.  
    {
  6.  
    public class Program
  7.  
    {
  8.  
    public static void Main(string[] args)
  9.  
    {
  10.  
    CreateWebHostBuilder(args).Build().Run();
  11.  
    }
  12.  
     
  13.  
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  14.  
    WebHost.CreateDefaultBuilder(args)
  15.  
    .UseUrls("http://*:5000;https://*:5001")
  16.  
    //.UseUrls("http://localhost:5002;http://localhost:5003")
  17.  
    .UseStartup<Startup>();
  18.  
    }
  19.  
    }

这种方法是不是一看就懂,http://*:5000中'*' 代表0.0.0.0,允许本机、局域网、公网访问,'*'不是特殊字符,任何不能识别成ip的字符都将会绑定到0.0.0.0。

你可以写成这种形式

UseUrls("http://*:5000;https://*:5001")

也可以写成

UseUrls("http://*:5000")

或者这样也可以

UseUrls("http://localhost:5002")

四、启动程序时手动指定绑定的端口

作者不喜欢在程序中写死这个配置,因为每次部署的时候改程序是件很有风险和很容易背锅的事情。当然也可以把端口写在配置文件中,用上述两种方法去读取配置文件。但是部署生产的时候修改配置文件同样是有风险的。

我们知道.net core可以使用dotnet 命令方式去运行 .net core 应用,这种方式使我们的web不再依赖于iis,实现了跨平台。
我们先了解下命令:

> dotnet run [options] [[--] arguments]

dotnet run 命令会把我们的项目编译后直接运行,在开发的时候使用,如果是编译好的项目,则使用:

> dotnet yourproject.dll [[--] arguments]

作者喜欢在启动程序时手动指定绑定的端口,只要使用参数--urls="http://*:5005",方法如下:

> dotnet test.dll --urls http://*:5005

是不是也很简单,正常启动程序时,指令时dotnet test.dll,我们只要在后面加上要绑定的端口就好了。效果如下:

看到Now listening on: http://[::]:5005,说明我们已经成功绑定了5005端口

五、补充

那每次启动都要来这样手动输入一次是不是太麻烦了?其实也是有解决办法的,作者常用的是利用supervisor作为守护进程,把启动指令写进supervisor配置文件中就好了,这样就算网站因为意外问题被关掉,supervisor依然可以使用设定好的启动命令将网站拉起来。

supervisor使用方法可以看另一篇文章:Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解

如果你还想再搞一搞端口转发,或者负载均衡,可以参看:Linux下如何配置Nginx负载均衡(避坑指南)

到这里,对于Linux发布网站时,如何制定网站端口的方法你就已经学会了,基本上可以解决99%以上的网站端口绑定问题。

posted @ 2020-09-24 15:38  盛开的雨季  阅读(2862)  评论(0编辑  收藏  举报