<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>gamefu (gamefu)</title>
    <link>https://ruby-china.org/gamefu</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[深圳] 腾讯招聘高级后台工程师 2 人 (20-40k)</title>
      <description>&lt;h2 id="岗位职责："&gt;岗位职责：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;负责腾讯课堂、企鹅辅导等在线教育产品的后台开发；&lt;/li&gt;
&lt;li&gt;负责平台业务的开发和维护；&lt;/li&gt;
&lt;li&gt;负责部门相关业务的后台开发及维护。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="岗位要求："&gt;岗位要求：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;本科以上学历，计算机相关专业；&lt;/li&gt;
&lt;li&gt;具备 Unix/Linux 下 C/C++ , golang 2 年以上开发经验，熟悉常用的数据结构、算法；&lt;/li&gt;
&lt;li&gt;精通 TCP/IP 协议，进程间通讯编程，熟悉 Unix/Linux 下常用架构设计方法；&lt;/li&gt;
&lt;li&gt;熟悉 Unix/Linux 操作系统原理、常用工具，熟悉 Mysql/Oracle 等数据库管理、开发，SQL 调优；&lt;/li&gt;
&lt;li&gt;全面的软件知识结构 (操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全)；&lt;/li&gt;
&lt;li&gt;具备良好的分析解决问题能力，能独立承担任务和有系统进度把控能力；&lt;/li&gt;
&lt;li&gt;责任心强，良好的对外沟通和团队协作能力；&lt;/li&gt;
&lt;li&gt;有大容量通信系统开发经验者优先。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;补充下说明现在团队已经慢慢开始全面转向 golang，但岗位对语言没有硬性要求&lt;/p&gt;
&lt;h2 id="工作地点"&gt;工作地点&lt;/h2&gt;
&lt;p&gt;深圳万利达科技大厦&lt;/p&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;内推 简历直达面试官&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;邮箱：gamefu@tencent.com&lt;/li&gt;
&lt;li&gt;微信：&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/7721a155-400e-4103-9f32-8890c0d54646.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>gamefu</author>
      <pubDate>Thu, 22 Aug 2019 10:59:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/38964</link>
      <guid>https://ruby-china.org/topics/38964</guid>
    </item>
    <item>
      <title>收两张 RubyConf China 2015 门票, 好想去！！！</title>
      <description>&lt;p&gt;今年错过 rubyconf china 出售门票的时间了 T^T，好想去呀，有没有有事临时去不了的朋友愿意转让两张票，有意者联系我 qq223328084，万分感谢啊&lt;/p&gt;</description>
      <author>gamefu</author>
      <pubDate>Thu, 24 Sep 2015 20:04:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/27469</link>
      <guid>https://ruby-china.org/topics/27469</guid>
    </item>
    <item>
      <title> 在 CoreOS 上用 Docker 部署 Rails 应用</title>
      <description>&lt;h3 id="coreos上的配置"&gt;coreos 上的配置&lt;/h3&gt;
&lt;p&gt;coreos 没有包管理工具，也不鼓励使用包管理工具来解决依赖关系，他提倡使用 docker 等容易来解决管理以来，要想搭建一个 rails 的环境，我们需要创建一个能满足我们需求的镜像。docker 原则上是一个服务就需要一个镜像，不同的服务之间通讯需要使用 docker 自己提供的通讯方式，这个演示实例里，我们只依赖于一个数据库服务。首先我们需要创建我们整个 rails 运行环境所需要的所有服务镜像&lt;/p&gt;

