65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Apache 服务器(AWS EC2 Ubuntu Linux)上运行和部署 ASP.NET Core Web 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (14投票s)

2016 年 10 月 18 日

CPOL

7分钟阅读

viewsIcon

117195

本文提供了一个端到端的指南,介绍了如何在 Amazon Cloud Service 的 Linux 服务器上,使用 Apache 服务器作为代理来运行 ASP .NET Core Web 应用程序。

引言

在 Linux 机器(Amazon EC2 VM 上的 Ubuntu Linux,使用 Apache 服务器反向代理)上运行和部署 ASP.NET Core 应用程序。

我写这篇文章是为了分享我部署 ASP.NET Core Web 应用程序到 Linux 上的学习心得。关于如何编写这些应用程序的信息,可以在网上找到很多,但比较分散。

在这篇文章中,我将把这些零散的知识点串联起来,提供一个完整的指南,介绍如何在 Linux 上,在 Apache 服务器后面部署 ASP.NET Core Web 应用程序。

本文更侧重于实际操作,而不是深入探讨概念。它更多地是关于连接 Windows 和 Linux 这两个世界。

路径

.NET Core 是一个开源框架,可用于编写跨平台 .NET 应用程序。但在编写 .NET Core Web 应用程序时,没有任何生产 Web 服务器直接兼容 .NET 应用程序。为了解决这个问题,.NET Core 社区提供了一个轻量级服务器(Kestrel 服务器),它模拟了一个跨平台环境来运行这些 Web 应用程序。由于 Kestrel 服务器非常轻量,许多生产 Web 服务器的功能在它里面都缺失了。因此,我们将 Kestrel 服务器隐藏在一个生产级的代理服务器(在这里是 Apache 服务器)后面。

平台

本文将使用 Amazon EC2 上的 Ubuntu Linux 16.04 虚拟机。

步骤

以下是实现此解决方案的步骤列表:

  1. 设置 Linux 环境(例如:Amazon EC2 上的 Ubuntu Linux)
  2. 在 Linux 系统上安装 .NET Core
  3. 创建一个最小化的 .NET Core Web 应用程序
  4. 发布 Web 应用程序
  5. 使用 Supervisor 监控服务部署应用程序
  6. 直接在 Kestrel 服务器上测试应用程序
  7. 在 Linux 上安装 Apache 服务器
  8. 将 Apache 配置为 Kestrel 服务器的代理

当然,最后还需要在互联网上测试你的应用程序。

开始动手

1. 在 Amazon EC2 上设置 Ubuntu Linux

在本教程中,我使用的是 Amazon EC2 上的免费版 Ubuntu Linux。

创建虚拟机的步骤可以在 https://console.aws.amazon.com 上轻松找到。

创建完成后,你的虚拟机实例看起来会是这样的:

