如何在 Ubuntu 上托管/发布我的 .Net Core WebAPI?

Posted

技术标签:

【中文标题】如何在 Ubuntu 上托管/发布我的 .Net Core WebAPI?【英文标题】:How do I host/publish my .Net Core WebAPI on Ubuntu? 【发布时间】: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 是什么?

【问题讨论】:

Windows 上的 ASP.NET Core 应用程序不再在 IIS 内运行,而是在进程外运行,并且 IIS 仅充当反向代理。 ***.com/a/38035686/2833802 【参考方案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

【讨论】:

以上是关于如何在 Ubuntu 上托管/发布我的 .Net Core WebAPI?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 18.04 上托管使用 docker 构建的 Web 应用程序

在 DigitalOcean ubuntu 服务器上托管闪亮的应用程序时出错

如何找出我的 Windows 域上托管 LDAP 的服务器?

如何将非 www 域重定向到 Azure 上托管的 asp.net mvc 中的 WWW 域?

在 IIS (10.0.17763.1) 上托管 .net5.0 核心 Web api 时出现问题

是否可以在同一个 AppDomain 上托管 WebMethods 和 ASP.NET 应用程序?