&lt;p&gt;postgres 数据库的官方镜像&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker pull postgres

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们还需要运行 rails 的 web 服务器镜像，我选择的是 passenger 的官方镜像&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker pull phusion/passenger-ruby22

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails 运行需要 postgres 数据库，因此，我们需要创建一个 postgres 容器，同时给我们创建的容器一个名称&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt; gamePostgres &lt;span class="nt"&gt;-d&lt;/span&gt; postgres

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来我们在 coreos 上的配置就配置好了&lt;/p&gt;
&lt;h3 id="Dockerfile"&gt;Dockerfile&lt;/h3&gt;
&lt;p&gt;将这个 Dockerfile 加入我们的 rails 项目下&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# 以phusion/passenger-ruby22镜像为基础&lt;/span&gt;
&lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;phusion&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passenger&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ruby22&lt;/span&gt;

&lt;span class="c1"&gt;# 设置时区&lt;/span&gt;
&lt;span class="no"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Asia/Shanghai"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sr"&gt;/etc/&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;span class="no"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;reconfigure&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;noninteractive&lt;/span&gt; &lt;span class="n"&gt;tzdata&lt;/span&gt;

&lt;span class="c1"&gt;#设置当前环境变量&lt;/span&gt;
&lt;span class="no"&gt;ENV&lt;/span&gt; &lt;span class="no"&gt;HOME&lt;/span&gt; &lt;span class="sr"&gt;/root
#设置rails环境为生产环境
ENV RAILS_ENV production

CMD ["/s&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;my_init&lt;/span&gt;&lt;span class="s2"&gt;"]

# 缓存gem，如果Gemfil没有改变将不会从源直接下载
WORKDIR /tmp
ADD ./Gemfile Gemfile
ADD ./Gemfile.lock Gemfile.lock
RUN bundle install

#启动nginx
RUN rm -f /etc/service/nginx/down
#配置nginx
RUN rm /etc/nginx/sites-enabled/default
ADD nginx.conf /etc/nginx/sites-enabled/webapp.conf

#添加环境文件
ADD nginx-env.conf /etc/nginx/main.d/nginx-env.conf

#增加初始化运行脚本
RUN mkdir -p /etc/my_init.d
#Migrate
ADD migrate.sh /etc/my_init.d/migrate.sh
RUN chmod +x /etc/my_init.d/migrate.sh

# 创建项目目录
RUN mkdir /home/app/webapp
# 将项目文件加入项目目录
ADD . /home/app/webapp

WORKDIR /home/app/webapp
# 编译静态文件
RUN rake assets:precompile

# 清楚产生的缓存文件
RUN apt-get clean &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 开放80端口
EXPOSE 80


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于 passenger 镜像是建立在 nginx 的基础上地，所以我们需要配置 nginx.同时在跟目录创建 nginx.conf.&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;#指定项目根目录&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/app/webapp/public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# 开启passenger&lt;/span&gt;
    &lt;span class="kn"&gt;passenger_enabled&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;passenger_user&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;20M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;passenger_max_request_queue_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 docker 中服务通讯必须在容器之间暴露端口，因此我们需要添加 env 文件来暴露各容器之间的端口，在项目根目录下创建 nginx-env.conf 文件&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# 暴露服务端口 这个示例中只有postgres服务，因此我们只需要暴露这个端口即可&lt;/span&gt;
&lt;span class="k"&gt;env&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PORT_5432_TCP_ADDR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;env&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PORT_5432_TCP_PORT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，我们配置一下.gitignore，在.gitignore 文件里加上，因为服务器的数据库配置和本地数据库配置不一样&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/config/database.yml

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时 copy 一份 database.yml，将其改名为 database.yml.sample&lt;/p&gt;
&lt;h3 id="在coreos上部署"&gt;在 coreos 上部署&lt;/h3&gt;
&lt;p&gt;coreos 虽然默认没有带包管理工具，但是安装了 git 之类的常用工具，因此，我们可以使用 git 部署我们的项目，将我们的项目上传到 github，然后在 coreos 的某个目录将整个项目拉下来。我选择的是/root/apps 目录&lt;/p&gt;

