<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hxplove01 (hexp1989)</title>
    <link>https://ruby-china.org/hxplove01</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ubuntu 升级 16.04，不作死和咸鱼有什么区别</title>
      <description>&lt;h3 id="服务器环境"&gt;服务器环境&lt;/h3&gt;
&lt;p&gt;几年前的服务器，一直运行着 Rails 3.x + Apache 2.2 的应用。&lt;/p&gt;

&lt;p&gt;因为技术栈从 Rails 转到其他方向了，所以服务器也一直没有动过，初始的 ubuntu 版本是 12.04。&lt;/p&gt;

&lt;p&gt;两周前，因为 Docker 环境依赖，将 12.04 升级到了 14.04。&lt;/p&gt;

&lt;p&gt;当时 apache + passenger 的环境在升级之后出现问题，尝试恢复也不容易。&lt;/p&gt;

&lt;p&gt;索性直接干掉了 apache2，将环境改成了 nginx + passenger，随后折腾了一番之后恢复之前的状态。&lt;/p&gt;

&lt;p&gt;服务器顺利升级至 ubuntu 14.04&lt;/p&gt;
&lt;h3 id="升级原因"&gt;升级原因&lt;/h3&gt;
&lt;p&gt;两天前，因为未知原因，Docker 在 swarm 环境下 IP 地址不能正常工作。&lt;/p&gt;

&lt;p&gt;几经折腾，怀疑是因为 14.04 的 ubuntu kernel 版本太低（当前为 3.13.0）。&lt;/p&gt;

&lt;p&gt;经过一番测试，ubuntu 16.04 的版本下 Docker swarm 的服务 IP 地址可以正常工作。&lt;/p&gt;

&lt;p&gt;所以打算升级至 16.04，准备一劳永逸。&lt;/p&gt;
&lt;h3 id="今天晚上准备开始作死😑"&gt;今天晚上准备开始作死😑&lt;/h3&gt;&lt;h3 id="Update 1: 作死准备中"&gt;Update 1: 作死准备中&lt;/h3&gt;
&lt;p&gt;先备份一下正在生产环境中运行的数据和文件，其他的已经停掉的项目就听天由命吧 &lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;杂七杂八的历史遗留东西迁移也是问题，升级也是问题，so，let me challenge &lt;img title=":neutral_face:" alt="😐" src="https://twemoji.ruby-china.com/2/svg/1f610.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;阿里云磁盘快照创建中，至少有快照心里有点底。好漫长的等待...&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/0714a1ce-7c6c-44c0-bf85-539c8bccf92f.png" width="300px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;终于结束了，准备开始 &lt;code&gt;do-release-upgrade&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="Update 2: 开始升级"&gt;Update 2: 开始升级&lt;/h3&gt;
&lt;p&gt;执行升级命令&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ do-release-upgrade&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;期间有几次确认交互，确认继续升级&lt;/p&gt;

&lt;p&gt;系统升级结束了，大概二十分钟左右。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System upgrade is complete.

Restart required 

To finish the upgrade, a restart is required. 
If you select 'y' the system will be restarted. 

Continue [yN] y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;稍等了一会之后重新 &lt;code&gt;ssh&lt;/code&gt;连接，看到系统版本已经改变&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-78-generic x86_64)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服务没有跟随开机启动&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/e96f29a4-72a2-421b-b383-d8b7f81ff091.png" width="300px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;开始一个一个修复吧&lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; 痛苦才刚刚开始&lt;/p&gt;
&lt;h3 id="Update 3: 修复upstart"&gt;Update 3: 修复 upstart&lt;/h3&gt;
&lt;p&gt;更新完之后，可能会出现之前一些服务没有随开机启动，启动之后会报错，比如：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;手动启动服务也会出现一些 failed 的字眼，首先先更新 package，比如 nginx 的，在 14.04 安装的是 trusty，系统升级之后，你需要重新安装 nginx（可以不需要删除原来 nginx），会在旧版的 nginx 基础上升级，conf 文件也会保存。&lt;/p&gt;

