.NET 宣布全面跨平台和开源已经过去一段时间了,而 ASP.NET 5 的也已经到了 beta5。是时候行动起来,迎接下一个版本的 ASP.NET 了。为了将 ASP.NET 5 网站发布到一台 Ubuntu 服务器上,还是需费一番周折的。现在写下一些记录,希望能给大家一些帮助。本篇主要讲述操作步骤,让我们从整体上了解整个安装配置过程。针对过程中会遇到的问题,我会另外再笔。

 

目标

将一个简单的 Hello World 的 ASP.NET 5 应用程序部署到一台新安装的 Ubuntu 14.01 服务器上,让其运行起来。

那么我们的任务基本上就是这些:

  1. 配置基本服务器环境
  2. 配置 ASP.NET 5 运行环境
  3. 放置用于部署的安装源
  4. 启动 Web 应用程序
  5. 在服务器外部访问应用程序,令其能够访问

 

配置基本服务器

所谓基本服务器,也就是安装一些常规工具。基本上,这一步是最为简单快速的。我尝试了两台服务器,第一台位于本地电脑的虚拟机内,第二台是位于 Windows Azure 的虚拟机。

在 Ubuntu 上要使用的常规软件一般都可以通过 apt 包获得,因此,在开始之前,我们应该合理地配置机器的 source 列表,让我们后续的工作得以更快速高效。关于这一部分内容,已经有相当多的文章介绍了,推荐添加网易中科大的源,具体配置方法,请参考其他文章

而部署在 Azure 上的虚拟机,在系统的镜像里,微软已经为其配置了高效的 source,所以可以省去这一步。

我们使用 apt-get install 命令能够很轻松地安装如下软件:curl, unzip, libtool, make, automake, git

curl 是一个非常常用的命令,它提供 HTTP 通信的能力,支持 SSL,并且可以指定代理服务器,其更多用法,请参考此文章

unzip 就很好理解了,类似于 tar,是一个(解)压缩工具,用于处理标准 zip 文件。

libtool 是一个中间件,用于简化软件模块之间组件的依赖和调用。

make 是 Linux 体系中传统的编译源代码和安装工具(对于 Windows 开发者,可简单地理解为类似于 MSBuild 和 MSI 的合成品),而 automake 则能够简化 make 的配置文件 makefile 的制作的一个工具。

git 是一个源代码管理客户端,通过它可以简单地与集中式的源代码管理服务器进行通信。

安装完成之后,接下来我们的工作就容易开始了。

 

安装 Mono 运行环境

Mono 是一个开源的 CLR 实现,它最早由 Novell 于 2004 年发布,并一直活跃地维护着。截止目前它的最新正式版本是 4.0.2 ,已经与 Microsoft.NET 同步支持至 .NET 4.6,其中包括 C# 6 语法等。ASP.NET 5 在 Linux 上的运行正是基于 Mono 的,因此,要在 Linux 上运行 ASP.NET 5 应用程序,就需要在服务器上配置 Mono 环境。

配置 Mono 是很轻松的。因为 Mono 官方提供了足够的文档和指南,帮助我们顺利地完成 Mono 的安装。一些发行版的 Linux 中已经内置了 Mono。在 Ubuntu 上,我们可以使用 apt-get install 的方式来安装。

sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo “deb http://download.mono-project.com/repo/debian wheezy main” | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-complete

不过,不管是内置的,还是我们使用包管理器安装的,都有同一个问题:它们的版本较低。由于有商业公司支持,现在微软又大利地支持开源事业,因此 Mono 的日常开发是十分活跃的。这样给开发者带来的问题就是,我们从各路包平台获取到版本总是落后了一截。比如,在 Ubuntu 14 上,apt 安装的版本是 3.6 版;而在 Ubuntu 12.04 服务器上能安装的版本就更低了。为了使用 ASP.NET 5,我们需要至少为 3.8 版本,而在 Github 上,ASP.NET 官方文档 则干脆说需要 4.0.1 版本以上。

在 Ubuntu 12.04 服务器上,使用官方的命令只成功地安装了一个 2.8 版本的 Mono 运行时。于是,我们只好使用从源代码编译的形式来安装——不知道大家的感觉是怎样的,但其实我个人对从源代码安装这种方式一直有些顾虑。通常,      我们认为发布版本应该是稳定的,其稳定性和安全性是经过了大量测试和时间证实了的。但自己从源代码编译的感受就大不一样了,感觉是危险的,没有底的。

我想 Linux 管理员们一定已经习惯了这种方式。毕竟,在包管理流行起来之前,人们早就习惯了使用 make install  这样安装软件的方式。所以,我也想多说一句,从源代码安装这种方式是“古已有之”的传统,并非什么不稳定的因素。但如果您是一位服务器管理员,请慎重考虑这一点,我无法为您服务器的安全和稳定负责。

啰嗦这么多,其实配置 Mono 就如下这几句命令:

