<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>a0nqm (CC)</title>
    <link>https://ruby-china.org/a0nqm</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>在 Staging 环境中部署 ActionCable 遇到的坑</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;现在公司项目里加入了 ActionCable 组件，在本地环境中用 async 的方法能够正常启动；后来我在 Staging 环境中测试总是失败，刚刚解决了这个问题，因此发篇帖子记录一下。自己对其中内容有不理解的地方，社区各位大神也可以帮忙解答一下。
接下来，等功能开发完毕，会在配有 TLS 的正式服务上部署，如果有新的坑我会来更新。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="Rails中的最基本配置"&gt;Rails 中的最基本配置&lt;/h3&gt;
&lt;p&gt;在 Rails 中配置 ActionCable 并不难，只需要配置三部分：&lt;code&gt;cable.yml&lt;/code&gt;，&lt;code&gt;staging.rb&lt;/code&gt;，&lt;code&gt;routes.rb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/cable.yml&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;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;async&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;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;async&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;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis://localhost:6379/3&lt;/span&gt;

&lt;span class="na"&gt;staging&lt;/span&gt;&lt;span class="pi"&gt;:&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;redis&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis://localhost:6379/3&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/environments/staging.rb&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ws://staging.xxx.cn/cable'&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allowed_request_origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'http://staging.xxx.cn'&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/routes.rb&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="n"&gt;mount&lt;/span&gt; &lt;span class="no"&gt;ActionCable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'/cable'&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果在 development 环境中，仅仅将&lt;code&gt;adapter&lt;/code&gt;配置为&lt;code&gt;async&lt;/code&gt;即可在本机上完成 ActionCable 的基本配置。&lt;/p&gt;
&lt;h3 id="Staging环境中的配置"&gt;Staging 环境中的配置&lt;/h3&gt;
&lt;p&gt;仅凭以上配置，在配置好 Nginx 和 Puma 的 Staging 环境中部署，会遇到一个 Error：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;页面中 Console 里的表现是&lt;code&gt;/cable&lt;/code&gt;报 404。&lt;/p&gt;

&lt;p&gt;查过很多方法之后，最终在网站的 nginx 配置文件里加上以下内容，问题得到解决：&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/cable&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://xxx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&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-Proto&lt;/span&gt; &lt;span class="s"&gt;http&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;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_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;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&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;Connection&lt;/span&gt; &lt;span class="s"&gt;"Upgrade"&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-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&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;h3 id="本机development环境能配置接入redis服务器么？"&gt;本机 development 环境能配置接入 redis 服务器么？&lt;/h3&gt;
&lt;p&gt;目前尝试的结果是：&lt;strong&gt;不能&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;本机开发环境不配置 Nginx，所有请求都走 Rack，因此理论上需要在&lt;code&gt;config/development.rb&lt;/code&gt;中写出与以上 Nginx 配置作用相同的 Rack 配置，实践上我还没写出来，然而除非做研究学习否则也没有必要这样做。（如果有人感兴趣，可以尝试）&lt;/p&gt;

&lt;p&gt;就先分享这么多。&lt;/p&gt;</description>
      <author>a0nqm</author>
      <pubDate>Tue, 14 Mar 2017 12:49:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/32526</link>
      <guid>https://ruby-china.org/topics/32526</guid>
    </item>
    <item>
      <title>如何评价这样一位开发者？</title>
      <description>&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nil
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>a0nqm</author>
      <pubDate>Sun, 12 Mar 2017 15:22:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/32510</link>
      <guid>https://ruby-china.org/topics/32510</guid>
    </item>
    <item>
      <title>什么是 “大型” Rails 项目</title>
      <description>&lt;p&gt;有听到前辈讲过一些”“大型”Rails 项目的管理方法，比如抽 Service、拆 Gem 等。
我认为项目“大小”的定义很模糊。所以多少行的项目算得上是“大型”呢？&lt;/p&gt;

&lt;p&gt;比如我公司里的这个项目，代码统计如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  4874 |  3808 |      68 |     336 |   4 |     9 |
| Helpers              |   331 |   168 |       0 |      20 |   0 |     6 |
| Jobs                 |    23 |    19 |       3 |       3 |   1 |     4 |
| Models               |  4355 |  2341 |      50 |     241 |   4 |     7 |
| Mailers              |     0 |     0 |       0 |       0 |   0 |     0 |
| Javascripts          |  3917 |  2717 |       0 |     343 |   0 |     5 |
| Libraries            |   714 |   515 |       7 |      55 |   7 |     7 |
| Controller tests     |   340 |   270 |       7 |      29 |   4 |     7 |
| Helper tests         |   211 |   180 |       8 |       6 |   0 |    28 |
| Model tests          |   318 |   117 |      13 |      26 |   2 |     2 |
| Mailer tests         |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 15083 | 10135 |     156 |    1059 |   6 |     7 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 9568     Test LOC: 567     Code to Test Ratio: 1:0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种规模算是小型还是大型呢？&lt;/p&gt;</description>
      <author>a0nqm</author>
      <pubDate>Mon, 06 Mar 2017 12:45:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/32456</link>
      <guid>https://ruby-china.org/topics/32456</guid>
    </item>
    <item>
      <title>如何在 Capistrano 3 中根据不同 stage 添加不同任务</title>
      <description>&lt;p&gt;在实际使用场景中，比如我有两个 stage：&lt;code&gt;production&lt;/code&gt;和&lt;code&gt;staging&lt;/code&gt;，分别对应&lt;code&gt;cap production deploy&lt;/code&gt;和&lt;code&gt;cap staging deploy&lt;/code&gt;命令。&lt;/p&gt;

&lt;p&gt;假设有 Task A，我想在&lt;code&gt;cap production deploy&lt;/code&gt;的时候运行 Task A，在&lt;code&gt;cap staging deploy&lt;/code&gt;时不运行 Task A。&lt;/p&gt;

&lt;p&gt;如何做到这样子？&lt;/p&gt;</description>
      <author>a0nqm</author>
      <pubDate>Thu, 02 Mar 2017 14:43:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/32420</link>
      <guid>https://ruby-china.org/topics/32420</guid>
    </item>
  </channel>
</rss>