&lt;p&gt;升级之后还有问题的话，可以安装 &lt;code&gt;sudo apt-get install upstart-sysv &amp;amp;&amp;amp; sudo update-initramfs -u &amp;amp;&amp;amp; sudo reboot&lt;/code&gt;，重启之后就正常了。&lt;/p&gt;

&lt;p&gt;刚才升级 nginx 之后，passenger module 貌似 load 不正确，静态网站访问都 ok，但是 rails 项目访问返回的是 &lt;code&gt;502&lt;/code&gt; 错误，error.log 里面也只有一个不存在的目录的错误。随后直接重启一次机器，起来之后就一切 ok👌。&lt;/p&gt;

&lt;p&gt;（这里 nginx 在 ubuntu 14.04 时我已经升级到最新版，所以在升级至 16.04 时，原来的配置都通用，包括 passenger 的 load path 什么的都不需要修改）&lt;/p&gt;
&lt;h4 id="RMagick 居然没有出错 😂"&gt;RMagick 居然没有出错 😂&lt;/h4&gt;
&lt;p&gt;本来这次升级，已经做好准备与 rmagick 纠结一番的（之前升级的经历中，imagemagick 版本升级，导致 rmagick 一系列错误），结果很神奇的是居然完全正常。&lt;/p&gt;

&lt;p&gt;如果你们升级之后，发现 rmagick 出错，有可能是 imagemagick 版本升级，其目录名改变，导致找不到 Magick-config 或者 MagickWand 这些 lib。&lt;/p&gt;

&lt;p&gt;之前我尝试通过 &lt;code&gt;sudo apt list --installed | grep magick&lt;/code&gt; ，找出与 imagegick 相关的所有 package，然后全部 &lt;code&gt;sudo apt-get purge&lt;/code&gt;删除。其中有很多因为系统升级的 lib，比如 &lt;code&gt;libmagickcore, libmagickcore-6, libmagickcore-6.q16&lt;/code&gt;这些，统统删掉&lt;/p&gt;

&lt;p&gt;然后安装 &lt;code&gt;sudo apt-get install libmagickwand-dev imagemagick&lt;/code&gt;，在 &lt;code&gt;/usr/include/ImageMagick-6&lt;/code&gt;会出现这个目录，随后做一个软链接 &lt;code&gt;sudo ln -s /usr/include/ImageMagick-6 /usr/include/ImageMagick&lt;/code&gt;，在这时候执行&lt;code&gt;gem install rmagick -v '2.x.x'&lt;/code&gt;，可能会出现 &lt;code&gt;Magick-config&lt;/code&gt;没有，再执行 &lt;code&gt;sudo ln -s /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16/Magick-config /usr/bin/Magick-config&lt;/code&gt;，这时再通过 &lt;code&gt;gem install rmagick&lt;/code&gt;就没问题了&lt;/p&gt;
&lt;h3 id="Docker 升级"&gt;Docker 升级&lt;/h3&gt;
&lt;p&gt;14.04 时安装的 docker 也是 trusty 版本，所以先删掉原来的 docker。&lt;/p&gt;

&lt;p&gt;再安装 docker-ce xenial，更新 docker 版本&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker network create test
Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一口老血喷在屏幕上，居然还有这个问题。内核都已经升级了，再出这个错，只能说明跟网段冲突了。&lt;/p&gt;

&lt;p&gt;还好在阿里云文档上找到了这个 &lt;a href="https://help.aliyun.com/knowledge_detail/39457.html?spm=5176.2020520101.0.0.FAnpY8#ECS%E5%86%85%E7%BD%91%E8%B7%AF%E7%94%B1%E5%BC%82%E5%B8%B8" rel="nofollow" target="_blank" title=""&gt;ECS 内网路由异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;其中提到 &lt;code&gt;172.16.x.x, 10.0.0.0, 100.0.0.0&lt;/code&gt;这三个网段，是被内网使用的，但是没有提到&lt;code&gt;192.168.0.0/16&lt;/code&gt;这个网段的作用。可能是为了自己的 ecs 内网先占用了，直接在路由表中删掉了&lt;code&gt;192.168.0.0/16&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;随后重启机器（我也不想一直重启机器）&lt;/p&gt;

