正如 @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 通常会为您解决这个问题。