{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/blog/20210919/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Juicy Blog 🍋"}},"markdownRemark":{"id":"9716444d-fd49-5da5-b9bd-a5eabc251ef9","excerpt":"TL;DR alpine linuxを使えば解決。 最近はRailsで簡易的な動画ファイルをセルフホスティングできるアプリケーションを作っています。\n有名所ではPlexや、最近はJellyfinなどのようなアプリケーションもあります。\nこれらはiOSやAndroid向けや、ChromecaseやFireTV…","html":"<p><strong>TL;DR</strong> alpine linuxを使えば解決。</p>\n<p>最近はRailsで簡易的な動画ファイルをセルフホスティングできるアプリケーションを作っています。\n有名所では<strong>Plex</strong>や、最近は<strong>Jellyfin</strong>などのようなアプリケーションもあります。\nこれらはiOSやAndroid向けや、ChromecaseやFireTVなどのクライアントにも対応していたりするのですが、動画を観るだけならブラウザで十分です。\nしかし自宅で動画をホスティングしようとすると、数百MBや数GBはあるファイルを一度にダウンロードしようとするので動画ファイルをシークすることはできません。</p>\n<p>そこで最初は動画をストリーミング再生する方法を調べようとしていて、Nginxには<a href=\"https://docs.nginx.com/nginx/admin-guide/dynamic-modules/rtmp/\"><strong>RTMP</strong></a>というモジュールが存在しているようです。\nこのページにも記されているようにDebianやAlpineでもコマンドでインストールすることができるようです。\nあとは<code class=\"language-text\">/etc/nginx/modules-enabled</code>に<code class=\"language-text\">50-mod-rtmp.conf</code>というファイルが作成されるのでこのモジュールを使うことができるようになるわけ。\nRTMPはストリーミング配信するときに必要なもので今回の要件とはあまり関係ないようでした。</p>\n<p><a href=\"https://gist.github.com/CSRaghunandan/ce2394cd5a9c8a412f8ff5ee1478560a#file-nginx-conf-L106\">https://gist.github.com/CSRaghunandan/ce2394cd5a9c8a412f8ff5ee1478560a#file-nginx-conf-L106</a></p>\n<p>たまたま似たようにNginx単体でMP4を配信できそうな<code class=\"language-text\">nginx.conf</code>のGistが見つかりました。\nこのファイルをそのまま使おうとすると:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">nginx: [emerg] unknown directive \"mp4\" in /etc/nginx/nginx.conf:32</code></pre></div>\n<p><code class=\"language-text\">mp4</code>というディレクティブは存在しないとのこと。</p>\n<p><a href=\"https://nginx.org/en/docs/http/ngx_http_mp4_module.html\">https://nginx.org/en/docs/http/ngx_http_mp4_module.html</a></p>\n<p>Nginxのドキュメントを探すと<code class=\"language-text\">ngx_http_mp4_module</code>というモジュールが存在しているようで、これを使うと上記の設定ファイルが動くようになるようです。\nNginxが使用できるモジュール一覧を調べるときのコマンドは<a href=\"https://www.cyberciti.biz/faq/how-to-list-installed-nginx-modules-and-compiled-flags/\"><code class=\"language-text\">nginx -V</code></a>です。</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerfile\"><pre class=\"language-dockerfile\"><code class=\"language-dockerfile\"><span class=\"token instruction\"><span class=\"token keyword\">FROM</span> debian:stable</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> apt-get update &amp;&amp; <span class=\"token operator\">\\</span>\n    apt-get install nginx libnginx-mod-rtmp -y</span></code></pre></div>\n<p>これを最初試そうとしていたときDebianのDockerfileで、コマンドの結果が以下のとおり。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">nginx -V | tr ' ' '\\n' | grep mp4</code></pre></div>\n<p>出力結果は出ないため当然<code class=\"language-text\">mp4</code>というディレクティブは使えません。</p>\n<p><a href=\"https://serverfault.com/a/533493\">Nginx : Add/Enable mp4 module</a></p>\n<p>上記のSOでの回答によると<code class=\"language-text\">nginx-extras</code>のパッケージをインストールすれば良いとのことでした。\n余談ですが、昔からNginxのチュートリアルを見ると<code class=\"language-text\">nginx-extras</code>をインストールするものが多かったのですが、最初から使えるモジュールが多かったんですね。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">nginx -V | tr ' ' '\\n' | grep mp4\n--with-http_mp4_module</code></pre></div>\n<p>今度は使えるようになりました。\n先程のGistを若干書き換えて試してみたところ、iPhoneのブラウザでも1GB以上はあるビデオファイルを閲覧できるようになりました。\nといってもこれはもともとDebianのベースイメージなので、理想はNginxのDockerfileで使いたいところです。\nそう思ってNginxのコンテナイメージを指定してみたところ:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">docker run -it nginx:alpine nginx -V | tr ' ' '\\n' | grep mp4\n--with-http_mp4_module</code></pre></div>\n<p>ということでNginxのコンテナイメージはあらかじめMP4形式を指定できるようでした。\n普段Railsを使っているだけだと意外と見過ごしがちなのですが、Nginxも結構奥が深いものだなと思った一日でした。</p>","frontmatter":{"title":"NginxでMP4のモジュールを有効にする","date":"September 19, 2021","description":"簡易的なメディアサーバーを作るときのメモ"}},"previous":{"fields":{"slug":"/blog/20210918/"},"frontmatter":{"title":"rails-promptについて"}},"next":{"fields":{"slug":"/blog/20211002/"},"frontmatter":{"title":"ActiveStorageでMinIOにアップロードする方法"}}},"pageContext":{"id":"9716444d-fd49-5da5-b9bd-a5eabc251ef9","previousPostId":"282bff2f-feb7-5d77-a113-586a78fdd202","nextPostId":"e4392015-4df1-5682-bdf4-8b8b4722a63f"}},
    "staticQueryHashes": ["2785349746","2841359383"]}