疾风式全栈(15)-发布和运维(草稿)
软件开发完成之后, 就要上线发布. 也就是要把我们的软件放在服务器上启动, 让用户开始使用.
对于web系统来说, 客户端就是浏览器, 只要给出网址, 就可以访问. 对于其他形式的客户端, 可能还需要下载和安装的过程.
而服务器这边, 需要根据服务器的操作系统, 安装对应的软件和运行平台. 跟我们在自己电脑上安装的环境类似. 只不过服务器很多是Linux系统的, 特别是纯命令行界面的, 需要熟悉一下这样的环境和操作.
其实命令行的历史比我们所用的图形界面要久, 过去人们都是这样用电脑的, 只不过后来有了方便的图形界面, 多数普通用户就慢慢淡忘了命令行. 其实命令行还是有一些好处的, 所以在很多场合还是要用到.
一般我们通过SSH远程连接到Linux服务器, 输入用户名和密码, 登录之后, 显示一句提示, 就可以输入命令进行操作了. 这样的环境就叫shell.
比如我们输入 ls
就显示出当前路径下的文件名.
这里有一些名词, 在图形界面我们叫文件和文件夹, 在命令行中经常称文件夹为目录, 一级一级的目录用/连起来就称为路径(windows用). 我们输入的命令都是在当前目录执行的. 要查看当前路径输入命令 pwd.
另外一个概念就是path, 我们所输入的这些命令都是一些可执行程序, 他们的路径都要登记在path下, 我们才能直接执行. 如果没有登记, 我们就只有输入完整路径或者进入所在目录才能执行. 之前我们安装jdk和node时, 也设置了path. 在Linux下的概念类似, 具体操作方式可以通过网络搜索.
常用命令
cd 跳转目录
cat 列出文件内容, 可以查看小的文本
vi 命令行文本编辑器, 不用鼠标, 全键盘操作, 据说用熟了之后效率会很高
tail 查看文件末尾, 可以用于日志的查看
ps 显示进程信息
top 显示系统性能状况
命令后面可以加一些参数, 和我们调用函数的参数类似, 用空格分隔. 比如, tail -f 可以查看文件末尾的变化, 可以用来监控日志的更新.
大家可以尝试在windonws的powershell中练习这些命令, 概念是相似的. 现在的windonws也越来越重视shell, windonws 10 可以支持运行一个Linux的shell环境, 不过这功能现在也是测试, 而powershell已经兼容了许多shell命令.
传统的windonws命令行叫cmd. 不过功能较弱, windonws现在的发展重心是更为强大的powershell. 他们很多地方是兼容或类似的, 特别是我们多数时候只是进行日常的普通操作.
这些shell环境都是可以编写脚本程序的, 很多软件的安装和运行就是依靠shell脚本. 简单的shell脚本其实也还好理解, 复杂的可能我们也不想在这些专有的shell语法上花太多时间, 而是想更多通过我们熟悉的语言, 比如js, kotlin shell, 后者groovy(类似java)来实现. js里有gulp这样的处理工具, 而idea里从数据库表生成实体类的脚本是用groovy写的. 据说运维人员习惯使用python, 不过我也没有深入了解过. 脚本多数也是处理一些简单任务, 方便快捷是第一位的需求.
以上说的这些基础命令对于各个Linux版本基本都是通用的. 目前服务器主要使用的Linux版本是Cent和Ubuntu. 可能还有一些用Suse. 如果我们要安装软件, 就会用到不同的命令. 一般来说都会有一些包管理工具, 自动下载安装和配置依赖. 就像node中的npm, java里的maven一样.
要安装的环境也和我们在自己电脑上差不多, 用到java的要装jdk, 用到node的要装node. 如果使用git作代码管理, 也要装上git.
我们重点说一下nginx. 作为性能和功能都十分强大的web服务器, 我们想用他来管理我们的web服务. 在前后端分离的项目中, 一般会把网页等静态资源文件都统一让nginx管理. 而后端的接口, 也通过nginx转发. 这样从前端的角度看, 都是来自同一个地址, 不会发生跨域的问题. 并且nginx可以根据条件动态转发, 相当于做了一个简单的集群. 加上对https的支持十分方便, 后端代码不用修改, 就可以对外提供统一的https服务. nginx确实是强大好用. 现在据说也支持了http2, 建议大家多关注, 多尝试, 紧跟技术新潮流.
java项目的发布, 一般是采用war包的形式. 以前需要有一个tomcat提供运行环境, 现在用了spring boot, 运行环境是内置的了, 所以也不一定用tomcat, 可以选用性能更好的undertow. 项目整体打包成一个大的jar或war包. 在命令行使用java命令即可运行. 关于日志的配置和运行时的监控调整, 可以参考spring boot的文档.
node项目在生产环境中多数会用pm2来管理进程, 避免进程退出导致服务中断. 一般在package. json中都包含了生产环境运行的命令, 可以参考使用.
如果用到PHP代码, 也可以安装PHP环境, 并且通过nginx转发使用PHP服务. 具体方式可以通过网络搜索.
为什么会提到PHP呢, 因为计算机技术发展了几十年, 各种语言, 环境和技术实在是太多了. 每种可能都有一些应用领域, 特别是现成的代码, 对于已经实现的功能, 仅仅因为语言不同就重写一遍, 有些不太划算. 所以现在流行微服务的架构, 不管使用什么语言和技术编写的软件, 只要同样发布为HTTP接口的服务, 就可以相互调用. 我们也可以充分利用这种结构, 用最方便的技术去实现功能, 再通过统一的HTTP协议相互访问.
当然对于这么多用不同技术开发的HTTP服务, 管理就成了大问题. 所以google发布了Kubernetes, 基于docker容器技术, 实现了对各种异构服务的统一管理. 容器是一种轻型的虚拟机, 容器里可以运行各种技术编写的软件. 而Kubernetes提供统一管理的容器集群. 并且可以实现自动负载均衡, 自动监控和重启, 理论上说, 只要把服务发布上去, 就不用担心服务失效的问题. Kubernetes通过强大的自动运维功能, 为我们实现了最方便的软件运行环境.
当然, Kubernetes是个新技术, 学习和普及需要时间. 不过基于集群的自动运维管理一定是将来的发展方向. 我们只需要关注软件逻辑不出问题, 技术就会帮我们解决环境的问题.