&lt;p&gt;拉取项目后，我们首先需要更改的是数据库配置文件 database.yml&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default&lt;/span&gt;
  &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
  &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unicode&lt;/span&gt;
  &lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# 通过暴露出来的地址和端口配置数据库&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV['POSTGRES_PORT_5432_TCP_ADDR'] %&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV['POSTGRES_PORT_5432_TCP_PORT'] %&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;development&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sample_dev&lt;/span&gt;

&lt;span class="c1"&gt;# Warning: The database defined as "test" will be erased and&lt;/span&gt;
&lt;span class="c1"&gt;# re-generated from your development database when you run "rake".&lt;/span&gt;
&lt;span class="c1"&gt;# Do not set this db to the same as development or production.&lt;/span&gt;
&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sample_test&lt;/span&gt;

&lt;span class="na"&gt;production&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sample_production&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后进入项目根目录，通过 Dockfile 构建一个镜像，并且给自己创建的镜像一个名称&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; game/ruby_sample &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以后的每一次更改项目内容都需要重新构建一个新的镜像，如果你是第一次生成容器可以不用运行下面这条命令，如果你之前已经创建过同名的容易就需要将其删除，如我之前这个容器名为 gameRuby_sample，那么我就需要将这个容器删除后重新创建&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; gameRuby_sample

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建新的容器，并且建立容器之间的通讯，监听服务器的 80 端口&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt; gameRuby_sample &lt;span class="nt"&gt;--link&lt;/span&gt; gamePostgres:postgres &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 game/ruby_sample

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进行到这里，一个完整的 rails 容器已经基本建立完成了。然而整个容器还缺乏一个很关键的部分没解决，就是运行 rails 程序的 migrate，由于，migrate 必须在整个容器建立完成之后才能运行，因此无法直接将其写在&lt;code&gt;Dockerfile&lt;/code&gt;内，只有当运行容器时运行，才能有效果。
passenger 是根据 ubuntu 镜像的基础上搭建的，也就是说，这个系统的启动流程跟 ubuntu 启动的流程是一样的，当 ubuntu 系统完成引导后，操作系统会去检查/etc/my_init.d/目录下的脚本，并且会运行，这样一来，只需把 migrate 的执行脚本放到这个目录下面，那么就会在镜像启动的时候运行 Migrate。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#增加初始化运行脚本&lt;/span&gt;
&lt;span class="no"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="sr"&gt;/etc/m&lt;/span&gt;&lt;span class="n"&gt;y_init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;
&lt;span class="c1"&gt;#Migrate&lt;/span&gt;
&lt;span class="no"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sh&lt;/span&gt; &lt;span class="sr"&gt;/etc/m&lt;/span&gt;&lt;span class="n"&gt;y_init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sh&lt;/span&gt;
&lt;span class="no"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="sr"&gt;/etc/m&lt;/span&gt;&lt;span class="n"&gt;y_init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sh&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面是 migrate 运行脚本&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"start migrate"&lt;/span&gt;
bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cd /home/app/webapp; bundle exec rake db:migrate'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"migrate finshed"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要运行 docker run 后，运行&lt;code&gt;docker logs -f 镜像名&lt;/code&gt;，能看到&lt;code&gt;start migrate&lt;/code&gt;和&lt;code&gt;migrate finshed&lt;/code&gt;就说明镜像已经成功运行 migrate 了 &lt;/p&gt;

&lt;p&gt;这样一来基本的 rails 运行环境就搭建完成了&lt;/p&gt;</description>
      <author>gamefu</author>
      <pubDate>Wed, 05 Aug 2015 21:21:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/26787</link>
      <guid>https://ruby-china.org/topics/26787</guid>
    </item>
    <item>
      <title>CoreOS 中更改 Docker 镜像地址</title>
      <description>&lt;p&gt;由于&lt;code&gt;docker&lt;/code&gt;的不断成熟，docker 在实际生产环境中的应用已经得到越来越多的印证，因此，公司项目想从原来的 Mina 部署转为&lt;code&gt;docker&lt;/code&gt;部署，但是 docker 仓库由于在国内没有 cdn，导致镜像下载速度无比的缓慢，所以决定换成国内镜像，由于操作系统是使用&lt;code&gt;coreos&lt;/code&gt;，无论国内外资料都非常少，因此途中爬了很多坑，这篇文章是我爬坑的总结&lt;/p&gt;
