这篇博文是部署相关的内容,首先我们先来记录一些比较常识性的知识。 写这篇博文的原因呢,是因为我在查找资料的时候在知乎看到一个帖子:Rails、Nginx、Passenger、bundle,这几者是怎么协作的?我在公司的月报总结里面写到,自己对整个框架的理解还不是很清晰,需要整理成一些可具化的东西,还有就是记录下一些部署过程中所遇到的坑,所以开始写这篇博文。
先来明确bundle的问题:Bundle是Gem包的依赖管理工具,RubyGem本身有依赖管理为何还要Bundle呢?有时候两个gem虽然都依赖于同一个gem,但是却是依赖不同的版本,这时候bundle就能帮助进行依赖计算。并且在部署的时候,能将不同app所需的一系列gem打包起来分开管理,就不至于污染整个系统的gems源。开发人员在Gemfile中指定所需的gem和版本等信息,然后bundle会计算出所有依赖的gem,并安装。
SSH agent 转发
先说说SSH agent 转发在我我们项目的需要。我们跳板机的ssh公钥是在放在gitlab仓库里面的,可以从仓库里面拉下代码。用root账号直接登上服务器,但是服务器的并没有直接将它的sshkey放在gitlab库上。当我们用同一个跳板机部署多台不同服务器的时候,重复设置ssh key就会显得很麻烦,所以利用SSH agent 转发还是很有用的。
这是极客学院的一篇wiki,SSH agent 转发教程,还有了解SSH 代理还有我觉得还是很用的。关于SSH代理的详细原理,还是有待继续探究的,后面再补上blog吧。
这就是我config文件的配置,可以顺利完成SSH agent转发。
Host ip1
Host ip2
Host ip3
ForwardAgent yes
准备OS
在项目里面,运维配置的操作系统是Ubuntu 14.04 LTS和Ubuntu 16.04 LTS。但是我们还是要做一下准备工作。首先是要在系统中安装rvm,这里我用的是 Ruby China Wiki 的教程,选择的ruby版本是2.4.1。如果使用mina 部署,需要在跳板机和服务器上都安装rvm,跳板机上的rvm是为了搭建一个mina的可执行环境。
当我们执行mina setup脚本的问题时,时常会执行很多apt-get指令,安装依赖的包:
command %[sudo apt-get install -y curl gnupg build-essential]
command %[sudo apt-get install -y git]
command %[sudo apt-get install -y nginx]
......
但是这些包的安装一般是不可能一次性完成的,会造成脚本执行的中断,从而遇到各式各样的问题:
“debconf: DbDriver ”config“: config.dat is locked by another process: Resource temporarily unavailable” while installing packages
这是问题一,linux的学习还是一个很漫长的过程,我时常是通过一些stackflow的搜索来查找答案,但是有时候还是知其然而不知所以然,也是感觉很无奈。不过工作中就是这样的,解决问题还是主要的目的,Resource temporarily unavailable answer
E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?
这个问题二,感觉有很多linux包管理方面的知识,我觉得造成了死锁。Resource temporarily unavailable answer
mina
暂时还没有可写的
nginx
Rails的接受请求的模型是一个进程处理一个请求。单个进程效率比较低,所以为了处理比较高的并发,会开启多个进程。
nginx是一个高性能的web服务器,本身和ruby没有关系,由于nginx处理链接和静态文件的性能非常好,所以一般在Rails之前放上nginx接受客户端请求,并分发给后端的Rails进程。
在我们的项目中,nginx主要是起到一个反向代理的工作。
什么是反向代理呢?我在学习资料的过程中遇到了一个比较生动的例子:反向代理:大家都有过这样的经历,拨打10086 客服电话,一个地区的 10086 客服有几个或者成千上万个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086 的总机号码,电话那头总会有人会回答你。那么这里的 10086 总机号码就是我们说的反向代理。客户不知道真正提供服务的人是谁。反向代理隐藏了真实的服务端,当我们访问 www.baidu.com 的时候,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实计算的服务器那里去。在这里的nginx,是代理我们服务器的某个实例(进程)。
关于正向代理和反向代理,这里有一个更精辟的总结:正向代理就是代理客户端,反向代理就是代理服务器。
还用,我们要只要80端口和443端口的区别,其实就是http和https区别:
http:超文本传输协议、TCP-80 端口
https:http 的安全版、TCP-443 端口
从 http →→ https 、简单讲、就是在 TCP 协议和 HTTP 协议之间再加个 SSL 协议
puma
Passenger是一个Rails应用服务的管理工具,可以统一管理Rails进程的数量、生命周期、请求队列等等。nginx启动的时候会启动Passenger,passenger根据配置引导rails应用,rails启动的时候会调用bundle加载rails应用所需的gems。在我们项目里面用到的puma是一款专门针对rails的并发服务器,相对于passenger,puma可配置面更广,而且性能比passenger更高。