首页 文章

我如何在 Ubuntu 上 host/publish 我的.Net 核心 WebAPI?

提问于
浏览
4

我正在学习.Net 核心。

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

在 Ubuntu 和 Linux 中托管/发布.Net Core WebApi 的方式与在 5000 这样的特定端口上运行有什么相似之处?

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

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

我还阅读了以下链接并实施了所有步骤。 发布到 Linux 生产环境

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

3 回答

  • 2

    As_1_has 注意到,托管.NET Core Web API 或 ASP.NET Core 应用程序的推荐方法是使用 Kestrel,这是内置于 dotnet 核心工具中的 Web 服务器。出于开发目的,您不需要另一个 Web 服务器来启动和测试您的 API。

    您不需要 Docker 来托管您的 web application/API,但是应该将其视为生产托管,因为它是一种干净,快速的自动化版本和隔离进程的方法。

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

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

    • 在 Ubuntu 上,使用 Nginx(或 Apache)提供公共 HTTPS,并将其配置为将请求转发到您的 Kestrel 服务器,该服务器通常在端口 5000 上运行。如果您的服务器运行防火墙,请不要公开端口 5000,而是打开该计算机上的端口 443(HTTPS)。您引用的文章中介绍了如何设置 Nginx。如上所述,不仅仅需要启动和测试 Web API。

    • 红隼很快但很简单 - 例如。它不支持 HTTPS(您应该将其用于公共 API,因为您需要身份验证,并且无法在没有 HTTPS 的情况下安全地进行身份验证。使用 Nginx/Apache 而不是 Kestrel 还有许多其他原因 - 安全性,负载平衡,反向代理功能等等

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

    • 确保您正在定义适当的运行时
    "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 VM 或服务器,并添加应用程序需要运行的任何文件,例如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 并使其保持运行。您可以使用dotnet MyWebApi.dll在 Windows 上手动启动应用程序,并将 IIS 配置为转发给它。

    • 正如我所描述的那样运行在学习时很好,但是对于生产,你需要定义你的 API 作为 Linux 守护进程启动并让 Linux 重新启动它如果它崩溃(Docker 也可以为你做这个)。 IIS 通常会为您处理此问题。

  • 1

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

  • 0

    您可以像这样指定 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。

    在项目目录中,只需打开 terminal/console 窗口并运行“dotnet run”。

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

    上面的示例假设您正在使用 Startup for 启动课

相关问题