&lt;h3 id="docker国内镜像"&gt;docker 国内镜像&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docker&lt;/code&gt;是目前炙手可热的云计算开源项目，随着 docker 不断发展，不久前，国内第一家基于&lt;code&gt;docker&lt;/code&gt;技术的一站式容器云平台 daocloud 正式推出了，同时也给国内广大 docker 爱好者带来了 docker 的免费国内镜像。前往 docker 的官网注册一个账号登录后就能得到一个免费的 docker 镜像地址，如&lt;a href="http://xxx.m.daocloud.io" rel="nofollow" target="_blank"&gt;http://xxx.m.daocloud.io&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="关于coreos"&gt;关于 coreos&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;coreos&lt;/code&gt;是一个高度精简的 linux 操作系统，将许多原本需要复杂人工操作或者第三方软件支持的功能在操作系统级别进行了实现，同时剔除了其他对于服务器系统非核心的软件，比如 GUI 和包管理器。&lt;code&gt;coreos&lt;/code&gt;并不鼓励用户将各种应用软件直接安装在操作系统之上，而是提倡将所有服务运行在单独的应用容器中，由应用容器提供应用所需要的基础功能环境。这种做法将操作系统和应用程序的职责做了更彻底的分离，降低操作系统和应用程序的耦合度，使运行这些服务器的公司可以更快速、更廉价地更新自己的线上业务。
正式这种特性，&lt;code&gt;coreos&lt;/code&gt;可以说十分适合用来部署&lt;code&gt;docker&lt;/code&gt;服务&lt;/p&gt;
&lt;h3 id="更改docker镜像地址"&gt;更改 docker 镜像地址&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docker&lt;/code&gt;在&lt;code&gt;coreos&lt;/code&gt;中是一个服务，在&lt;code&gt;coreos&lt;/code&gt;中没一个服务都由一个 unit 文件来定义，&lt;code&gt;docker&lt;/code&gt;的 unit 文件在&lt;code&gt;usr/lib/systemd/system/docker.service&lt;/code&gt;,我们需要将它拷贝出来将其放在 docker 服务启动时会加载的位置&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; /usr/lib/systemd/system/docker.service /etc/systemd/system

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开这种文件，我们会发现里面有一个更改 docker 镜像地址的关键环境变量&lt;code&gt;$DOCKER_OPTS&lt;/code&gt;，而更改镜像地址的本质就是更改&lt;code&gt;$DOCKER_OPTS&lt;/code&gt;的值。
这个环境变量的值是在&lt;code&gt;/run/flannel_docker_opts.env&lt;/code&gt;中设置的，如果你的系统里没有这个文件，就自己添加一个这个文件&lt;/p&gt;

&lt;p&gt;往这个文件里添加从 daocloud 上获取的镜像地址&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nv"&gt;DOCKER_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--registry-mirror=http://xxxx.m.daocloud.io"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加完成后，运行&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行 &lt;code&gt;ps aux&lt;/code&gt; 如果能看到&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
root      1725  0.6  1.7 221400 18328 ?        Ssl  15:27   0:00 docker &lt;span class="nt"&gt;--daemon&lt;/span&gt; &lt;span class="nt"&gt;--host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fd:// &lt;span class="nt"&gt;--registry-mirror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://xxx.m.daocloud

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么就大功告成了&lt;/p&gt;
&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;虽然整个配置流程看起来并不复杂，但是使用比较新的技术难免要爬坑，由于国内外资料都非常的少，导致爬坑异常的艰难，希望大家能节省爬过这个坑的时间。&lt;/p&gt;</description>
      <author>gamefu</author>
      <pubDate>Tue, 07 Jul 2015 00:28:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/26351</link>
      <guid>https://ruby-china.org/topics/26351</guid>
    </item>
    <item>
      <title>Ruby on Rails 部署方案 Nginx + Mina + Puma</title>
      <description>&lt;h2 id="搭建工具介绍"&gt;搭建工具介绍&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Ruby on Rails&lt;/code&gt;作为一款十分优秀的 web 开发框架，在当前 web 领域中慢慢占据了越来越重要，秉承 rails 快速开发的特点，很多快速部署 rails 的方案也越来越多。这篇文章中所选的方案是我个人认为十分优秀的部署方案。这套部署方案的结构是，&lt;code&gt;nginx&lt;/code&gt;作为反向代理服务器负责负载均衡，&lt;code&gt;mina&lt;/code&gt;作为自动化部署工具，&lt;code&gt;puma&lt;/code&gt;作为 rails 的 web 服务器&lt;/p&gt;
