zoukankan      html  css  js  c++  java
  • 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%以上的网站端口绑定问题。

  • 相关阅读:
    show proceslist时发现大量的sleep,有什么风险吗,该如何处理?
    监控MySQL的性能,应该主要观察那几个监控项?
    MySQL所有的压力都在一个CPU核心上,为什么会产生这种现象,改如何解决?
    大表,某列无索引,先需要查询该列,删除符合条件的记录,大约占40%数据量,请问有何更好的方案吗?
    MySQL DBA运维中那些动作属于危险性操作?
    云环境上自建MySQL,有哪些高可用实现方案?
    RDS上,MySQL实例中某张表数据小于tmp_table_size,但有查询时会报错临时空间满 The table '/data/mysql/zst/tmp/#sql_13975_23' is full. 原因可能是什么?
    MySQL误删除frm文件该怎么办?
    生产环境MySQL死锁如何监控及如何减少死锁发生的概率。
    MongoDB有哪些优秀特性及适合的场景是什么?
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/13724360.html
Copyright © 2011-2022 走看看