{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/why-puma-daemonization-removed","result":{"data":{"markdownRemark":{"id":"e850900e-60da-537b-bd28-7f651564d80d","html":"<p>Puma は Ruby のアプリケーションサーバの一種であり、Ruby on Rails がデフォルトで使用していることでも有名です。</p>\n<p>そんな Puma をサーバにデプロイする方法を調べていると、一昔前まではデーモン化 (Daemonization) する設定があったそうですが、現在はその設定が廃止されていました。</p>\n<p>そこで</p>\n<ul>\n<li>Puma をデーモン化する設定はなぜ廃止されたのか</li>\n<li>代替手段の puma-daemon によるデーモン化はどのように実現されているのか</li>\n</ul>\n<p>を調べたところいろいろ勉強になったので、記事としてまとめます。</p>\n<h2 id=\"前提\" style=\"position:relative;\"><a href=\"#%E5%89%8D%E6%8F%90\" aria-label=\"前提 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>前提</h2>\n<p>Puma とは？という方には、Ruby における Web サーバとアプリケーションサーバについて説明している以下の翻訳記事が分かりやすくてオススメです。</p>\n<ul>\n<li><a href=\"https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rails開発におけるwebサーバーとアプリケーションサーバーの違い（翻訳） - Qiita</a></li>\n</ul>\n<h2 id=\"puma-をデーモン化する設定はなぜ廃止されたのか\" style=\"position:relative;\"><a href=\"#puma-%E3%82%92%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%81%AF%E3%81%AA%E3%81%9C%E5%BB%83%E6%AD%A2%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%8B\" aria-label=\"puma をデーモン化する設定はなぜ廃止されたのか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Puma をデーモン化する設定はなぜ廃止されたのか</h2>\n<p>Puma の GitHub リポジトリの <a href=\"https://github.com/puma/puma/blob/ea81fba045ce191644129cc772608765d1595511/History.md#500--2020-09-17\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">History.md</a> によると、</p>\n<blockquote>\n<h2 id=\"500--2020-09-17\" style=\"position:relative;\"><a href=\"#500--2020-09-17\" aria-label=\"500  2020 09 17 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5.0.0 / 2020-09-17</h2>\n<p>:</p>\n<ul>\n<li>Daemonization has been removed without replacement. (#2170)</li>\n</ul>\n</blockquote>\n<p>ということで、デーモン化の設定はバージョン 5.0.0 で削除されています。</p>\n<p>その理由などは、<a href=\"https://github.com/puma/puma/pull/2170\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#2170</a> のプルリクエストに対応する issue (<a href=\"https://github.com/puma/puma/issues/1983\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#1983</a>) で議論されています。</p>\n<p>この議論の中では、デーモン化機能の削除の理由として <a href=\"https://www.mikeperham.com/2014/09/22/dont-daemonize-your-daemons/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Don’t Daemonize your Daemons! | Mike Perham</a> という記事がリンクされています。</p>\n<p>この記事から重要な点をいくつか引用させていただくと、</p>\n<blockquote>\n<p>Your application code should not be dealing with PID files, log redirection or other low-level concerns.</p>\n</blockquote>\n<blockquote>\n<p>Let your operating system handle daemons, respawning and logging while you focus on your application features and users.</p>\n</blockquote>\n<p>とのことで、要するに、「<strong>PID ファイルの管理やログのリダイレクトといった低レベルの関心事はアプリケーションで扱うべきではなく、デーモン化やリスポーン・ロギングといった機能は OS に任せて、アプリケーションの開発者は機能やユーザに注視するべき</strong>」ということです。</p>\n<p>この記事に書かれている通り、自前のコードでデーモン化を実現しようとすると、ログローテーションなど多くの考慮事項ができてしまいます。</p>\n<p>systemd などの提供する方法でデーモン化すれば、そういった考慮事項が減るので、<strong>systemd などを使ってデーモン化するべき</strong>ということです。</p>\n<p>systemd を使うことで、例えばログは単に標準出力に出せばよくなり、<a href=\"https://12factor.net/ja/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">The Twelve-Factor App</a> にもある移植性の高いアプリケーションの設計プラクティスを満たすこともできます。</p>\n<p>なお、Puma を systemd で管理する際の設定については、<a href=\"https://github.com/puma/puma/blob/cc1768e122d1583c884bc0cf9b8699aa7393bbac/docs/systemd.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">docs/systemd.md</a> に書かれています。</p>\n<h2 id=\"代替手段の-puma-daemon-によるデーモン化はどのように実現されているのか\" style=\"position:relative;\"><a href=\"#%E4%BB%A3%E6%9B%BF%E6%89%8B%E6%AE%B5%E3%81%AE-puma-daemon-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AE%9F%E7%8F%BE%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B\" aria-label=\"代替手段の puma daemon によるデーモン化はどのように実現されているのか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>代替手段の puma-daemon によるデーモン化はどのように実現されているのか</h2>\n<p>さて、このような理由で Puma のデーモン化設定は廃止されたわけですが、代替手段として <a href=\"https://github.com/kigster/puma-daemon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">puma-daemon</a> という gem が作られました。</p>\n<p>この gem を使ってデーモン化する方法が systemd でのデーモン化とどう違うのか、コードを追いかけてみます。</p>\n<p>※ CRuby、glibc とコードを見ていきます。この辺りのコードは読み慣れていないので、もし間違いなどあれば <a href=\"https://twitter.com/oshima_123\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Twitter</a> などでご指摘いただけますと幸いです</p>\n<h3 id=\"puma-daemon-の該当箇所\" style=\"position:relative;\"><a href=\"#puma-daemon-%E3%81%AE%E8%A9%B2%E5%BD%93%E7%AE%87%E6%89%80\" aria-label=\"puma daemon の該当箇所 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>puma-daemon の該当箇所</h3>\n<p>puma-daemon のコードをなんとなく探ってみると、どうやら <a href=\"https://github.com/kigster/puma-daemon/blob/b14a154573f891b82fb68c58cc43d4fb41bb81fd/lib/puma/daemon/runner.rb#L22\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ここ</a> で</p>\n<blockquote>\n<p>Process.daemon(true)</p>\n</blockquote>\n<p>と、Ruby の組み込みライブラリの関数 <code class=\"language-text\">Process.daemon</code> が呼ばれており、この処理でデーモン化しているようです。</p>\n<h3 id=\"ruby-の-processdaemon-の該当箇所\" style=\"position:relative;\"><a href=\"#ruby-%E3%81%AE-processdaemon-%E3%81%AE%E8%A9%B2%E5%BD%93%E7%AE%87%E6%89%80\" aria-label=\"ruby の processdaemon の該当箇所 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ruby の Process.daemon の該当箇所</h3>\n<p>もう少し詳しく知りたいので、Ruby (CRuby) の実装を追いかけてみようと思います。</p>\n<p>GitHub の <a href=\"https://github.com/ruby/ruby\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ミラーリポジトリ</a> を見てみると…</p>\n<p><a href=\"https://github.com/ruby/ruby/blob/2488589b2f1a70dbfdc4155ac9bea3c533ef35d8/process.c#L7006\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">process.c</a> の <a href=\"https://github.com/ruby/ruby/blob/2488589b2f1a70dbfdc4155ac9bea3c533ef35d8/process.c#L7006\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">この箇所</a> で</p>\n<blockquote>\n<p>err = daemon(nochdir, noclose);</p>\n</blockquote>\n<p>のように、<code class=\"language-text\">daemon</code> という関数が呼ばれています。</p>\n<p>※ <code class=\"language-text\">daemon</code> という関数が呼ばれるのは <code class=\"language-text\">#ifdef HAVE_DAEMON</code> が満たされた場合のみです。そうでない場合については別の方法でデーモン化されているようです</p>\n<h3 id=\"glibc-の該当箇所\" style=\"position:relative;\"><a href=\"#glibc-%E3%81%AE%E8%A9%B2%E5%BD%93%E7%AE%87%E6%89%80\" aria-label=\"glibc の該当箇所 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>glibc の該当箇所</h3>\n<p><a href=\"https://linuxjm.osdn.jp/html/LDP_man-pages/man3/daemon.3.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Man page of DAEMON</a> によると、<code class=\"language-text\">daemon</code> は、C 言語の標準ライブラリの関数のようです。</p>\n<p>そこで標準ライブラリの代表的な 1 つである glibc のコードを見てみようと思います。</p>\n<p>GitHub の <a href=\"https://github.com/bminor/glibc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ミラーリポジトリ</a> を見てみると、<a href=\"https://github.com/bminor/glibc/blob/595c22ecd8e87a27fd19270ed30fdbae9ad25426/misc/daemon.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">daemon.c</a> に以下のように実装されているようです。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span>\n<span class=\"token function\">daemon</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> nochdir<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> noclose<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> fd<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span><span class=\"token function\">__fork</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">case</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token number\">0</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n        <span class=\"token function\">_exit</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">__setsid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>nochdir<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span><span class=\"token function\">__chdir</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>noclose<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token operator\">:</span>\n        <span class=\"token operator\">:</span>\n        <span class=\"token operator\">:</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このコードの一番重要な処理は以下の箇所です。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">    <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span><span class=\"token function\">__fork</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">case</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token number\">0</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n        <span class=\"token function\">_exit</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>glibc のコードの読み方に確信が持てないですが、おそらく <code class=\"language-text\">__fork()</code> は <a href=\"https://linuxjm.osdn.jp/html/LDP_man-pages/man2/fork.2.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">fork というシステムコール</a> を読んでいるのではないかと思います。</p>\n<p>fork システムコールはその戻り値によって親プロセスと子プロセスで処理を分岐することが多いのですが、上記の switch 文はまさにその典型です。</p>\n<p>子プロセスは <code class=\"language-text\">case 0</code> に進み、以後の処理を継続し、アプリケーションサーバとして動きます。</p>\n<p>一方、親プロセスは戻り値として子プロセスの PID を受け取るため、<code class=\"language-text\">default</code> に進み、exit します。</p>\n<p>『<a href=\"https://amzn.to/3qKxjJm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">詳解 Linuxカーネル 第3版</a>』p32 によると、</p>\n<p><a href=\"https://www.amazon.co.jp/dp/487311313X?&linkCode=li1&tag=oshimayuki0d-22&linkId=30d0372c61b0545f777b8372daf1b38c&language=ja_JP&ref_=as_li_ss_il\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=487311313X&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li1&amp;o=9&amp;a=487311313X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>\n<blockquote>\n<p>プロセスが終了する際、カーネルは終了するプロセスの子プロセスすべてに関して、init の子になるように適切なプロセスディスクリプタのポインタを変更します。</p>\n</blockquote>\n<p>とのことで、親プロセスがいなくなったことで子プロセス (アプリケーションサーバのプロセス) は init の子プロセスになり、デーモン化が完了したわけです。</p>\n<p>※ Linux 以外でも同様の挙動になるかは調べていません</p>\n<h3 id=\"結局-puma-daemon-でのデーモン化と-systemd-でのデーモン化はどう違うのか\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%B1%80-puma-daemon-%E3%81%A7%E3%81%AE%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%A8-systemd-%E3%81%A7%E3%81%AE%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%AF%E3%81%A9%E3%81%86%E9%81%95%E3%81%86%E3%81%AE%E3%81%8B\" aria-label=\"結局 puma daemon でのデーモン化と systemd でのデーモン化はどう違うのか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結局 puma-daemon でのデーモン化と systemd でのデーモン化はどう違うのか</h3>\n<p>話がだいぶ込み入ってしまいましたが、ここまで読んできたコードからすると、</p>\n<ul>\n<li><strong>puma-daemon によるデーモン化は、ただ init プロセスの子プロセスとして Puma が動き続けるようにするだけ</strong></li>\n<li><strong>したがって、systemd によるデーモン化のようにリスポーンやロギングのような機能は提供されない</strong></li>\n</ul>\n<p>ということです。</p>\n<h2 id=\"結局どうするのがオススメか\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%B1%80%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E3%81%8B\" aria-label=\"結局どうするのがオススメか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結局どうするのがオススメか</h2>\n<p>最後に、では結局どうするのがオススメかをまとめようと思います。</p>\n<h3 id=\"そもそもデーモン化を気にする必要があるか\" style=\"position:relative;\"><a href=\"#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%82%92%E6%B0%97%E3%81%AB%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B\" aria-label=\"そもそもデーモン化を気にする必要があるか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>そもそもデーモン化を気にする必要があるか</h3>\n<p>そもそも論として、最近のクラウド環境を踏まえると、サーバに直接 Puma をデプロイすることはオススメしません。</p>\n<p>Heroku などの PaaS や、Fargate などのコンテナ環境を使うのが第一候補になります。</p>\n<p>これらのプラットフォームを使う場合は、デーモン化について気にする必要はありません。</p>\n<h3 id=\"サーバにデプロイする場合\" style=\"position:relative;\"><a href=\"#%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88\" aria-label=\"サーバにデプロイする場合 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>サーバにデプロイする場合</h3>\n<p>デーモン化を気にする必要があるのは、PaaS やコンテナを使わず、サーバに直接デプロイする場合です。</p>\n<p>その場合、この記事の内容を踏まえると、<strong>systemd などを使ってデーモン化する方が望ましい</strong>と言えます。</p>\n<p><strong>puma-daemon によるデーモン化は、あくまで簡易的な代替手段</strong>と考えるのが良さそうです。</p>","fields":{"slug":"/posts/why-puma-daemonization-removed","tagSlugs":["/tag/ruby/","/tag/rails/"],"autoRecommendPosts":["ruby-and-rails-books","what-is-installation","487311313X","4839975868"]},"frontmatter":{"date":"2021-07-04T11:16:36.214Z","description":"「Puma をデーモン化する設定はなぜ廃止されたのか」、「代替手段の puma-daemon によるデーモン化はどのように実現されているのか」を調べたところいろいろ勉強になったので、記事としてまとめます。","tags":["ruby","rails"],"title":"Puma の Daemonization が廃止された理由と、デーモン化したいときはどうするべきか","socialImage":null,"recommendPosts":["https://www.kanzennirikaisita.com/posts/ruby-and-rails-books","https://www.kanzennirikaisita.com/posts/software-developer-books-index"]}}},"pageContext":{"slug":"/posts/why-puma-daemonization-removed"}},"staticQueryHashes":["251939775","3942705351","401334301"]}