&lt;h3 id="nginx"&gt;nginx&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;nginx&lt;/code&gt;是一款优秀的代理服务器，其高效的性能已经得到了业界的广泛认可，相信作为 web 开发人员不会没听说过他的大名&lt;/p&gt;
&lt;h3 id="mina"&gt;mina&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mina&lt;/code&gt;是一款由 ruby 开发的自动化部署工具，其目的是为了简化每次 rails 代码提交时的部署，一键完成部署，杜绝了提交到 git 服务器后，又去服务器上 git pull 的情况&lt;/p&gt;
&lt;h3 id="puma"&gt;puma&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;puma&lt;/code&gt;是一款专门针对 rails 的并发服务器，相对于&lt;code&gt;passenger&lt;/code&gt;，&lt;code&gt;puma&lt;/code&gt;可配置面更广，而且性能比&lt;code&gt;passenger&lt;/code&gt;更高，是 rails web 服务器的不二之选&lt;/p&gt;
&lt;h2 id="部署前言"&gt;部署前言&lt;/h2&gt;
&lt;p&gt;由于这篇文章需要很多铺垫，包括 rails 的安装下载，git 的配置等等，需要读者自己去查阅资料或者查阅之前我写过的一些文章，如果期间有什么问题，请留言。。&lt;/p&gt;
&lt;h2 id="mina"&gt;mina&lt;/h2&gt;
&lt;p&gt;首先在你的 rails 项目的&lt;code&gt;Gemfile&lt;/code&gt;中加上&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="n"&gt;mina&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行&lt;code&gt;bundle&lt;/code&gt; 安装 &lt;code&gt;mina&lt;/code&gt;，接着在你的 rails 项目根目录初始化&lt;code&gt;mina&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mina init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是在你项目的 config 目录下会有一个&lt;code&gt;deploy.rb&lt;/code&gt;，配置&lt;code&gt;deploy.rb&lt;/code&gt;，列出重点部分，每一行的解释会附在代码的注释里&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="c1"&gt;#服务器地址,是使用ssh的方式登录服务器&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'root@192.168.0.103'&lt;/span&gt;
&lt;span class="c1"&gt;#服务器中项目部署位置&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/var/www/ruby_sample'&lt;/span&gt;
&lt;span class="c1"&gt;#git代码仓库&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/gameFu/ruby_sample.git'&lt;/span&gt;
&lt;span class="c1"&gt;#git分支&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:branch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'master'&lt;/span&gt;

