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

如何在不到一分钟内启动并运行 MEAN 栈

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2015年6月29日

CPOL

8分钟阅读

viewsIcon

7336

在过去的一年里,我尝试了许多托管 MEAN 应用程序的方案,最终我选择了 DigitalOcean。

在过去的一年里,我尝试了许多托管 MEAN 应用程序的方案,最终我选择了 DigitalOcean。他们宣传的“不到 55 秒就能启动和运行 SSD 云服务器”是真的。不过,你现在不必花掉辛苦赚来的钱——我与 DigitalOcean 有特别的合作,你可以通过 这个链接 注册,立即获得 10 美元,这足够支付 2 个月不间断的服务器运行费用。他们甚至提供了 API,让你能够控制你的服务器,并且 本教程 展示了如何使用它。

我不想让你们觉得我是在推销 DigitalOcean——如果你愿意,你也可以选择其他服务商,我只是推荐他们,因为我过去与他们合作得很好,而且他们可以轻松地预装好 MEAN 栈(稍后会详细介绍),并 ready for use。

创建 Droplet

DigitalOcean 完成注册后,你将看到一个类似的屏幕,如下图所示,你需要点击 **Create Droplet** 按钮。

DO_1_createDroplet

接下来,你需要为你的 droplet(DigitalOcean 对其服务器实例的酷称)命名并选择大小(最小的就够用了),如下图所示。

DO_2_nameAndSize

之后,你需要选择一个区域,如下图所示。自然,你应该选择一个离你的目标受众更近的地点。

DO_3_region

现在是最精彩的部分。在 **Select Image** 部分,你有大量的选项,从基础发行版(CentOS、Ubuntu、Debian 等)到预装好的栈(LAMP、LEMP、WordPress、ROR、MEAN 等),如下图所示。在这里,你需要选择 MEAN on 14.04 选项(具体版本号 YMMV),这很棒,因为有了这个 droplet,你就不必像我们在 第一个教程 中那样费力地安装 Node.js、Express 和 MongoDB 了——它们已经安装好了,就等你来用! 太美了

DO_4_image

然后,只需等待几秒钟,你的 droplet 就会 ready。

DO_5_waiting

(Droplet 创建完成后)你将被重定向到仪表板,它看起来会像下图所示。

DO_6_created

连接到 Droplet

你的邮箱会收到一些说明,看起来会像下图所示。

DO_7_email

现在,使用你选择的 SSH 客户端(我目前在 Windows 上,所以选择不多 :)),连接到 droplet。下图展示了 Windows 上 Putty SSH 客户端的设置。

DO_8_putty_2

你必须使用 root 用户和邮件中提供的密码进行连接。但是,登录后你会立即收到一个通知,要求你更改 root 密码,如下图所示。

DO_9_rootLogin

创建新用户

在 Linux 中使用 root 用户是不好的做法,所以现在你将使用以下命令创建一个新用户。

useradd nikola

当然,你可以使用任何你喜欢的用户名。之后,通过执行以下命令将用户添加到 sudo 组。

gpasswd -a nikola sudo

sudo 组使 nikola 用户在使用一些仅限于 root 用户的命令时能够使用 sudo 命令。你可以在 这里 了解更多关于 sudo 的信息。下图展示了我刚才列出的命令的示例。

DO_10_userAdd

Run

现在只需运行

grunt

如果你访问你的 IP 地址并在端口 3000 上,你应该会看到

Screen Shot 2015-06-28 at 14.32.35

使用你自己的域名

如果你购买了(或者在 90 年代的 .com 泡沫时期留下的)一个域名,你想指向你的 droplet,你必须去 DNS 设置并添加一个域名,如下图所示。

DO_11_DNS

此外,在你的 域名注册商(你购买域名的网站——例如 Godaddy、Namecheap、Hostgator 等)处,你必须将相应的 nameserver 设置为

  • ns1.digitalocean.com
  • ns2.digitalocean.com
  • ns3.digitalocean.com

你可以在 Digital Ocean 官方指南 上了解更多关于此信息。

使用 PM2

手动运行你的 Node.js 应用程序,嗯,这不是我们的方式。想象一下每次发生什么都要重启应用程序,或者万一应用程序在深夜崩溃,你第二天早上才发现——多么可怕。 PM2 通过以下方式解决了这个问题:

  • 让你永远保持应用程序的运行
  • 在不宕机的情况下重新加载应用程序
  • 简化常见的系统管理任务

要安装 PM2,请运行以下命令。

sudo npm install pm2 -g

要使用 PM2 启动你的进程,请运行以下命令(进入你的应用程序的根目录)。

pm2 start server.js

从下图所示的输出中可以看到,PM2 会自动分配一个应用程序名称(基于文件名,不带 .js 扩展名)和一个 PM2 ID。PM2 还维护其他信息,例如进程的 PID、当前状态和内存使用情况。

PM2