wget http://download.mono-project.com/sources/mono/mono-4.0.3.19.tar.bz2 /usr/local/src/mono-4.0.3.19.tar.bz2
cd /usr/local/src/
tar -xvjf mono-4.0.3.19.tar.bz2
cd mono-4.0.3
./configure –prefix=/usr/local
make
make install

其中的 mono-4.0.3.19.tar.bz2 文件 URL 是从 Mono Tarball下载页面 中获取到的,你尽可换成最新的。4.0.3 版的大小大概是 93M,如果网速较慢,可以提前先下载好,再离线安装也可以。这里我们采用的是官方的发布版本的源代码,如果需要开发版本的最新的,可以把上面的 wget 命令换成从官方的 git 源 克隆下载。

通过上述步骤,我们输入 mono  - -version 命令,就可以看到一个 4 版本的 mono 运行时了。如果你机器上还有之前较低版本的 mono,你可能希望从它升级,请参考张善友关于升级 Mono 的这篇文章

 

安装 dnvm

从我的体验上来看,这一步是最顺利,也是最快速的。当然,跟它的命令规模有很大的关系:

curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

下载完成之后,就可以运行 dnvm 命令看到结果了:

8015Q[BCT3SH76O]61%JUAO

接下来我们运行 dnvm upgrade,将会在本机安装一个合适的 dnx 运行时。完成之后,我们可以运行 dnvm list 命令查看到当前可用的 dnx 运行时了。

根据官方指南,我们还需要安装 libuv 这样一个异步 IO 库;然后配置 ~/.config/NuGet/NuGet.Config 文件中的 nuget 源位置。全部搞定之后,才算基本上准备好运行我们的 ASP.NET 5 应用程序了。

 

获取安装源并准备启动应用程序

将安装源放到服务器上的方法有很多,比如传统的 FTP,以及中转服务器等。为了简化操作,我们直接使用 Git 来获取置于源代码管理中的代码:

git clone https://github.com/aspnet/Home.git
cd Home/samples/latest/HelloMvc/

待完成之后,执行 dnu restore 命令来还原所依赖的包。一个 Hello World 应用程序虽然看起来并没有依赖太多东西,但我们依赖的诸如 StasticFiles 和 Kestrel 等包依赖了大量的其他包。因此第一次还原包还是需要一段时间的。如果一切顺利的话,基本上能够在 5 分钟之内完成。

 

启动服务

如果我们在 Windows 环境中开发,并发布到 Linux 平台,那么用于运行应用程序的命令可能有所不同。另外,平时我们开发可能会使用随机或变动的端口,而发布后,应用程序通常使用 80 或 443 这样的标准端口。所以通常,我们需要为开发和生产等环境提供不同的运行配置。

为了在 Linux 上使用 Kestrel 服务启动,可以在 project.json 中专门针对 Linux 的服务器配置一个 command,比如 kestrel,并对应地准备一个 hosting-kestrel.ini 文件:

“commands”: { “web”: “Microsoft.AspNet.Hosting –config hosting.ini”, kestrel: “Microsoft.AspNet.Hosting –config hosting-kestrel.ini” }

这样,我们在 Windows 中,使用 dnx . web 来使用 Web Listener 或 IISExpress 运行;而在 Linux 服务器上,仅需要运行换成 dnx . kestrel 即可。当然,如果通过命令行来运行 ASP.NET 5 项目,那么 Kestrel 的服务器在 Windows 中运行也是没有障碍的。

需要要特别提醒的是,Kestrel 只是一个针对开发用途的小型服务器程序,它在安全性、稳定性,以及高性能和可维护性等方面均不能与像 IISJexus 这样的专业的生产服务器软件相比,因此不建议将其作为生产服务器。

 

让网站能够通过外网访问

服务器出于安全起见,都是会配置防火墙的:默认各个端口均对外不可见。因此在配置好防火墙之前,我们的网站还不能够被计算机外部访问到。在服务器上,通过 iptables 命令配置防火墙规则,以允许来自外部的 80 或 443 端口的请求能够获得通过,详情可参考此文章,以及其对应的中文版本

在 Azure 及其他云或集群环境中,你可能还需要配置网关的防火墙。在 Azure 中,我们需要针对单个虚拟机配置其端口,让 80 或 443 端口的数据请求能够获得通过。

azure entrypoint

 

接下来,就可以通过你的 IP 或者域名访问你刚才配置的网站了。

how-to-asp-5-linux-2

 

总结

总体来看,从零准备这样的一个环境,步骤还是蛮多的。不过,毕竟是从零准备,难免需要准备一大堆工具和环境,而且总是可能遇到一些小问题的。但最终的成果是令人满意的,毕竟尽管 .NET 开源和跨平台事的影响力让 .NET 这样一个活跃的平台拥有更多可能性,而我们开发人员才是真正让这些可能性变成现实的人们。

这篇文章基本写的是“成功路线”,即 Happy Path。但 Happy Path 的背后,是无数个错误铺就而成的。过两天,我还将专门写另外一篇文章来记述我在整个过程中遇到的各种问题,以及对应的解决方法。

 

参考资源及扩展阅读: