• このエントリーをはてなブックマークに追加


ss-1417755885

はじめに

手元のマシンで「http://localhost/docs/*.md なファイルを HTML に変換して表示」なことが Webサーバレベルで簡単にできないかな,とか思ってたところ,次のエントリに到達:

なんだかお手軽そうな印象を受けたので,ちょっと試してみました.まぁそもそも nginx に ngx_mruby モジュールが入っていないので,それを入れるところから,ですが.

以下,そんな記録です.

インストール

ngx_mruby のソースコードのパス
$HOME/local/src/ngx_mruby.git
nginx のソースコードのパス
$HOME/local/src/nginx/1.6.2
nginx のインストール先
$HOME/local/nginx/1.6.2

参考

準備

ビルド時にライブラリがないって怒られたので,このあたりを追加:

% brew install hiredis
% brew unlink markdown
% brew install discount

Discount:

それぞれのソースコードを準備する

nginx:

% cd $HOME/local/src/nginx
% curl -LO "http://nginx.org/download/nginx-1.6.2.tar.gz"
% tar xvf nginx-1.6.2.tar.gz
% mv nginx-1.6.2 1.6.2

ngx_mruby:

git clone git://github.com/matsumoto-r/ngx_mruby.git $HOME/local/src/ngx_mruby.git
cd $HOME/local/src/ngx_mruby.git
git submodule init
git submodule update

ngx_mruby をビルドする

冒頭のエントリでは,コード中に Discount クラスが出てきてますが,mruby をそのまま入れたのでは利用できないため,build_config.rb 内 1行のコメントを外して利用できるようにします:

diff --git a/build_config.rb b/build_config.rb
index c5d32c5..74a3576 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -38,7 +38,7 @@ MRuby::Build.new do |conf|
   conf.gem :github => 'matsumoto-r/mruby-ngx-mruby-ext'
 
   # use markdown on ngx_mruby
-  #conf.gem :github => 'matsumoto-r/mruby-discount'
+  conf.gem :github => 'matsumoto-r/mruby-discount'
 
   # Linux only for ngx_mruby
   #conf.gem :github => 'matsumoto-r/mruby-capability'

ビルドします:

% ./configure \
    --with-ngx-src-root=$HOME/local/src/nginx/1.6.2 \
    --with-ngx-config-opt="--prefix=$HOME/loca/nginx/1.6.2"
% make build_mruby
% make generate_gems_config

nginx をビルド&インストールする

--add-module オプションで先にビルドした ngx_mruby を指定します:

% ./configure \
    --prefix=$HOME/local/nginx/1.6.2 \
    ...
    --add-module=$HOME/local/src/ngx_mruby.git
% make
% make install
% $HOME/local/nginx/1.6.2/bin/nginx -V                                                                                                                                                                                                   1 ↵
nginx version: nginx/1.6.2
built by clang 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
TLS SNI support enabled
configure arguments: --prefix=/Users/issm/local/nginx/1.6.2 ... --add-module=/Users/issm/local/src/ngx_mruby.git

nginx が入りました.

Hello

とりあえず nginx.confserver コンテキストに次のようなものを追記:

location /mruby {
    mruby_content_handler_code '
        if server_name == "NGINX"
          Server = Nginx
        elsif server_name == "Apache"
          Server = Apache
        end
 
        Server::rputs "Hello #{Server::module_name}/#{Server::module_version} world!"
    ';
}

再起動後,http://localhost/mruby へリクエストすると,次のようになりました:

ss-1417749440

curl で:

% curl -i http://localhost/mruby
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 05 Dec 2014 05:31:44 GMT
Content-Length: 28
Connection: keep-alive
 
Hello ngx_mruby/1.6.7 world!

*.md なものを変換して HTML として返す

先と同様に,nginx.confserver コンテキストに次のようなものを追記:

location ~ \.md$ {
    mruby_output_filter_code '
        if server_name == "NGINX"
          Server = Nginx
        elsif server_name == "Apache"
          Server = Apache
        end
 
        r = Server::Request.new
        f = Server::Filter.new
 
        css = "https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css"
        title = "markdown"
        md = Discount.new css, title
 
        r.content_type = "text/html; charset=utf8"
        f.body = md.md2html f.body
    ';
}

再起動.

Markdown ファイル

次のようなファイルを,$root/hello.md として置きます:

# Hello markdown via ngx_mruby!
 
はろー!
 
* this
* is
* list

結果

http://localhost/hello.md へリクエストすると,次のように返ってきました:

ブラウザ:

ss-1417755885

curl:

% curl -i http://localhost/hello.md
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 05 Dec 2014 05:02:39 GMT
Content-Type: text/html; charset=utf8
Content-Length: 541
Last-Modified: Fri, 05 Dec 2014 05:01:31 GMT
Connection: keep-alive
ETag: "54813c2b-42"
Accept-Ranges: bytes
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>markdown</title>
<link rel="stylesheet" href="https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css" type="text/css" />
</head>
<body>
<a name="Hello.markdown.via.ngx_mruby."></a>
<h1>Hello markdown via ngx_mruby!</h1>
 
<p>はろー!</p>
 
<ul>
<li>this</li>
<li>is</li>
<li>list</li>
</ul>
 
</body>
</html>

ただ,ブラウザでの場合,Command + r でリロードするたびに表示されたりされなかったり「接続できませんでした」になったりと,なんだか不安定な感じでした.curl コマンドではそんなことはないですね.よくわからない.

おわりに

以上,nginx にngx_mruby モジュールを組み込んで,Discount 経由で Markdown 記法を変換して表示するなど,少しだけ触ってみた記録でした.

nginx の挙動を,ruby のコードで記述することができるありがたみを実感できた気がします.ruby ほとんどわかってませんが.

今回試した設定・コードでは,Discount では ``` によるコードブロック表記など,Github や Bitbucket とかで常用するような記法を利用できませんでした.拡張できるのかな?そのへん何かよい情報がないかどうか,今後さがしてみたいところです.