第2章第3节 打好地基

0 阅读8分钟

理论部分的讨论随着我们技术栈的选型敲定可以暂告一段落。现在该花点时间去实作了。我们需要为代码在互联网运行找一个落脚点,也就是说我们需要一台服务器。

如果说我们编写的代码是设计图纸,我们选择的技术栈是建筑材料,那服务器就是我们的建筑工地。在盖房的例子中,就是我们浇筑地基之所在,也是世人最终看到我们所建房子的地方。

在创业早期选择服务器提供商事关成本,复杂度和功能之间的平衡。我们在一开始并不需要类似亚马逊云(Amazon Web Service)或者谷歌云(Google Cloud)这样顶级大厂的服务。这就好像买下了一整个工业园区的土地但是只为了盖一栋居所。这对于我们的MVP需求而言过于复杂也过于昂贵。我们只需要一块性价比相对更合适的居住用地。

基于此,我们最终选择了DigitalOcean这家云服务商。

深入技术细节:配置第一台服务器

DigitalOcean成为众多开发者青睐选择的原因很直接:足够便宜。DigitalOcean将其提供的服务器命名为“水滴”(Droplets),听上去很接地气,不会让人产生闻之却步的惧怕。

DigitalOceam水滴的简明指南

拿到属于我们的第一台DigitalOcean服务器只花了不到5分钟,对,就是仅有512MB内存且后来导致很多尴尬事故的那台服务器。整个流程非常简单:

  • 创建一个DigitalOcean账号:就是很标准的注册步骤。

  • 创建一个水滴服务器:这就是我们施展的舞台。创建时你会看到一个简洁干净的引导页面。

  • 选择一个操作系统镜像:“镜像”(Image)是预先构建好的软件模版,通常用于服务器的操作系统以及相关基础软件。我们选择了标准的Ubuntu镜像,这是一个Linux的发行版,也是互联网应用服务器端的主流选择。Ubuntu拥有强大的社区,安全且免费。我们选择是长期支持版本(Long Term Support),这样可以在若干年内都得到安全方面的更新。

  • 选择付费套餐:这决定了服务器的性能(也就是盖房子的地块大小)。我们直接拉到页面最底部选择了最便宜的那一款:512MB内存,1个虚拟CPU,20GB的SSD硬盘。每个月只需要5美元。对于一个零用户零收入的MVP项目而言,这应该是一个理性的选择。狗窝虽小,但也是属于我们自己的狗窝。

  • 选择服务器区域:这决定了服务器在物理层面机房所属的地点。我们选择了班加罗尔。原因?因为我们知道首批用户肯定来自印度。就近选择服务器会让应用访问更快延时更小(因为数据传输耗时更短)。

  • 最后点击“创建水滴”按钮。

这几步做完之后,我们等待了大概1分钟,DigitalOceam就把我们的服务器准备好了。我们现在骄傲的成为了一个公网IP地址(也就是我们服务器在互联网的专属地址)的主人。我们准备用来盖房的小小地块已经准备就绪。

SSH:进入服务器的钥匙

有了土地,我们需要能够进入这个地块开始盖房子。不能只靠普通的网页浏览器管理服务器,还需要一个特殊的工具SSH(Secure Shell)。

可以把你的服务器想象成一个远处密闭无窗的建筑。SSH就是你加密过的魔法钥匙。你将使用类似ssh root@123.45.67.89这样的终端命令打开房门进入建筑。一旦SSH成功连接,你就拥有了一个可以直接发送指令给服务器的文本命令行:可以安装软件,创建文件目录,运行应用程序等等。

这就相当于我们的工作场所。闪烁的光标跳动在黑色的背景中,安全地连接到我们位于班加罗尔的服务器。现在可以完成我们地基的最后一块拼图了:让整个世界能够看到我们网站的软件。

Nginx+Gunicon: 服务员和后厨人员

