Blog Archives

Rails

bara-基于Nginx和Dokcer的单机灰度测试环境原型

什么是bara bara,即日语的バラ,也就是玫瑰。 bara是一个基于Nignx和Docker的多版本程序同时在线的简易测试环境,只能单机使用,并且只是一个PoC而已,仅供参考。 简单来说,就是使用Nginx做反向代理,代理到后面的Docker容器,bara能动态创建Nignx配置文件,重启Nginx;而浏览器可以通过设置特殊header(默认为一个字母v)来通过Nginx代理,访问指定的后面的Docker容器。 bara概览 bara架构很简单,一个Nginx服务器运行在host上,画图如下: 其背后用到的主要原理就是Nginx的proxy_pass以及map功能,Nginx会根据浏览器设置的自定义header(v)的值,根据map的映射关系,找到合适的upstream代理过去而已。 而bara,就是发挥了Nginx的强大功能,和Docker的灵活轻便,从而能在一台主机上,跑n个版本的应用程序,以方便测试。 bara还有一个概念就是Nginx的配置文件模板,Nginx的配置文件是根据这个模板动态创建的,这个模板如果有{{upstream}}占位符,则会被bara系统自动根据运行中的容器来替换为一个upstream列表。 bara的代码在: https://github.com/liubin/bara。 下面,我们就来看看如何使用。 开始使用 启动前的配置 首先,需要修改config/initializers/docker.rb和 config/initializers/nginx.rb 这两个配置文件,指定如何连接Docker daemon和Nginx的配置文件位置以及nginx可执行程序的位置。 创建Nignx配置文件模板 Nginx配置文件模板是动态创建Nginx配置文件的模板,可以根据情况,准备多个模板。在Nginx服务页面,创建Nginx配置文件的时候,会基于状态为active的模板来创建Nginx的配置文件。 Nginx配置文件模板列表页面: 编辑模板页面: 拉取镜像到该host bara还提供了简单的镜像管理功能:列表,拉取,删除。如果镜像太大,尽量避免在线操作,还是直接在console中使用docker pull来拉取。 这是镜像列表页面: 启动容器 容器列表页面: 启动容器页面: 目前比较简单,只有一个容器名和CMD参数可以填写,默认会以-d和-P的形式启动容器。 生成Nginx配置文件和重启Nginx服务 在Nignx服务页面,可以完成查看当前Nginx配置文件内容,在线修改,以及重启Nginx服务器等。 这是一个Nignx配置文件例子: 设置客户端header 这里我使用了Chrome的插件ModHeader,这个插件,可以根据指定的url规则,设置自定一个header,这里我们添加了v这个header。ModHeader设置页面如下: 如果没有设置header,则Nginx会使用map中default的值作为upstream,目前为取得容器列表后的最后一个容器。 限制 目前bara只是一个原型,有很多不足,可能有人会觉得它 单机 使用-P

Posted in DevOps, Docker, Rails, Tech Tagged with: ,

【翻译】基于Docker的Rails集群+Ruby负载均衡代理

