为 Linux VPS 构建 ASP.NET Core Web 应用:第 1 部分






4.94/5 (14投票s)
一本面向 Windows 程序员的快速指南,教你为 Linux VPS 和 NGINX 构建安全的 .NET Core Web 应用
引言
随着 .NET Core 1.0 的发布,拥有十年 C# 经验的 Windows 开发人员的我,对新的跨平台机遇感到非常兴奋。在本系列文章中,我将以全栈 Web 开发者的身份,为开发一个小型开源 Web 应用程序奠定基础。在此过程中,我将向你展示如何
- 开始使用 Debian 虚拟专用服务器 (VPS) 并运行你的第一个 .NET 程序;
- 准备好生产环境的 Linux 环境;
- 构建你的第一个 .NET Core Web 应用;
- 配置一个免费域名;
- 设置 NGINX 作为反向代理;
- 在 Visual Studio 2015 中进行编码和构建,并在 Linux 上发布;
- 使用 Let's Encrypt 的免费证书启用 HTTPS
- 使用 jQuery 和 AJAX 构建一个简单的单页应用程序
- 添加数据库
这里的内容足够写几篇文章了,让我们开始吧!
获取你的 VPS
虚拟专用服务器 (VPS) 是当前最热门的技术。通过一些研究,你可以找到许多提供商,它们可以在几分钟内启动并运行你自己的 Linux 服务器,并且每月费用低至五美元。我觉得这令人兴奋,因为它让你在通常的托管计划(IIS 下配置网站的选项非常有限)之上获得了极大的自由。.NET Core 1.0 的魅力在于它允许你利用你的 C# 和 Windows 技能,在廉价、即时的 Linux VPS 上运行你的 Web 应用。
所以,去获取你自己的 VPS 吧。
好了吗?那么你的提供商应该已经给了你一个 IP 地址和一个初始的 root 密码。让我们好好利用它们。在本系列文章中,我将使用 Debian 8.5;你使用的具体 Linux 发行版可能会略有不同。
注意
在撰写本文时,.NET Core 二进制文件仅适用于 x64 Linux 发行版。 为了方便起见,请确保你使用的是 64 位系统,尽管对于内存少于 4GB 的系统,32 位系统更为合理——而且我们这里追求的是一个小巧的 VPS。本文最后一部分将详细介绍这一点。
电话那头的 E.T.:PuTTY 和 WinSCP
如果你每天都在使用这两个工具,请直接跳到下一节。否则,请继续阅读。
在此处下载并安装 PuTTY 和 WinSCP
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
https://winscp.net/eng/download.php
PuTTY 通过安全的 SSL 连接为你提供 Linux 系统的终端控制台。这是一个极其简单的工具,但这里有两个有用的技巧。
1:保存会话。实际上,这只需要你输入服务器的 IP 地址(或在你获得域名后输入域名),给它起个名字,然后点击 保存 按钮。这样它就会被添加到列表中,以后你就可以直接双击连接了。
2:放大控制台。默认情况下,每次连接时,PuTTY 都会给你一个 80x24 字符的屏幕,这对于任何实际用途来说都太小了。加载一个已保存的会话;在左侧选择 Window;输入你喜欢的尺寸(对我来说,最佳尺寸是 100x38);回到 Session 并保存。之后就可以愉快地连接了。
WinSCP 是那些自尊的人在说 FTP 时真正指的东西。它允许你通过安全连接上传和下载文件,而无需以明文、未加密的形式广播密码和数据——这让潜伏在周围的脚本小子们非常高兴。WinSCP 具有与 Norton Commander 或其后续版本 FAR Manager 相同的熟悉的两列布局。(而且,你总是先安装 FAR Manager,对吧?)
首次登录
启动 PuTTY 并连接。你的 Linux 系统最初只有一个“root”账户。我的提供商让我在设置 SSH 密钥而不是获取初始 root 密码,所以第一次登录时我必须立即更改密码。
login as: root
root@46.101.122.226's password:
You are required to change your password immediately (root enforced)
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Changing password for root.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
_____________________________________________________________________
WARNING! Your environment specifies an invalid locale.
This can affect your user experience significantly, including the
ability to manage packages. You may install the locales by running:
WARNING: 'False' is an invalid locale
To see all available language packs, run:
apt-cache search "^language-pack-[a-z][a-z]$"
To disable this message for all users, run:
sudo touch /var/lib/cloud/instance/locale-check.skip
_____________________________________________________________________
root@debian-512mb-fra1-02:~# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=False
LANGUAGE=
LC_CTYPE="False"
LC_NUMERIC="False"
LC_TIME="False"
LC_COLLATE="False"
LC_MONETARY="False"
LC_MESSAGES="False"
LC_PAPER="False"
LC_NAME="False"
LC_ADDRESS="False"
LC_TELEPHONE="False"
LC_MEASUREMENT="False"
LC_IDENTIFICATION="False"
LC_ALL=
root@debian-512mb-fra1-02:~# locale-gen en_US.UTF8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
root@debian-512mb-fra1-02:~# localectl set-locale LANG=en_US.UTF-8
(我用粗体强调了命令,以便它们在 Linux 返回的所有法语中脱颖而出。我将在后续的每个 shell 示例中都这样做。)
你现在最优先要做的事情是停止使用 root。在 Linux 命令中弄错一个字符很容易导致灾难性的后果;而 root 拥有执行所有操作的权限。键盘上的一次失误就可能让摄魂怪对你的系统造成可怕的后果。下面我将创建一个名为 gabor 的普通用户,但他可以通过在命令前加上魔法词 sudo 来假装成为 root,一次执行一个命令。执行此操作后,用 exit 退出,然后以更安全的身份重新登录。方法如下:
root@debian-512mb-fra1-02:~# adduser gabor
Adding user `gabor' ...
Adding new group `gabor' (1000) ...
Adding new user `gabor' (1000) with group `gabor' ...
Creating home directory `/home/gabor' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for gabor
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
root@debian-512mb-fra1-02:~# apt-get install sudo
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
sudo
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 860 kB of archives.
After this operation, 2,488 kB of additional disk space will be used.
Get:1 http://mirrors.digitalocean.com/debian/ jessie/main sudo i386 1.8.10p3-1+deb8u3 [860 kB]
Fetched 860 kB in 0s (4,512 kB/s)
Selecting previously unselected package sudo.
(Reading database ... 35512 files and directories currently installed.)
Preparing to unpack .../sudo_1.8.10p3-1+deb8u3_i386.deb ...
Unpacking sudo (1.8.10p3-1+deb8u3) ...
Processing triggers for man-db (2.7.0.2-5) ...
Processing triggers for systemd (215-17+deb8u4) ...
Setting up sudo (1.8.10p3-1+deb8u3) ...
Processing triggers for systemd (215-17+deb8u4) ...
root@debian-512mb-fra1-02:~# visudo
这里的诀窍是最后的命令 visudo。它会用默认编辑器打开一个特殊的配置文件。
这样,你就可以在“root”用户下方添加一行,如下所示:
# User privilege specification
root ALL=(ALL:ALL) ALL
gabor ALL=(ALL:ALL) ALL
保存你的编辑,然后用 exit 退出控制台。以你自己的身份重新登录。
获取 .NET!
以你自己的身份登录了?很好。该施展魔法了:我们现在将在 Linux 机器上安装 .NET。
官方说明:https://www.microsoft.com/net/core#debian
gabor@debian-512mb-fra1-02:~$ sudo apt-get install curl libunwind8 gettext
Reading package lists... Done
#
# Omitted many-many lines of output
#
gabor@debian-512mb-fra1-02:~$ curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809130
gabor@debian-512mb-fra1-02:~$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
gabor@debian-512mb-fra1-02:~$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
现在我们来稍微解释一下。
- apt-get install 是 Linux 中“下载这些包并安装它们”的等价命令。
- curl 命令从 Microsoft 链接下载一个文件,并将其保存在当前文件夹中,也就是登录后用户的主文件夹。
- 下一个 sudo 命令会在
/opt
下创建一个目录,并将下载的文件解压到其中。/opt
是 Linux 上安装自定义应用程序的标准位置之一。 ln -s
在/usr/local/bin
中为 dotnet 可执行文件创建一个符号链接,这是系统范围命令的目录。换句话说,现在任何人都可以输入 dotnet,系统就会为他们执行 dotnet。- 符号链接命令的语法是
ln -s actualfile symlink
。这将在以后派上用场。
现在你可以删除主文件夹中下载的文件了。del
命令不起作用。命令是 rm
。
说你好,世界
你说你在 Linux 上安装了 .NET?我还是不相信。我需要看到一个 Hello, world! 程序运行。让我们为此创建一个子目录,并告诉 .NET 创建一个新项目——这将正是 Hello, world。
gabor@debian-512mb-fra1-02:~$ mkdir work
gabor@debian-512mb-fra1-02:~$ mkdir hwapp
gabor@debian-512mb-fra1-02:~$ cd hwapp/
gabor@debian-512mb-fra1-02:~/hwapp$ dotnet new
-bash: /usr/local/bin/dotnet: cannot execute binary file: Exec format error
几乎成功了。如果你从一开始就听从了我的建议,并确保你使用的是 64 位系统,那么你现在在最后应该看到了 Hello, world!。如果像我一样,你天真地认为 512MB 的实例使用 32 位系统完全没问题,那么你看到的将是上面的错误。在这种情况下,请销毁你的 VPS 并从头开始。
结论
那么我们在这里取得了什么成就?我们实际上还没有构建任何东西,只是在命令行上说了一堆魔法词。而且我们做到了不可能的事情:在 Linux 上原生编译和构建了一个 C# 程序。
请继续关注我的系列下一篇文章,届时我们将为我们刚刚建立的 VPS 指配一个域名,将系统加固到预期对外暴露机器的最低要求程度,并让一个由 ASP.NET Core 驱动的真实网站向不明身份的导航员致意。
历史
2016/11/07 - 初始版本