下一步是能够通过 SSH 连接到这台机器。对于 Linux / Mac OS 用户来说,这很简单。Windows 用户通常偏爱使用 putty(可在 http://www.putty.org/ 下载)来 SSH 连接到远程虚拟机。

创建虚拟机时,Amazon 会提供一个私钥(如果你选择添加新密钥,格式为 `*.pem`)。可以使用 puttygen 工具(可在 https://winscp.net/eng/docs/ui_puttygen 下载)将其转换为 `*.ppk` 格式。

生成 `*.ppk` 文件后,下面的屏幕截图展示了如何使用 putty 打开与 EC2 的 SSH 连接:

有了这三条信息,我们就可以打开与远程机器的终端会话了。

连接成功后,将登录到 `ubuntu` 用户,如下所示:

2. 在 Linux 系统上安装 .NET Core

步骤非常直接,并且可以在 .NET Core 官方网站 http://www.microsoft.com/net/core#ubuntu 上找到。安装完成后,你就可以在终端上运行 `dotnet` 命令了。

以下是按照上述链接中的说明,在 Ubuntu 16.04 上安装 dotnet 的命令:

sudo sh -c 'echo "deb [arch=amd64] 
https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > 
/etc/apt/sources.list.d/dotnetdev.list'

sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893

sudo apt-get update

sudo apt-get install dotnet-dev-1.0.0-preview2-003131

dotnet

最后一个命令将确认 dotnet 已安装。

3. 创建 .NET Core Web 应用程序

以下是创建最小化 .NET Core Web 应用程序的步骤,该应用程序只会简单地在浏览器中显示“Hello”字样。

  • 我们为应用程序创建一个目录(此处为 `/home/ubuntu/myapp`):

  • 使用 vi 编辑器(我就是这样做的),或者你选择的任何编辑器来编辑 `project.json` 文件。

  • 确保你的 `project.json` 文件如下所示(这里我们添加了 Kestrel 服务器和日志记录依赖项):

    如果使用 vi 编辑器,请使用 `:w ` 保存文件,使用 `:q ` 关闭文件(想到为完全不熟悉 Linux 环境的人说一下)。

  • 接下来是创建一个 `Startup.cs` 文件。

  • 关于应用程序启动,.NET Core 官方网站上有大量信息。你可能想浏览一下这个链接:https://docs.asp.net/en/latest/fundamentals/startup.html
  • 下一步是将控制台添加到 `loggerFactory`(使用 `AddConsole` 以便能在终端/命令行上看到日志),并捕获一个日志记录器实例以用于请求日志记录。
  • 修改 `Startup.cs` 文件,添加一个中间件(通过 `app.Run` 配置),该中间件将处理服务器收到的每个请求,并响应文本“hello”。

    最后,`Startup.cs` 文件应该如下所示:

  • 修改 `Program.cs` 文件

  • 主方法配置了一个 Web 主机,使其在 Kestrel 服务器上运行,并监听匹配“http://*:4000”的 URL。
  • 在 `://*:` 中放置一个星号很重要,这样在运行应用程序时,外部世界就可以访问它。在大多数文章中,你会发现它通常是 `localhost`(例如 `https://:5000`),但这不足以在网络上访问。

  • 保存文件并退出编辑器。
  • 在终端运行“dotnet restore”。
  • 接着运行“dotnet build”和“dotnet run”,下面的截图显示服务器已启动并正在监听配置的 URL:

4. 发布 Web 应用程序

下一步是使用“dotnet publish”命令发布应用程序。

发布的文件显示在下面的截图中:

5. 使用 Supervisor 监控服务部署应用程序

Supervisor 是一个监控应用程序,它将运行和监控我们的 .NET Core 应用程序。应用程序运行的配置在 `/etc/supervisor/conf.d/` 目录中的 `*.conf` 文件中指定。

  • 安装 supervisor 服务

  • 在 `/var` 下创建一个部署文件夹(此处为 `/var/netcore/myapp`):

  • 将已发布的输出文件复制到部署文件夹:

  • 在 `/etc/supervisor/conf.d` 目录下,创建一个应用程序 myapp 的配置文件,以便 supervisor 读取:

    `myapp.conf` 文件应如下所示:

  • 停止 supervisor 服务并重新启动:

6. 直接在 Kestrel 服务器上测试应用程序

在示例中,我们将应用程序托管在 `http://*:4000` 上,默认情况下,此端口在 Amazon Linux ec2 实例上不对外开放。要使其可访问,我们需要修改安全组的入站规则,并允许端口 4000 的 TCP 流量,如下图所示:

一旦启用了端口 4000 的 TCP 访问,我们就可以打开浏览器来测试我们的应用程序了。

成功!

我们知道,这里应用程序运行在 Kestrel 服务器上,它不是一个功能齐全的 Web 服务器。建议在生产环境中,将 Kestrel 运行在生产级 Web 服务器(如 IIS、nginx 或 Apache)之后。此外,浏览器默认会向 Web 服务器发送端口 80 的请求。在 Linux 上,我们可能还会运行其他服务器和应用程序,如 tomcat/nginx 等。因此,将 Kestrel 服务器直接暴露在端口 80 上并不是一个好主意,因为它会占用端口 80(不足以充当代理服务器/负载均衡器)。所以,最好有一个功能齐全的服务器将请求路由到机器上的相应端口。

在本例中,我们将把 Kestrel 服务器放在 Apache 服务器后面,并使用反向代理。详细信息如下。

7. 在 Linux 上安装 Apache 服务器

使用以下命令安装 apache2:

"apt-get install apache2"

它会自动启动,你可以在浏览器中检查默认页面。

8. 将 Apache 配置为 Kestrel 服务器的代理

上面看到的默认页面配置在 `/etc/apache2/sites-available/` 中的 Apache 配置文件里。

假设我们想在 `http:///myapp` 这个 URL 上运行我们的 'myapp' 应用程序。

我们可以修改配置,将 `/myapp` 作为代理指向 `localhost:4000`(其中 `myapp` 在 Kestrel 上托管)。步骤如下:

  • 使用 `a2dissite` 命令禁用 Apache 服务器的默认配置(默认配置文件是 `000-default.conf`):

  • 在 `/etc/apache2/sites-available/proxies.conf` 中创建一个代理配置文件。
  • 添加条目,将 `/myapp` 作为代理指向 `https://:4000`(即 myapp 在 Kestrel 上的 URL)。`proxies.conf` 文件应如下所示:

  • 使用 `a2ensite` 命令启用代理配置:

  • 使用以下命令启用 mod proxy:

  • 使用“service apache2 restart”重启 apache2:

  • 通过代理路径(在浏览器中输入 `http:///myapp`)从默认端口测试应用程序,如下所示:

这样我们就完成了!

我们的应用程序正在默认端口 :80/myapp 上运行!!!

参考

© . All rights reserved.