原作者:Muriel Salvan 原文地址:http://x-aeon.com/wp/2014/02/06/rails-cluster-with-ruby-load-balancer-using-docker/ 翻译:liubin (http://liubin.org/) 最近我发现了 Docker 这个东西。 并且我在 2014年2月的rivierarb的meet up 上做了一次演讲,资料可以在slideshare上下载(文档下载地址 https://speakerdeck.com/murielsalvan/ruby-and-docker-on-rails slideshare:http://www.slideshare.net/MurielSalvan/ruby-and-docker-on-rails,需翻墙)。 我打算做一个比较酷的使用Docker的例子:一个Rails集群,以及集群前面的一个Ruby负载均衡服务。我曾想过使用若干不同的机器(每台机器都有自己的IP地址和端口)来运行同样的Rails服务,然后在外部配置一台负载均衡的代理服务器,在各Railf服务之间进行请求分配。 不过使用Docker的话,在一台机器上就可以模拟集群环境了。 这里我们将演示一下如何来创建这个集群环境。 你可以从我的Github项目上下载所有这次测试的源代码。 创建Docker镜像 首先我将创建两个Docker镜像,1个用来运行Rails服务,1个运行Ruby代理服务。 1. 首先我制作了一个可信Docker构建(Trusted Docker build),构建脚本也在我的Github上( Github project docker-ruby )。使用这个构建脚本创建的镜像为 murielsalvan/ruby ,它基于Ubuntu Precise,并且安装了Ruby 2.1.0p0。 docker pull murielsalvan/ruby 2. 接着我基于murielsalvan/ruby来创建一个Docker容器,用来执行一个bash shell,然后在里面安装Rails并创建一个Rails应用程序。这个应用程序只有一页,它将打印出它所在服务器的主机名和IP地址(集群里的每台Rails服务都有不同的主机名和IP地址)。你可以从这里查看这个测试程序的源代码。这步的最后,我将把这个容器提交,生成一个新的镜像,并命名为murielsalvan/server,这个镜像执行的时候,会启动Rails服务,并监听3000端口号(容器内的端口号)。 docker run -t -i murielsalvan/ruby bash docker commit

Posted in go, Rails, Ruby, Tech, Web Tagged with: , ,

Ruby中生成QR Code(二维码)那些事

在程序中要想生成二维码,除了各种网络服务,还可以利用各种本地library。 在Ruby下有很多,这里只简单介绍三个:qrencoder,rqrencoder-magick和rqrencoder,rqrcode_png。 实际上这三个库,都需要qrencoder这个东西。 1. 安装qrencoder 我用的homebrew,安装如下: liubin:eventbox liubin$ brew install qrencode ==> Downloading http://fukuchi.org/works/qrencode/qrencode-3.4.2.tar.gz ######################################################################## 100.0% ==> ./configure –prefix=/usr/local/Cellar/qrencode/3.4.2 ==> make ==> make install /usr/local/Cellar/qrencode/3.4.2: 11 files, 196K, built in 17 second 2. 安装qrencoder(Ruby GEM) qrencoder主页:https://github.com/harrisj/qrencoder 这是对一个开源库的C扩展,当然主要是为了速度。 代码最后更新时间大概在两年之前。 安装qrencoder的话需要指定额外的include和lib路径,否则出错。 checking

Posted in Rails, Ruby, Tech Tagged with: , , , , , ,

COOKPAD所使用的技术 — 基础设施篇