如前所述,PM2 下运行的应用程序在崩溃或被终止时会自动重启,但要让应用程序在系统启动(引导或重启)时自动启动,还需要额外一步。执行以下命令可以实现这一点。

pm2 startup ubuntu

此命令的输出会指示你执行一个额外的命令,该命令将启用实际的启动时启动。对我来说,关于额外命令的说明是:

sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u nikola

如果你想了解更多关于 PM2 的额外选项,可以参考 这篇文章

将 NGINX 用作 Node.js 应用程序的前置反向代理

尽管此步骤并非强制性,但这样做有许多好处,如 此 Stack Overflow 问题 的回答所示:

  • 不必担心 Node.js 进程的权限/setuid。通常只有 root 才能绑定到端口 80。如果你让 nginx/Apache 负责以 root 身份启动、绑定到端口 80,然后放弃其 root 权限,那么你的 Node 应用程序就不必担心这个问题了。
  • 提供静态文件,如图像、CSS、js 和 HTML。与使用专业的静态文件 Web 服务器相比,Node 可能效率较低(在某些情况下 Node 也可能更快,但这不太可能成为常态)。除了更有效地提供文件外,你也不必像从 Node 中提供文件那样担心处理 eTag 或缓存控制头。有些框架可能为你处理这些,但你需要确定。无论如何,仍然可能较慢。
  • 更容易显示有意义的错误页面,或者在 Node 服务崩溃时回退到静态网站。否则,用户可能会收到连接超时。
  • 在 Node 前运行另一个 Web 服务器可能有助于缓解针对 Node 的安全漏洞和 DoS 攻击。以现实世界中的例子来说,CVE-2013-4450通过在 Node 前运行类似 Nginx 的东西 得到了预防。

因此,在确信将 NGINX 置于 Node.js 应用程序之前是个好主意之后,以下是安装和配置它的步骤。

首先,使用以下命令更新 apt-get 包列表。

sudo apt-get update

然后使用 apt-get 安装 NGINX。

sudo apt-get install nginx

现在打开默认的服务器块配置文件进行编辑。

sudo vi /etc/nginx/sites-available/default

并将此内容添加到其中。

server {
    listen 80;

    server_name meantodo.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

这会将 Web 服务器配置为在其根目录响应请求。假设我们的服务器在 http://meantodo.com 上可用,通过 Web 浏览器访问它将把请求发送到应用程序服务器在端口 3000 上的私有 IP 地址,该请求将由 Node.js 应用程序接收并回复。

完成设置后,必须运行以下命令来重启 NGINX。

sudo service nginx restart

你可以在 大量的教程 中了解更多关于 NGINX 的其他设置。

使用 swap 模拟 RAM

由于我们选择了最小的 512 MB droplet 版本,我们可以使用 swap 来提高 droplet 的性能。Swap 是硬盘上的一块区域,操作系统可以将它用作临时存储无法再保存在 RAM 中的数据的地方。关于此的更深入教程,你可以查看 DigitalOcean 官方指南

为了分配 swap 文件空间,请执行以下命令。

sudo fallocate -l 1G /swapfile

然后通过执行以下命令将其限制为仅 root 用户。

sudo chown 600 /swapfile

使用接下来的两个命令,你实际上可以设置 swap 空间并启用它。

sudo mkswap /swapfile
sudo swapon /swapfile

要查看 swap 空间信息,你可以执行。

sudo swapon -s

要让服务器在重启时自动启用 swap,你必须将以下内容添加到 /etc/fstab 文件中。

/swapfile   none    swap    sw    0   0

此外,还有两个值得更改的设置。

  • swappiness – 此参数决定了系统将 RAM 中的数据交换到 swap 空间的频率。值为 0 到 100 之间,代表百分比(默认值为 60,但我们将使用 10,因为我们在 VPS 上)
  • vfs_cache_pressure – 此参数决定了系统在缓存 inode 和 dentry 信息方面的倾向程度(默认值为 100,但我们将使用 50)

为了进行此更改,请将以下内容追加到 /etc/sysctl.conf 文件中。

vm.swappiness=10
vm.vfs_cache_pressure = 50

 

其他安全注意事项

如果你想了解更多关于如何保护你的 droplet 的信息,我建议你仔细阅读 DigitalOcean 官方教程 中关于 Ubuntu 的初始服务器设置的步骤。

一份 150+ 页的 MEAN 教程 PDF

这实际上是我为 HackHands 撰写的 4 部分教程 系列的摘录。如果你愿意,也可以通过 LeanPub 查看所有这些帖子合并成的一个大 PDF 文件。

Screen Shot 2015-06-28 at 14.45.42

 

P.S. 这是一个故意的拼写错误,因为如果你为将某项内容投入生产而感到自豪,那么它被称为“prouduction”(production 的一个玩笑拼写)😉

P.P.S. 你可以输入任意金额(是的,即使是 0 美元),我不会介意;)不过,一杯咖啡会很好 smileyGlasses

hand_rock_n_roll

© . All rights reserved.