CINXE.COM

[historical] mod_rubyメモ | Netsphere Laboratories

<!DOCTYPE html> <html> <head> <!-- Google Tag Manager --> <script> (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({ 'gtm.start': new Date().getTime(), event:'gtm.js'}); var f=d.getElementsByTagName(s)[0], j=d.createElement(s), dl=l!='dataLayer'?'&l='+l:''; j.async=true; j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-TPPPJ6W'); </script> <!-- /End Google Tag Manager --> <meta charset="UTF-8" /> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <meta name="viewport" content="width=device-width,initial-scale=1.0" /> <!-- bootstrap --> <link rel="stylesheet" type="text/css" href="/lib/bootstrap5/css/bootstrap.min.css" crossorigin="anonymous" /> <script src="/lib/bootstrap5/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script> <link rel="stylesheet" type="text/css" href="/site.css" /> <link rel="start" href="https://www.nslabs.jp/" /> <link rel="copyright" href="/copyright.rhtml" /> <base target="_top" /> <script data-ad-client="ca-pub-1525727753584386" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <title>[historical] mod_rubyメモ | Netsphere Laboratories</title> </head> <body class="no-thank-yu"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TPPPJ6W" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <!-- Go to www.addthis.com/dashboard to customize your tools --> <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-548e272c6d9678b8"></script> <!-- Static navbar --> <nav class="navbar navbar-expand-md navbar-dark bg-dark" style="margin-bottom:1em"> <div class="container-fluid"> <a class="navbar-brand" href="/"><small>Netsphere Laboratories</small></a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarToggler"> <ul class="navbar-nav me-auto mb-lg-0"> <li class="nav-item"> <a class="nav-link" href="/soft.rhtml">Software</a> <li class="nav-item active"> <a class="nav-link" href="/service.rhtml">Services</a> <li class="nav-item active"> <a class="nav-link" href="/book-list.rhtml">Publications</a> <li class="nav-item dropdown "> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Tech.Memo</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a class="dropdown-item" href="/memo-devel.rhtml">ソフトウェア開発</a> <li><a class="dropdown-item" href="/memo-admin.rhtml">サーバ管理</a> <li><a class="dropdown-item" href="/memo-desktop.rhtml">デスクトップその他</a> </ul> </li> <li class="nav-item dropdown "> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Diary</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a class="dropdown-item" href="/ramble-index.rhtml">随感録(最新)</a> <li><a class="dropdown-item" href="/ramble.rhtml">とても古い随感</a> </ul> </li> </ul> </div> </div> </nav><!-- navbar --> <div class="container-xl"> <nav aria-label="breadcrumb"><ol class="breadcrumb"> <li class="breadcrumb-item"><a href="/">Home</a></li> <li class="breadcrumb-item"><a href="/memo-devel.rhtml">技術メモ(ソフトウェア開発)</a></li> <li class="breadcrumb-item"><a href="/cgimemo.rhtml">サーバ側スクリプティング</a></li> <li class="breadcrumb-item active"></li> </ol></nav> <h1>[historical] mod_rubyメモ</h1> <div class="row"> <div class="col-md-9 col-lg-9"> <p>(2003.10.19新規作成) <div class="bs-callout bs-callout-warning"> <h4> <img src="/images/common/important.png"> 重要. </h4> このページは、もはや古くなっています。 <p>Webサーバは <i>nginx</i> [engine x] をおすすめします。<i>Apache HTTP Server</i> を使う場合であっても、Ruby の組み込みは <i>Passenger</i> アプリケィションサーバがよいでしょう。 </div> <p>mod_rubyは、Apache HTTPサーバにRubyインタプリタを組み込むモジュール。 <p>通常のCGIスクリプトでは、実行するたびにRubyインタプリタを起動するので遅い。mod_rubyを使えばその時間を短縮できる。 <h2>下準備</h2> <p>mod_rubyをインストールするためには、Apache HTTPサーバに動的モジュールを組み込めるようにしておかないといけない。下記を参照。 <ul> <li><a href="apache-install.rhtml">Apache2/2.2 HTTPサーバのインストール</a> </ul> <h2>mod_rubyのインストール</h2> <p>mod_rubyのソースファイルを入手し、解凍する。 <ul> <li><a href="http://www.modruby.net/">modruby.net</a> </ul> <p>コンパイルとインストールは、次のようにする。apxsの場所は違う場合があるので、実際の環境に合わせる。 <pre> $ ./configure.rb --with-apxs=/usr/sbin/apxs $ make $ su # make install </pre> <p>次に設定ファイルを書く。 <p>Apacheをソースからインストールした場合は、/usr/local/apache2/conf ディレクトリにmod_ruby.confファイルを作成する。Red Hat Linux 9の場合は/etc/httpd/conf.dディレクトリにmod_ruby.confファイルを作成する。 <p>httpd.confに次の一文を追加する。 <pre> Include conf/mod_ruby.conf </pre> <p>mod_ruby.confの内容は、例えば、次のようにする。ここでは拡張子rbxを持つファイルをmod_rubyスクリプトとして実行するようにしている。拡張子は何でもいいが、他の種類のファイルと被らないほうがいいだろう。 <p>LoadModuleディレクティブで、Apacheの起動時にモジュールをロードする。 <pre> LoadModule ruby_module modules/mod_ruby.so &lt;IfModule mod_ruby.c> RubyRequire apache/ruby-run &lt;Files *.rbx> SetHandler ruby-object RubyHandler Apache::RubyRun.instance &lt;/Files> RubyRequire auto-reload &lt;/IfModule> </pre> <p>設定ファイルが書けたらApacheを再起動する。Red Hat Linux の場合は次のようにする。 <pre> # /etc/rc.d/init.d/httpd restart </pre> <p>ソースからインストールした場合は、次のようにする。 <pre> # /usr/local/apache2/bin/apachectl restart </pre> <h2>HTMLデータの出力</h2> <p>いくつか小さなmod_rubyスクリプトを作ってみる。mod_rubyスクリプトには実行許可を与えておかないといけない。 <p>標準出力への出力は、Webサーバーを通じてクライアントへ送信される。CGIと異なり、出力はすべてHTTPプロトコルのmessage-bodyとして扱われる。message-header(ヘッダ)は自動的に付加される。 <pre> print <span style="color:#660066">&quot;foo\n&quot;</span> </pre> <p>明示的に標準出力オブジェクトが必要な場合は、<code>$stdout</code>を使う。<code>STDOUT</code>に出力すると、単に捨てられて、何も出力されない。 <h2>ヘッダの指定</h2> <p>mod_rubyでは、暗黙のうちにApacheモジュールが定義されている。Apacheモジュールのrequestプロパティ(Apache::Requestクラス)は、リクエストまたはレスポンスヘッダなどを格納する。 <p>出力するHTTPヘッダを指定するには、Apache.request.headers_out、content_typeプロパティなどに値を設定する。headers_outプロパティは、Apache::Tableクラスのオブジェクト。 <p>ヘッダを出力するには、Apache::Request#send_http_headerメソッドを呼び出す。 <pre> 4| r = Apache.request 5| r.status_line = <span style="color:#660066">&quot;301 Moved Permanently&quot;</span> 6| r.headers_out[<span style="color:#660066">&quot;Location&quot;</span>] = <span style="color:#660066">&quot;http://www.yahoo.co.jp/&quot;</span> 7| r.content_type = <span style="color:#660066">&quot;text/html; charset=EUC-JP&quot;</span> 8| r.send_http_header() 9| 10| print <span style="color:#660066">&quot;&lt;html&gt;&lt;body&gt;移動しました。&lt;/body&gt;&lt;/html&gt;&quot;</span> </pre> <h2>CGIライブラリを使う</h2> <p>CGIライブラリは、CGIインターフェイスとmod_rubyの違いをある程度は吸収してくれる。次のサンプルは、CGIでもmod_rubyでも動く。 <pre> 4| require <span style="color:#660066">&quot;cgi&quot;</span> 5| 6| cgi = CGI.new 7| print cgi.header(<span style="color:#660066">&quot;text/html&quot;</span>) 8| print &lt;&lt;EOF 9| <span style="color:#660066">FOO BAR BAZ</span> 10| <span style="color:#660066">テキストのサンプル</span> 11| <span style="color:#660066">EOF</span> </pre> <p>CGI#header()は、CGIのときはヘッダを文字列として返し、mod_rubyのときは内部でsend_http_headerする(何も返さない)。CGI#header()の戻り値の文字列を加工したりするようなスクリプトは、mod_rubyではそのままでは動かない。 <h2>外部リンク</h2> <ul> <li><a href="http://arika.org/doc/debuan.mod_ruby">夏原稿2001 〜 mod_ruby入門?</a> </ul> </div> <!-- /.col-sm-9 --> <div class="col-md-3 col-lg-3"> <aside id="search-3" class="widget widget_search" style="min-width:190px"> <!-- SiteSearch Google --> <script> (function() { var cx = 'partner-pub-1525727753584386:4800454915'; var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true; gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//cse.google.com/cse.js?cx=' + cx; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s); })(); </script> <gcse:searchbox-only></gcse:searchbox-only> <!-- /SiteSearch Google --> </aside> <aside class="widget" style="margin:15px 0 15px 0"> <!-- Go to www.addthis.com/dashboard to customize your tools --> <div class="addthis_sharing_toolbox" style="width:180px"></div> </aside> <!-- レスポンシブ広告1 --> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- www用縦型広告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1525727753584386" data-ad-slot="5374949488" data-ad-format="auto" data-full-width-responsive="true"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </div><!-- /.col-sm-3 --> </div><!-- /.row --> </div><!-- end container --> <footer id="footer"> <div class="container"> <p style="margin-bottom:1em;"> <a href="/profile.rhtml">[About / Contact]</a> &nbsp; <a href="/privacy.rhtml">[Privacy Policy]</a> &nbsp; <a href="/copyright.rhtml">[Legal &amp; Link]</a> &nbsp; <a href="/sitemap.rhtml">[サイトマップ]</a> </p> <p style="float:right"><img src="/images/banner.png" /></p> <address> Netsphere Laboratories &nbsp; https://www.nslabs.jp/<br /> Copyright (c) Hisashi HORIKAWA. All rights reserved. </address> </div> </footer> <!-- あ --> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10