ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

serverengine を使い、Rubyでもサーバーを書こう

Rubyを書いていると、サーバを書きたくなることがあります。皆さんもそうだと思います。

ということで今日はRubyでスッとサーバを書くためのgem、serverengineの簡単な使い方メモ。

github.com

Rubyでサーバを書きたくなった時

そもそも的に、Rubyでただサーバを書くのは非常に簡単である。具体的には Kernel#loop などを回してその中でリクエストを待ったり、何かしら処理を行えば終わり。特別なgemは必要ないし、TCPを扱うクラスなども組み込みで用意されている。

以下のような9行のスクリプトを起動すれば、サーバを書いたと言える。ところで TCPServer#accept_nonblockでないと、acceptでブロックしてしまって終了処理が遅れたりするのでノンブロッキングの方のAPIを好んで使うのがいいだろう。

require 'socket'
server = TCPServer.new(5310)
loop do
  c = server.accept_nonblock(exception: false)
  if c.is_a?(IO)
    c.puts("Hello")
    c.close
  end
end
$ telnet localhost 5310
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello
Connection closed by foreign host.

「ちゃんとした」サーバを書く

とはいえこの簡素なサーバをプロダクションの何かに投入するのは不安があるだろう。具体的には運用面。きょうびのサーバーは、以下のような機能を実装していてほしい。

  • ログを吐いてほしい
  • pid fileを吐いてほしい
  • SIGINT、SIGTERMなどを正しく扱ってほしい。Interrupt例外とか生で出て欲しくない
  • 何ならSIGUSR2あたりを受け取ったら設定のリロードをしてほしい
  • prefork型のワーカをたくさん立ち上げて処理を負荷分散してほしい。Rubyなこともあり、マルチプロセスがいい
  • プロセスが ruby hoge.rb だとカッコ良くないので、かっこいい名前をpsコマンドで出したい(?)

これらをRubyで一から実装していくのはなかなか手間であるが、serverengine gemを使えばこれらの機能はそのままパッケージングされている。

続きを読む

initのお仕事〜tiniのコードを読んでみた

急にinitが何をしているのか、何をすべきなのかが気になったので調べてみた。一緒に600行強のinit実装であるtiniソースコードをざっくり読んだ。この場を借りてメモしていく。

the PID 1 problem

RubyコミュニティなどではPassengerで有名なPhusion社のブログに、Docker and the PID 1 zombie reaping problemという記事が掲載されている。

blog.phusion.nl

  • ゾンビプロセスをreapしてくれないと困る
  • SIGTERMなどでPID=1が先に死んだらその子プロセスを処理してくれないと困る

みたいな内容が書いてある。詳細は読んでみてほしい。

システムコンテナ(参考)と呼ばれる種類のコンテナを作る場合、任意のプログラムをコンテナ内部のPID=1とするのではなく、上記のような振る舞いをする軽量なinitプログラムを経由して呼び出すというプラクティスがある。tiniはそういった軽量initの一つで、dockerの --init オプションで使われるコマンドとしても知られている。

github.com

“A tiny but valid init for containers”と自称している。

tini のコードリーディング

2018/04/16現在、プログラムの主要部分である tini.c は611行しかない。読み切るのもそんなに難しくないので目を通してみる。単にログを出したり便利計算をするだけのマクロやdefineによる分岐はざっくり省略している。

続きを読む

Ruby25周年記念イベントでお話ししました #ruby25th

登壇者枠です。

Infrastructure as Code/mrubyなどによるConfiguration as Codeの話をしました。

speakerdeck.com

もともとこの倍の分量のスライドが発生して笹田さんにご心配をかけてしまいましたが、なんとか時間通り? 話せました...。


当スライドで後半でいった内容だったり、僕が最近やっているようなことについて、本当に純粋に「なんでやっているの?」という質問が何人かからありました。Kubernetesの「Railに乗って」コンテナをオーケストレーションしてビジネスをドリブンする、そういうのも確かにエンジニアとして生きるにあたり有力な選択肢だと思います。

でも僕にとって興味のあることは、そもそもKubernetesとか、コンテナとか、それを支えるLinux自体とかがどうなっているかというところであり、興味を持った分野に関しては 世界の本当のこと を知りたいので、そのアプローチとしてまず自分で手を動かす、ということを選んでいるにすぎません。

どんな技術であっても、その本当のところを知っている人というのはとても少なく、少ない側の人間になりたいと常々考えているのでした。

ここでRubyの話に繋がるんですが、世界の本当のことを知るための道具として10年間使い込んできたRubyという道具(あるいは「ブキ」)は、僕にとっては本当に便利です。

プログラマにとっては、何かを理解する最大の方法は、その何かを実装することだと思いますが、僕にとっては自分の考えたことと現実の実装をインピーダンスミスマッチなくつなぐことができる最大の道具は、Rubyなのであります。

エンジニアとして駆け出しの頃にRubyに出会えて、ここまで、曲がりなりにも一緒に歩め、25周年という大きな節目でお話をできたことは非常に幸運だと思います。

これからも、Rubyとそしてmruby(その結果としてのC言語...)を書いて、世界について詳しくなっていこうと思っています。


素晴らしい場を企画してくださった笹田さんをはじめ、関係する皆様ありがとうございました!