【问题标题】:How do I host/publish my .Net Core WebAPI on Ubuntu?如何在 Ubuntu 上托管/发布我的 .Net Core WebAPI?
【发布时间】:2016-06-27 05:09:18
【问题描述】:

我正在学习 .Net Core。

我使用 ASP.Net MVC 开发了 WebApplication,因为它可以在本地 IIS 上安装和运行。

与在 Ubuntu 和 Linux 中托管/发布 .Net Core WebApi 的方式类似,而不是在特定端口(如 5000)上运行?

docker 对这种情况有帮助吗?如果是,那么我该如何使用它?

是否可以在没有 docker 的情况下托管/发布?我如何在没有 Docker 的情况下托管/发布?

我还阅读了以下链接并实施了所有步骤。 Publish to a Linux Production Environment

在上面的链接中,我无法确定访问 webapi 的 url 是什么?

【问题讨论】:

标签: c# .net asp.net-core asp.net-web-api2 publish


【解决方案1】:

正如 @Pawel 所指出的,托管 .NET Core Web API 或 ASP.NET Core 应用程序的推荐方法是使用 Kestrel,它是 dotnet 核心工具中内置的网络服务器。出于开发目的,您不需要其他网络服务器来启动和测试您的 api。

您不需要 Docker 来托管您的 Web 应用程序/API,但应该考虑将其用于生产托管,因为它是自动化发布和隔离流程的一种干净、快速的方式。

使用 Docker,进程结构是相同的 - Docker 只是托管和管理进程。您可以让 Kestrel 在一个 Docker 容器中运行您的 API,然后 Nginx(在另一个容器中或安装在基本操作系统上)将调用转发给它。

在没有 Docker 的情况下托管您的 API

  • 在 Ubuntu 上,使用 Nginx(或 Apache)提供公共 HTTPS,并将其配置为将请求转发到通常在端口 5000 上运行的 Kestrel 服务器。如果您的服务器运行防火墙,请不要暴露端口 5000 ,但在该机器上打开端口 443 (HTTPS)。您引用的文章中介绍了设置 Nginx。如前所述,不仅需要启动和测试您的 Web API。
  • Kestrel 速度快但非常简单 - 例如。它不支持 HTTPS(您应该将其用于公共 API,因为您需要身份验证,并且如果没有 HTTPS,您将无法安全地进行身份验证。在 Kestrel 上使用 Nginx/Apache 有许多其他原因 - 安全性、负载平衡、反向代理功能等。

让您的 API 在开发设置中运行的简单步骤

  • 确保您在 project.json 中定义了适当的运行时

    "runtimes": {
       "win7-x64": {},
       "win81-x64": {},
       "ubuntu.14.04-x64": {},
       "debian.8-x64": {}
    }
    
  • 确保您的 project.json 在 buildOptions 部分中定义了 "emitEntryPoint": true
  • 为您将部署到的平台构建项目:dotnet build -r ubuntu.14.04-x64 --build-profile Release
  • 为平台发布您的项目:dotnet publish -r ubuntu.14.04-x64 --configuration Release -o ./bin/Release/Publish

使用我展示的命令行为 Ubuntu 构建和发布您的应用程序 - 我已在 VS 2015 Update 3 中尝试过,但在为正确的运行时构建它时遇到了问题

  • 将 Publish 文件夹中的文件复制到您的 Ubuntu 虚拟机或服务器,并添加您的应用需要运行的任何文件,例如 appsettings.json
  • 确保在您的 Linux 计算机上安装了适当的 .NET Core 框架。
  • 打开一个终端窗口,sudo -i 以获取管理员权限,cd 到您放置二进制文件并运行 api 的文件夹,使用:dotnet MyWebApi.dll 其中 MyWebApi.dll 是构建过程的主要输出。

此时,Kestrel 应该从通常的消息开始,说明它正在侦听的端口(例如,5000)。如果它是一个无头服务器,你应该能够使用 curl 调用你的 Web API:

    curl http://localhost:5000/whatever/your/api/needs/here

如果 Ubuntu 机器有 GUI(Gnome 等),您应该能够使用浏览器连接到您的 api。

如果您的 Ubuntu 服务器没有运行防火墙,您应该能够使用同一网络上另一台计算机上的浏览器连接到 Web API:

    http://<linux-ip-address>:5000/whatever/your/api/needs/here

您可以通过在终端窗口中输入 ip addr show 来获取 Ubuntu 服务器的 IP 地址。

注意事项

  • 管理防火墙取决于您的 Linux 发行版。如果服务器是公开的,你真的必须运行一个并使用它来关闭对 ​​Kestrel 服务的访问。
  • 设置 Docker 比较复杂,这里就不多说了。问一个单独的问题,我会记录我所做的。
  • 请注意,当您在 Windows 上的 IIS 下运行时,会发生完全相同的事情:IIS 将请求转发到端口 5000 上的 Kestrel 或您指定的任何端口。通常,IIS 配置为(通过您的发布生成的 web.config 文件)以在需要时启动 Kestrel 并使其保持运行。您可以在 Windows 上使用 dotnet MyWebApi.dll 手动启动您的应用,并配置 IIS 以转发给它。
  • 按照我的描述运行在学习时很好,但对于生产,您需要定义 API 以作为 Linux 守护程序启动,并在 Linux 崩溃时重新启动它(Docker 也可以为您执行此操作)。 IIS 通常会为您解决这个问题。

【讨论】:

    【解决方案2】:

    Asp.NET Core 应用程序使用名为 Kestrel 的跨平台应用程序 Web 服务器。您可以直接使用 Kestrel 运行您的应用程序(例如,使用 dotnet run - 在开发过程中非常有用)但是不建议将 Kestrel 直接暴露给外界,因此在生产环境中,当在 Windows 上运行时,您可以将 IIS 放在应用程序前面或在 Linux 上运行时使用 nginx。你可以在这里找到一个示例 nginx 配置:https://github.com/aspnet/ServerTests/blob/dev/test/ServerComparison.FunctionalTests/nginx.conf

    【讨论】:

      【解决方案3】:

      您可以像这样指定 url/port(在“Program.cs”文件中):

       public static void Main(string[] args) {
              var host = new WebHostBuilder()
                  .UseKestrel()
                  .UseUrls("http://192.168.0.0:8080")
                  .UseContentRoot(Directory.GetCurrentDirectory())
                  .UseStartup<Startup>()
                  .Build();
      
              host.Run();
          }
      

      将“192.168.0.0”替换为UseUrls()方法中的实际ip或url。

      在您的项目目录中,只需打开一个终端/控制台窗口并运行“dotnet run”。

      确保它显示“现在正在监听:192.168.0.0:8080”(或您输入的 url/ip)。

      上面的例子假设你使用 Startup 作为你的startup class

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 1970-01-01
        • 2018-09-10
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        • 2019-07-09
        相关资源
        最近更新 更多