服务端应用需要部署到服务器上运行,部署,就是把我们在本地电脑上开发的应用,搬到服务器上去运行。这个服务器跟我们平常用的电脑没有太大区别,可以把它想成是一台能通过固定地址在网络访问到的电脑,服务器提供了计算能力,存储空间还有带宽。
大部分云服务商都提供这种可以部署服务端应用的服务器,像阿里、腾讯、华为、亚马逊它们都提供云服务,我们可以从这些云服务端那里按需求购买相应配置的服务器,其实我们买的并不是一台真实存在的设备,买的只是计算与存储的能力,还有网络带宽。至于服务商如何提供这些能力并不是我们要操心的事情。
应用的服务器所使用的操作系统一般都是 Linux 类型的操作系统,这是一种开源的操作系统,也就是任何人都可以查看系统的源代码,可以参与改进这个系统,也可以定制属于自己的系统。所以 Linux 操作系统有很多种发行版本,每种版本都有自己的一些特色与功能,但是它们的核心都是一样的,像 Redhat,Ubuntu 都属于 Linux 这种类型的操作系统。
部署服务端应用的时候,需要远程管理服务器,要在服务器上准备应用需要的运行环境,所以我们至少需要熟悉一种 Linux 操作系统才能去做这些事情。另外我们还得再熟悉一下命令行界面的工作方式,因为服务器所使用的 Linux 系统并不会提供图形界面,所有的任务都需要在命令行界面下通过执行文字命令来完成。也就是我们需要使用在本地电脑上的一个命令行界面工具,先远程连接到要管理的安装了 Linux 操作系统的服务器,然后再通过输入并执行文字命令完成要做的事情,比如在服务器上去安装软件,启动服务,管理文件与目录等等。
有了服务器以后,要在服务器上准备好应用需要的运行环境,也就是要去安装并且配置好运行应用的时候需要的一些软件与服务。这个应用的运行环境是我们选择的服务端技术决定的,比如我们选择的是 Node.js 这种技术开发的服务端应用,要在服务器上运行它就需要在服务器上先安装一下 Node.js 这个软件。服务端应用一般都会使用某种数据服务,所以我们需要在服务器上准备好这种数据服务,比如服务端如果用的是 MySQL 这种数据库,我们就需要在服务器上安装好 MySQL,启动以后它就可以给我们的服务端应用提供数据服务了。
客户端之所以可以通过网络请求使用服务端应用提供的接口,是因为服务端会提供一种 Web 服务,这种 Web 服务可以通过普通的 HTTP 协议,或者带加密功能的 HTTPS 协议访问使用。大部分服务端技术都有这种创建 Web 服务的功能,应用运行以后就可以对外提供 Web 服务,这样大家就可以通过 HTTP 或者 HTTPS 协议请求使用服务端应用提供的接口了。
还有一种比较常见的做法,就是通过专门的 Web 服务软件对外提供 Web 服务,它们提供的 Web 服务的性能更强,能够更有效的处理客户端的请求,比如 Nginx 就是这种软件,用它给我们的应用创建一个 Web 服务,负责接待客户端请求,它会把收到的请求转发给我们的服务端应用去处理,服务端应用会把处理结果交给 Nginx,再由 Nginx 把应用作出的响应转交给客户端。这里用 Nginx 创建的这个 Web 服务,像是客户端应用与服务端应用之间的一个代理,所以这个 Web 服务也会被称为代理服务或者叫反向代理服务(reverse proxy) 。
在服务器上配置好应用的运行环境以后,再想办法把应用的代码迁移到服务器上,需要编译的话还得再编译一下,这时应用就可以正常运行了,也就算是成功部署了应用。我们可能偶尔会更换服务器,或者扩展应用的服务器,这就需要重复这些操作,配置环境,迁移代码,编译应用等等。用户需求不断地变化,为了满足这些新的需求,应用也需要不断地变化,所以应用的运行环境也可能会发生相应的变化,这就需要我们在所有服务器上同步更新应用的运行环境。通过一些容器化技术构建与部署应用能够更好的应对这种不断地变化。
容器化技术可以让我们把运行应用需要的所有的东西打包成一个镜像,里面包括了构建好的应用,还有运行应用的时候需要的所有环境,更新了应用或者应用的环境可以重新编译生成新版本的镜像。基于镜像可以创建能够运行的容器,容器运行起来了,我们的应用也就算是运行起来了。也就是在应用的服务器上面,只需要支持这种容器化技术就能运行我们的应用了,不再需要单独配置应用的环境,也不需要迁移与编译应用。在任何支持这种容器化技术的服务器上,通过一行命令就可以自动到指定的地方安全的下载我们编译好的镜像,创建并运行应用的容器。