序: 本系列文章主要基于日本技术评论社的杂志的《WEB+DB Press》(总)第66卷(2012年1月25日发行,数据有点老,2年了。)的专题“COOKPAD开发Know How大公开”整理而成,部分数据可能会根据网上能搜集到的信息加以修改。 本特辑主要分为5部分,分别是: 1. 严守200毫秒 — 基础设施篇 主要介绍采用AWS,图像分发、处理,异步加载,缓存等内容。终极任务:确保服务器响应时间在200毫秒之内。 2. 大规模项目快速开发流程 TDD(测试驱动),原型法,频繁发布 3. 以用户为中心的开发 model user,用户访谈,EOGS 4. 高效的智能机应用开发 如何选择App和Web?自己独自的库,code snippet 5. 跨公司的团队氛围 DevOps、全部门工程师体制、AARRR指标 本文主要是第一章,基础设施,也就是infrastructure。 COOKPAD是什么公司? COOKPAD网站是1998年上线的,当然,那时还没有Rails。2005年曾经一度尝试过使用过Rails,但是没有成功。直到2008年后,才开始逐渐的转移到Rails。我曾在Ruby Kaigi 2007上见过他们的演讲,当时还在招聘Rails工程师。直到现在,每次Ruby或者Rails的各种会议,都有他们招聘的身影。 选择Rails的原因 当初选择Rails主要基于以下两点: 1. DRY,编写风格良好的代码,利于复用。 2. 框架本身鼓励测试。 基础架构 系统工程师有5人,架构也很普通:反向代理+应用服务器+数据库。具体来说如下: ■ 负载均衡 使用了Amazon的ELB(Elastic

Posted in Rails, Ruby, Tech Tagged with: , , , , ,

使用Vagrant安装rails环境(rails-dev-box)

1. 什么是Vagrant 简单来说,Vagrant是一个虚拟机管理软件,你可以使用它脱离虚拟机容器(类似VirtualBox之类的软件)来管理(启动、停止、配置等)虚拟机(镜像文件)。使用它,你可以快速的进行在干净的环境下进行测试,部署等。(有点类似Docker,不过我感觉Docker比传统的虚拟机更高一层,灵活性更高,效率也会高很多。) 2. 安装 2.1. 安装VirtualBox 首先,需要安装VirtualBox,这个不多说,从官方(https://www.virtualbox.org/wiki/Downloads )下载即可。 我下载的VirtualBox-4.3.6-91406-OSX.dmg有118.6M。 除了Mac版的,还有Windows和Linux,以及Solaris版本的。 2.2. 安装Vagrant 接着,安装Vagrant。 从官方选择一个(100%的人会选择最新版吧)版本下载: http://downloads.vagrantup.com/ 我下的Vagrant-1.4.2.dmg有33.9M 2.3. 安装rails-dev-box rails-dev-box(https://github.com/rails/rails-dev-box )是一个为了开发Rails 本身而准备的环境,而不是为了开发普通的Rails应用程序。 安装方法见项目主页的说明,基本就是这样: $ git clone https://github.com/rails/rails-dev-box.git Cloning into ‘rails-dev-box’… remote: Reusing existing pack: 275, done. remote: Counting objects: 1, done. remote:

Posted in Rails, Ruby, Tech Tagged with: , ,

ActiveRecord里不需要对应表的Model类

有的时候我们有这种需求,要从很多表中各取出几个字段,作为一个记录类型显示。这时候就不能简单的建一个Model类来查询了。 可以参考下面的方法实现。不多说,直接上代码。 下面是使用的例子:

Posted in Rails, Ruby Tagged with: , , , , ,

Octokit-GithubAPI的官方Ruby实现

1.什么是Octokit Octokit是Github API的客户端实现,主要有两个版本,一个Ruby的,一个Object C的。之前这个库是由 Wynn Netherland 和 Adam Stacoviak维护的,2013年5月份,变为Github官方维护了,可以参考后面的链接。所以说,如果用Ruby语言的话,使用Octokit应该是不二之选了。 2. 在Ruby中使用Octokit 1. gem install octokit 如果是Rails的话,在Gemfile里添加gem octokit即可。 2. 测试程序 这里我们简单使用如下程序测试: 简单来说Github的API还是比较容易上手,而且功能比较全,比如能取得所有branch的信息,还能根据commit时间和author等来取得特定的提交信息,这个还是非常方便的。当然,我也只做了如此的测试而已。 3. 执行 首先在命令行下设置用户名和token。Github的API虽然用了Oauth,但是好像并没有secret,所以需要用户米和token两个参数。当然也有用户名和password的认证方法,但是一般来说如果是第三方程序,一般不会采用保存用户密码的策略。 $ export GITHUB_LOGIN=liubin0329 $ export GITHUB_TOKEN=18ed ./test.rb 上述代码可以从这里取得: https://github.com/liubin0329/for-github-api-test 官方信息: Ruby 版:https://github.com/octokit/octokit.rb octokit主页: http://octokit.github.io/ Github 官方release

Posted in Rails, Ruby, Tech, Web Tagged with: , , , , ,

Rails 4的一些新功能

总体 1. 支持Ruby 2.0 不支持Ruby1.8系了,最低也得1.9.3。 2. 动态查找器没有了 这个东西太灵活了,代码可能少敲两个字母,外人看来容易引起迷惑。 原来是 find_by_name ‘aaa’ 现在是 find_by name:’aaa’ 3. routing里禁止了裸match 即如果用match的话就必须给:via选项。 否则的话默认开启了GET和POST等,容易导致CSRF攻击。 请直接用协议,比如 post ‘controller/action’ => ‘controller#action’ 4. 增加concerns目录 为了解决业务逻辑无处可写的窘境,在controller和model各添加了标准的concerns目录,这里的文件都是autoload的。 5. 用bin目录代替script目录 不多说,rails,rake,bundle都放这里。 6. 可以在浏览器上浏览route设置。 之前需要通过rake routes命令,现在可以在浏览器通过路径/rails/info/routes来确认了。 Modle相关 7. 增加where.not 如何在sql里查找不属于某个人的东西? where name <>

Posted in Rails, Ruby, Web Tagged with: , , , , ,

在Rails下通过Google API Client访问Google Calendar接口

本文主要介绍通过使用Google API Client来在Rails应用里来访问Google Calendar接口来访问日程信息。 本文的主要代码可以从这里下载 。 1. 在Google网站创建应用程序 在Google API Console创建应用: a. 打开网址https://code.google.com/apis/console b. 点击左边API Access 菜单 c. 在API Access里面(右边)创建一个Cliend ID,注意Application Type选择Web Application 最主要的是确保callback地址正确,本例是 http://localhost:3000/gcalendar/callback,基本上这样就可以。如果调试的时候出现错误,可根据错误信息酌情修改API设置。 2. 在本地实现API调用 在服务端设置好之后,就可以在自己机器上实现API的调用代码了。 2.1. 安装 Google API Client 在工程根目录下编辑Gemfile,加入: gem ‘google-api-client’ 然后执行: bundle install 2.2.

Posted in Rails, Web

使用omniauth-bitbucket和bitbucket.org做帐号连接

1. 安装omniauth-bitbucket 首先新建一个rails的工程,具体过程就不说了,然后编辑Gemfile 其中,bitbucket_rest_api是bitbucket API的Ruby包装,这里如果不写git源的话,在我Ruby2.0+Rails4的情况下会导致hashie依赖错误。 omniauth-bitbucket是omniauth的bitbucket实现。 值得一提的是,omniauth-bitbucket 是一个杭州的工程师写的,具体可以参考其github主页。 编辑完Gemfile之后,就可以执行bundle install了。 2. 使用omniauth-bitbucket和bitbucket 2.1. 设置oauth 的provider 编辑config/initializers/omniauth.rb文件 2.2. 设置oauth认证的routing规则 编辑routes.rb 这一句,同时生成了/auth/:provider这个url,在本例里,即”/auth/bitbucket”。用户访问这个url,会立即被导向provider的认证授权页面。而授权后的callback页面,就是上面的match规则指定的url。 关于oauth认证相关的东西,代码其是很少。 2.3. 处理callback 在上面设置的callback方法里,就可以处理服务端返回的授权token了。 直接从request里即可取得auth情报,这个auth是一个AuthHash类的实例,其中最重要的信息应该就是用户的access token和secret了,可以通过: 从request里取得的auth情报,就可以做各种处理了,比如保存到数据库之类的。 现在就可以开始测试了,可以设置一个页面,里面有指向/auth/bitbucket的连接,或者直接在浏览器输入/auth/bitbucket。 2.4. 使用BitBucket 有了auth信息,就可以生产BitBucket的实例并使用了: 具体的BitBucket类和方法请参考相关Doc,也可以通过irb来确认: 3. 其它 如果不喜欢omniauth的url风格,可以在初始化的时候自己定制:

Posted in Rails, Web Tagged with: , ,

无觅相关文章插件,快速提升流量