&lt;span class="c1"&gt;# 中括号里的文件 会出现在服务器项目附录的shared文件夹中，这里加入了secrets.yml，环境密钥无需跟开发计算机一样&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:shared_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'config/database.yml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'config/secrets.yml'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 这个块里面的代码表示运行 mina setup时运行的命令&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:setup&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="c1"&gt;# 在服务器项目目录的shared中创建log文件夹&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/log"]&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[chmod g+rx,u+rwx "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/log"]&lt;/span&gt;

  &lt;span class="c1"&gt;# 在服务器项目目录的shared中创建config文件夹 下同&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/config"]&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[chmod g+rx,u+rwx "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/config"]&lt;/span&gt;

  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/config/database.yml"]&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/config/secrets.yml"]&lt;/span&gt;

  &lt;span class="c1"&gt;# puma.rb 配置puma必须得文件夹及文件&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/tmp/pids"]&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[chmod g+rx,u+rwx "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/tmp/pids"]&lt;/span&gt;

  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/tmp/sockets"]&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[chmod g+rx,u+rwx "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/tmp/sockets"]&lt;/span&gt;

  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/config/puma.rb"]&lt;/span&gt;
  &lt;span class="n"&gt;queue&lt;/span&gt;  &lt;span class="sx"&gt;%[echo "-----&amp;gt; Be sure to edit 'shared/config/puma.rb'."]&lt;/span&gt;

  &lt;span class="c1"&gt;# tmp/sockets/puma.state&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/tmp/sockets/puma.state"]&lt;/span&gt;
  &lt;span class="n"&gt;queue&lt;/span&gt;  &lt;span class="sx"&gt;%[echo "-----&amp;gt; Be sure to edit 'shared/tmp/sockets/puma.state'."]&lt;/span&gt;

  &lt;span class="c1"&gt;# log/puma.stdout.log&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/log/puma.stdout.log"]&lt;/span&gt;
  &lt;span class="n"&gt;queue&lt;/span&gt;  &lt;span class="sx"&gt;%[echo "-----&amp;gt; Be sure to edit 'shared/log/puma.stdout.log'."]&lt;/span&gt;

  &lt;span class="c1"&gt;# log/puma.stdout.log&lt;/span&gt;
  &lt;span class="n"&gt;queue!&lt;/span&gt; &lt;span class="sx"&gt;%[touch "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/log/puma.stderr.log"]&lt;/span&gt;
  &lt;span class="n"&gt;queue&lt;/span&gt;  &lt;span class="sx"&gt;%[echo "-----&amp;gt; Be sure to edit 'shared/log/puma.stderr.log'."]&lt;/span&gt;

  &lt;span class="n"&gt;queue&lt;/span&gt;  &lt;span class="sx"&gt;%[echo "-----&amp;gt; Be sure to edit '&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/config/database.yml'."]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#这个代码块表示运行 mina deploy时执行的命令&lt;/span&gt;
&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Deploys the current version to the server."&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:deploy&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="ss"&gt;:before_hook&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;deploy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;#重新拉git服务器上的最新版本，即使没有改变&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'git:clone'&lt;/span&gt;
    &lt;span class="c1"&gt;#重新设定shared_path位置&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'deploy:link_shared_paths'&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'bundle:install'&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'rails:db_migrate'&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'rails:assets_precompile'&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'deploy:cleanup'&lt;/span&gt;

    &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="ss"&gt;:launch&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="s2"&gt;"mkdir -p &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/"&lt;/span&gt;
      &lt;span class="c1"&gt;# queue "chown -R www-data #{deploy_to}"&lt;/span&gt;
      &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="s2"&gt;"touch &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;deploy_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/restart.txt"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来 mina 的基本配置就完成，接下来只要将你开发环境的项目上传到 git 服务器，然后运行下面的命令就完成了&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mina deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成部署后，你就可以在指定的服务器目录下看到你的项目，目录结构如下&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;current -当前版本目录也就是项目目录&lt;/li&gt;