&lt;p&gt;查看&lt;code&gt;docker network ls&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NETWORK ID          NAME                DRIVER              SCOPE
97cc5a9d6914        bridge              bridge              local
15a8c70d2c2a        docker_gwbridge     bridge              local
42a5c6f026ea        host                host                local
2cdcypkqpn08        ingress             overlay             swarm
4c41ef6cc61a        none                null                local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刚才并没有出现 &lt;code&gt;docker_gwbridge&lt;/code&gt;在机器重启之后出现了，随后通过&lt;code&gt;ifconfig docker_gwbridge&lt;/code&gt;可以看到，这个网段的 IP 段是 &lt;code&gt;192.168.0.0/20 dev docker_gwbridge  proto kernel  scope link  src 192.168.0.1&lt;/code&gt;，所以导致 swarm 下的 network 问题。&lt;/p&gt;

&lt;p&gt;在 ubuntu 14.04 中，即使删除 &lt;code&gt;192.168.0.0/16&lt;/code&gt;的路由，也不能正常工作，这也是为什么我要升级到 16.04 的原因。&lt;/p&gt;

&lt;p&gt;另外我发现，自有主机在 ubuntu 14.04（Kernel 3.13.0）下没有这个网络问题，但是在阿里云 ecs 下是不能正常工作的。&lt;/p&gt;

&lt;p&gt;当时也没找到原因，至少现在 16.04 下正常工作了。&lt;img title=":100:" alt="💯" src="https://twemoji.ruby-china.com/2/svg/1f4af.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;关于 Docker network 的问题还有不少，比如 overlay network 可以创建成功，local network 就会失败。又或者指定--subnet 成功，但是在 service 启动后却无法正确分配地址之类的，这些坑都遇到过。&lt;/p&gt;

&lt;p&gt;网段冲突的问题官方也提到在未来会做更多的支持，在目前状态下，集群环境下 service 创建也可以正常工作了。&lt;/p&gt;

&lt;p&gt;差不多可以结束了，系统升级，顺带着 mongodb 版本从之前 2.4 升级到了 2.6（主要是怕跨度太大，api 变化，没敢升到 3.x），nginx 版本基本没变，docker 重新安装。&lt;/p&gt;

&lt;p&gt;改天把 rails 项目移到 docker 环境中，可算是万事大吉了，到时候只需要带一个 docker image 就足够。&lt;/p&gt;

&lt;p&gt;下班下班&lt;img title=":beers:" alt="🍻" src="https://twemoji.ruby-china.com/2/svg/1f37b.svg" class="twemoji"&gt; &lt;/p&gt;</description>
      <author>hxplove01</author>
      <pubDate>Thu, 25 May 2017 16:17:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/33071</link>
      <guid>https://ruby-china.org/topics/33071</guid>
    </item>
    <item>
      <title>[上海][徐汇] 招聘－Ruby Web 工程师一名</title>
      <description>&lt;h2 id="WEB攻城师"&gt;WEB 攻城师&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;岗位职责：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;折腾老板 /MOUSE/KEYBOARD/CPU/RAM/SSD;&lt;/li&gt;
&lt;li&gt;被用户/龟速网络 /IE/Chrome/Firefox/Safari/Opera折腾；&lt;/li&gt;
&lt;li&gt;被异性同事折腾；&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;技能要求：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;熟悉 HTML5 &amp;amp;&amp;amp; CSS3 &amp;amp;&amp;amp; Javascript;&lt;/li&gt;
&lt;li&gt;熟悉 RUBY || PHP 及其流行 Framework, &lt;/li&gt;
&lt;li&gt;熟悉 Git/Github;&lt;/li&gt;
&lt;li&gt;熟悉 MongoDB || Mysql;&lt;/li&gt;
&lt;li&gt;理解 HTTP 协议，熟悉 Apache || Nginx || Phusion Passenger;&lt;/li&gt;
&lt;li&gt;熟悉 Rails/Sinatra/Rspec/Capistrano/Mina 优先+；&lt;/li&gt;
&lt;li&gt;有在 Ubuntu,Mac OS X 下工作的优先;&lt;/li&gt;
&lt;li&gt;以上全熟悉优先++；&lt;/li&gt;
&lt;li&gt;女生优先++++；&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;经验要求：&lt;/strong&gt;白纸级&lt;/p&gt;