仅仅运行一个Django应用是没法让网站能够被访问的。Django本身只是用于构建互联网应用的编程框架,就好比是菜谱和主厨。但它不是为了应对来自互联网成千上万的原始网络请求而生。如果让Django直面网络请求,就如同让成千上万饥饿的顾客直接冲进后厨,对着主厨喊出各自的订单。这无疑是巨大的混乱。

所以你需要一个专用于管理网络请求洪流的体系。对于一个基于Python的互联网应用,这个体系包括两个部分:一个网络服务器(Web Server)以及一个应用服务器(Application Server)。

  1. 网络服务器(Nginx):对应服务员。我们采用的网络服务器是Nginx(英语发音同"Engine-X")。它是你的餐厅里一位友善且高效的服务员。每一位顾客进来后首先打招呼就是它。它在同时处理数以千计的网络连接以及简单快速任务的表现堪称惊艳。Nginx的主要职责在于:
    • 返回静态文件:比如用户请求访问一张图片,一个CSS或JavaScript文件,Nginx都可以从储藏室(硬盘)直接读取然后返回给用户。这不需要麻烦大厨亲自处理这些请求。这对于系统的整体效能提升具有重大意义。
    • 作为反向代理:对于需要后厨料理(比如加载店铺的商品列表)的请求,Nginx自己并不会直接处理。它会迅速记录好这个订单(请求),径直来到后厨,把请求交给应用服务器来处理。
  2. 应用服务器(Gunicorn):后厨经理。我们选择的应用服务器是Gunicorn,就类似我们的厨房经理。它从Nginx得到网络请求然后把请求转换成我们主厨(Django)能够理解的某种形式。它会同时管理着多个负责不同工序的厨师(就是服务器中的工作进程Worker Process)。应用服务器是外部世界(由Nginx负责打交道)和我们的应用代码(由Django编写)之间的关键连接部分。

这样,整个流程看上去虽然简单但潜力十足;互联网的用户请求首先抵达Nginx。Nginx要么直接返回静态文件,要么吧请求转发给Gunicorn。然后Gunicorn运行Django代码处理请求,生成HTML页面,最后把处理好的结果返回给Nginx,最终得以让用户看到网站。

要把这些都搞定需要在我们的服务器上安装Nginx和Gunicorn软件并提供一些简单的配置文件把两者正确串联起来。这些准备就绪之后,我们的地基就已经浇筑完毕,网站已初具雏形。我们把域名mydukaan.io指向了我们服务器的公网IP。

我激动地在浏览器中输入这个域名(网址)并按下了回车键。

成了。我们每月5美元的服务器成功返回了一个简单的Hello World页面。

我们的MVP简陋滑板大功告成。48小时的时间所剩无几。得找一些真正的用户来看看他们是否喜欢我们的MVP。

第2章关键知识点总结

  • MVP不是最终产品的初级版本,而是一场验证核心假设问题的科学实验。它的目标是尽可能获取有用的反馈和经验,不是打造完美的产品。先花时间想清楚验证所需的最简陋“滑板”是什么再开始动手写代码。
  • 根据时间紧迫程度选择最熟悉的技术栈。创业伊始,“多久能上线”是最重要的关注点。所以尽量选择那些能帮你干“脏活”的开箱即用框架比如Django或者Rails。
  • 从长期考虑,选择靠谱的底层数据库。即使不会立马需要全部功能,但是从一开始就直接上马健壮强大的数据库比如PostgreSQL可以有助于迭代过程中的难题解决和功能扩展。
  • 谨慎控制起步阶段的架构规模。5美元一个月的服务器应该足够应对早期的数千位用户。除非确实有必要,否则不要过度设计系统或者在云服务商开销太多。
  • 搞清楚网络服务器(Nginx)和应用服务器(Gunicorn)的职责角色。他们之间类似餐厅服务员和后厨经理的分工模式是现代互联网应用的核心基石。