&lt;li&gt;last_version -版本号&lt;/li&gt;
&lt;li&gt;releases/ -过去的版本&lt;/li&gt;
&lt;li&gt;scm/&lt;/li&gt;
&lt;li&gt;shared/ 先前 shared_path 所设定另外拉出来的文件都在这里&lt;/li&gt;
&lt;li&gt;tmp/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里需要注意的几点
1.shared_path 里面的文件不仅仅是表示这些文件会在服务器目录中出现在另外的目录里，也表示这些文件或者目录不会受到 git 版本库的控制，也就是说这些文件的配置必须在你服务器中手动去配置，这两个文件包括 database.yml 和 secrets.yml，在 shared/config 目录下
2.针对 deploy 最好在服务器创建一个使用者，并针对他创建一个 ssh authorized_keys，这里直接使用了 root 身份，参考&lt;a href="http://segmentfault.com/a/1190000002911599" rel="nofollow" target="_blank" title=""&gt;centos7 服务器部署 ssh 证书授权登录&lt;/a&gt;，这样做能避免每次部署的时候都需要输入服务器账号密码&lt;/p&gt;
&lt;h3 id="可能会遇到的问题"&gt;可能会遇到的问题&lt;/h3&gt;
&lt;p&gt;由于生产环境一般会搭配类似于&lt;code&gt;postgresql&lt;/code&gt;等成熟数据库，这里我就举出一个搭建&lt;code&gt;postgresql&lt;/code&gt;，首先是启动数据库时（centos 7 下），如果遇到问题请使用下面的命令就能看到详细的错误信息&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl status postgresql-9.4.service -l 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在跑&lt;code&gt;mina deploy&lt;/code&gt;时可能会报类似于这样的一个错误&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从错误信息上能很明显的看出是因为没有安装 pg 这个包导致的，但是有一种情况是明明在项目的&lt;code&gt;Gemfile&lt;/code&gt;上写上了 pg 但还是跑不过，造成这个的原因，可能是由于你的服务器环境缺少了 pg 的头文件导致的，如果是在 centos 下，只需要执行下面命令就能解决&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install postgresql-libs
yum install postgresql-devel
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Puma"&gt;Puma&lt;/h3&gt;
&lt;p&gt;首先在你的&lt;code&gt;Gemfile&lt;/code&gt;里加上&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="n"&gt;puma&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 config 目录下手动创建一个&lt;code&gt;puma.rb&lt;/code&gt;文件，配置&lt;code&gt;puma.rb&lt;/code&gt;文件&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="c1"&gt;#!/usr/bin/env puma&lt;/span&gt;

&lt;span class="c1"&gt;#rails的运行环境&lt;/span&gt;
&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt;
&lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;
&lt;span class="n"&gt;workers&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

&lt;span class="c1"&gt;#项目名&lt;/span&gt;
&lt;span class="n"&gt;app_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ruby_sample"&lt;/span&gt;
&lt;span class="c1"&gt;#项目路径&lt;/span&gt;
&lt;span class="n"&gt;application_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/var/www/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;#这里一定要配置为项目路径下地current&lt;/span&gt;
&lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/current"&lt;/span&gt;

&lt;span class="c1"&gt;#下面都是 puma的配置项&lt;/span&gt;
&lt;span class="n"&gt;pidfile&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/tmp/pids/puma.pid"&lt;/span&gt;
&lt;span class="n"&gt;state_path&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/tmp/sockets/puma.state"&lt;/span&gt;
&lt;span class="n"&gt;stdout_redirect&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/log/puma.stdout.log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/log/puma.stderr.log"&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt; &lt;span class="s2"&gt;"unix://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/tmp/sockets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sock"&lt;/span&gt;
&lt;span class="n"&gt;activate_control_app&lt;/span&gt; &lt;span class="s2"&gt;"unix://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;application_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/shared/tmp/sockets/pumactl.sock"&lt;/span&gt;