&lt;p&gt;待遇面议&lt;/p&gt;

&lt;p&gt;注：985/211 勿扰，蓝翔优先！
注：以上不熟悉的也都没问题！&lt;/p&gt;

&lt;p&gt;我们没有业务经理，不会有人提无理的业务需求，我们是技术引导业务。
我们没有项目经理，不会有人说：就是加班也要赶明天完成。因为工作量导致项目延期，我们会顺延时间，推迟发布。
我们定期有 TB，偶尔老大请客吃饭喝酒，到酩酊大醉回家第二天还能休息哦。
我们过年假期有 15 天，法定假日一天不少。
我们很少加班，因为我们会合理规划项目周期。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充：&lt;/strong&gt;
我们是做电子商务网站的，&lt;a href="http://nongren.com" rel="nofollow" target="_blank"&gt;http://nongren.com&lt;/a&gt; ，目前是 Releases 9，最近 Releases 10 快结束了，会跟以前完全不一样。有兴趣的可以留意一下。&lt;/p&gt;

&lt;p&gt;如果你不会 ruby，开始会让你接手一些 support 工作，闲暇时间你可以自学 ruby。也可以跟我们技术部任意一个人 pair 工作（我们不定期会选择一个人 pair 工作，互相学习）,也可以给你划分一台内部服务器折腾自己的项目。&lt;/p&gt;

&lt;p&gt;都说了这么多了，还不赶紧投简历可以发送至 hr@brainet.com.cn&lt;/p&gt;

&lt;p&gt;公司名称：上海宝数信息科技有限公司
公司地址：上海徐汇区吴中路 8 号（地铁 3，4 号线宜山路站下车后步行 10 分钟）&lt;/p&gt;</description>
      <author>hxplove01</author>
      <pubDate>Fri, 28 Mar 2014 15:23:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/18231</link>
      <guid>https://ruby-china.org/topics/18231</guid>
    </item>
    <item>
      <title>Passenger With Apache2 VirtualDocumentRoot</title>
      <description>&lt;p&gt;内部部署应用很麻烦，打算做一个 generator 生成当前 application 的 apache 配置文件，扔到 apache 配置目录中去，就可以直接访问了。
然后了解 apache 后发现了 VirtualDocumentRoot 这个配置，它的作用是配置通配 virtualhost，比如配置 a.test.com,b.test.com，只需要配置&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ServerAlias&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;com&lt;/span&gt;
&lt;span class="no"&gt;VirtualDocumentRoot&lt;/span&gt; &lt;span class="sr"&gt;/var/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/%&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就完成了，访问各自的目录
然后...然后发现跟 passenger 不能一起用，访问后直接就是配置的目录的文件列表，
最后发现 passenger 的官方文档说：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;VirtualDocumentRoot&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;compatible&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="no"&gt;Phusion&lt;/span&gt; &lt;span class="no"&gt;Passenger&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;moment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问各位小伙伴们有何解决方案&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;在追加一点东西吧，我的目的是这样的：我们正在做一个网站的 gem,
clone 下来 gem 之后，我只需要执行 thor task，它就会帮我 generator 一个新的 ROR 项目，然后会自动替换里面所有的需要配置的文件，然后会把文件放到正确的位置，然后会生成一个 apache virtualHost 配置文件，并放到 apache 目录中去，然后会重启 apache，然后，你就可以直接访问这个网站了。
而对于一个普通的不会 code 的用户来说，它只需要执行一个 task，这个网站就 ok 了&lt;/p&gt;</description>
      <author>hxplove01</author>
      <pubDate>Thu, 19 Dec 2013 16:18:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/16312</link>
      <guid>https://ruby-china.org/topics/16312</guid>
    </item>
  </channel>
</rss>