&lt;span class="c1"&gt;#后台运行&lt;/span&gt;
&lt;span class="n"&gt;daemonize&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;on_restart&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'On restart...'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;preload_app!&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里需要注意的地方&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;threads&lt;/code&gt; - &lt;code&gt;puma&lt;/code&gt;的线程数，第一个参数是最小的线程数，第二个参数是最大线程数&lt;/li&gt;
&lt;li&gt;bind - 这个指定的是&lt;code&gt;puma&lt;/code&gt;运行时产生的&lt;code&gt;socket&lt;/code&gt;，后面&lt;code&gt;nginx&lt;/code&gt;会用到&lt;/li&gt;
&lt;li&gt;这里所有对应的目录是在&lt;code&gt;deploy&lt;/code&gt;配置中配置的，如果需要更改配置目录，&lt;code&gt;deploy.rb&lt;/code&gt;也需要相应的更改&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Nginx"&gt;Nginx&lt;/h2&gt;
&lt;p&gt;下载安装&lt;code&gt;nginx&lt;/code&gt;后，打开&lt;code&gt;nginx&lt;/code&gt;的配置文件&lt;code&gt;nginx.conf&lt;/code&gt;进行配置&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;error_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/error.log&lt;/span&gt; &lt;span class="s"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;pid&lt;/span&gt;        &lt;span class="n"&gt;/var/run/nginx.pid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;worker_connections&lt;/span&gt;  &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt;       &lt;span class="n"&gt;/etc/nginx/mime.types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;default_type&lt;/span&gt;  &lt;span class="nc"&gt;application/octet-stream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;log_format&lt;/span&gt;  &lt;span class="s"&gt;main&lt;/span&gt;  &lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt; &lt;span class="s"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$remote_user&lt;/span&gt; &lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$time_local&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
                          &lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="nv"&gt;$body_bytes_sent&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$http_referer&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
                          &lt;span class="s"&gt;'"&lt;/span&gt;&lt;span class="nv"&gt;$http_user_agent&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$http_x_forwarded_for&lt;/span&gt;&lt;span class="s"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;access_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/access.log&lt;/span&gt;  &lt;span class="s"&gt;main&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;sendfile&lt;/span&gt;        &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;#tcp_nopush     on;&lt;/span&gt;

        &lt;span class="kn"&gt;keepalive_timeout&lt;/span&gt;  &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;#gzip  on;&lt;/span&gt;

        &lt;span class="c1"&gt;#include /etc/nginx/conf.d/*.conf;&lt;/span&gt;
        &lt;span class="kn"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="s"&gt;unix:///var/www/ruby_sample/shared/tmp/sockets/ruby_sample.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your.server.domain.ip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# change to match your URL&lt;/span&gt;
            &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/ruby_sample/current/public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# I assume your app is located at this location&lt;/span&gt;

            &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://deploy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# match the name of upstream directive which is defined above&lt;/span&gt;
                &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^/assets/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;# Per RFC2616 - 1 year maximum expiry&lt;/span&gt;
                &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;1y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                        &lt;span class="c1"&gt;# Some browsers still send conditional-GET requests if there's a&lt;/span&gt;
                &lt;span class="c1"&gt;# Last-Modified header or an ETag header even if they haven't&lt;/span&gt;
                &lt;span class="c1"&gt;# reached the expiry date sent in the Expires header.&lt;/span&gt;
                &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Last-Modified&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;ETag&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kn"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里只需要注意的是&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;upstream 中 server 要配置成你在 puma 中 bind 的 socket 就行了&lt;/li&gt;
&lt;li&gt;root 要设置成你服务器项目的根目录，也就是&lt;code&gt;puma.rb&lt;/code&gt;中的 &lt;code&gt;directory&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下里只需要重启 nginx 服务器，整个 rails 的环境就搭建完成了&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
nginx -s reload

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果完成了配置后访问站点是 504，那么可能是两种情况，一是服务器防火墙问题，二是 rails 环境密钥的问题，请在&lt;a href="http://segmentfault.com/a/1190000002911605" rel="nofollow" target="_blank" title=""&gt;使用 passenger 在 Centos7 部署 nginx+Ruby on Rails&lt;/a&gt;中寻找答案&lt;/p&gt;</description>
      <author>gamefu</author>
      <pubDate>Mon, 22 Jun 2015 21:53:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/26132</link>
      <guid>https://ruby-china.org/topics/26132</guid>
    </item>
  </channel>
</rss>
