連載
» 2013年03月15日 13時24分 UPDATE

連載:MonoでOSSなASP.NET MVCアプリ:第1回 Mono×LinuxでASP.NET MVCを動かすまで (1/2)

オープンソースの.NET環境である「Mono」やオープンソース・データベースの「MySQL」を使って本格ASP.NET MVCサイトを実運用している筆者が、その環境の構築方法をレクチャーする連載がスタート。

[井口圭一,株式会社Ginger]
連載:MonoでOSSなASP.NET MVCアプリ
業務アプリInsider/Insider.NET

powered by Insider.NET

「連載:MonoでOSSなASP.NET MVCアプリ」のインデックス

連載目次

Mono概要

 本稿では、.NETと互換性のある「Mono」(後述)と、.NETからMySQLデータベースにアクセスできるADO.NETドライバの「MySQL Connector」というオープンソース環境を駆使した、ASP.NET MVCプロジェクト・サーバの構築方法を紹介する。

 Monoは、Xamarin社によりスポンサードされる、ECMA C#言語仕様ECMA CLI(Common Language Infrastructure)のオープンソース実装(C#コンパイラMono Runtime)だ。実際にはECMA標準にとどまらず、ASP.NETやADO.NETなどのマイクロソフトのフレームワークと高い互換性のある機能群を提供している。

 読者の中には、「本当にそのような環境が、本番サイトで利用できるのか?」と疑ってしまう人も少なくないのではないだろうか? 実は筆者の会社Gingerではネココレというソーシャル・ゲームを実際に運用し、安定動作しているという実績がある。

 その経験を生かして本稿では、Monoの環境をLinux上に構築し、Visual Studioで作成したASP.NET MVCプロジェクトを実際にブラウザからアクセスできるようにするところまでを紹介する。

 このような構成は、Linuxのサーバを運用しているが、.NETが得意な開発者がいる会社にはお勧めだ。特にスタートアップ企業であれば、マイクロソフトのBizSparkプログラム(=Visual Studio Ultimateなどの開発に必要な多くの製品が無償利用できる)も利用できる。この2つを併用すれば、開発から運用までを無償でそろえることも可能となる。

これから構築するサーバの構成

 実際のサーバ構築に入る前に、これから作成しようとするサーバの全体像を押さえておこう。図1に、マイクロソフト製品で構築した場合と、OSS(オープンソース・ソフトウェア)で構築した場合の環境の比較を示す。左側の環境はInsider.NETの読者にとってなじみ深いものだと思う。

図1 環境比較(左:マイクロソフト製品で構築した場合、右:OSSで構築した場合) 図1 環境比較(左:マイクロソフト製品で構築した場合、右:OSSで構築した場合)
Webサーバである「Apache」に「mod_mono」を入れてXSP(=C#で書かれた、ASP.NETが動作する軽量アプリケーション・サーバ)を動かし、MySQLデータベースにもアクセスできるようにしている。

 ここで一番の違いは、IISに相当する部分を見てほしい。IISは、HTTPリクエストを受け付けるWebサーバとしての機能と、ASP.NETなどのアプリを実行するアプリケーション・サーバとしての機能を一括して提供しているが、Monoで動かす場合には、この2つは明確に分離されることになる。

 本稿ではWebサーバとしての機能をApacheで、アプリケーション・サーバの部分はXSPというプログラムが担当することにする(XSPはWebサーバとしての機能もあり、開発用に使うこともできるが、アクセス制御などの機能面で実運用に適しているとはいえない)。また本連載の第2回では、MySQLデータベースへの接続も紹介する予定なので、そちらも参考にしてほしい。

ソースを取って来てコンパイル&インストール

 Linuxの各ディストリビューションにはMonoのパッケージが含まれているものもあるが、バージョンが古い場合もあるので、なるべくなら最新のソース・ファイルを取ってきてインストールすることをお勧めしたい。Monoのソースは「http://download.mono-project.com/sources/」にまとめられている。

 ASP.NET MVC の実行には、以下のパッケージが必要だ。

  • libgdi+: System.Drawing系の処理を行う場合に必要。
  • mono実行環境: Monoの最新バージョンは3.0系がリリースされているが、XSPはまだ2.10なので、ここではバージョンを合わせて2.10系を使用する。
  • XSP
  • mod_mono

 まずはこれらをダウンロードして展開しよう。Linuxのターミナル上で(rootで)下記のコマンドを実行する。

# cd /usr/local/src
# wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.tar.bz2
# wget http://download.mono-project.com/sources/mono/mono-2.10.9.tar.bz2
# wget http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2
# wget http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
# tar xjf libgdiplus-2.10.9.tar.bz2
# tar xjf mono-2.10.9.tar.bz2
# tar xjf mod_mono-2.10.tar.bz2
# tar xjf xsp-2.10.2.tar.bz2

各パッケージ(圧縮ファイル)をLinux上にダウンロードして、展開するために実行するコマンド

 上記のコマンドを全て実行すると、以下のようなファイルやディレクトリができているはずだ。

# ls -F
libgdiplus-2.10.9/  libgdiplus-2.10.9.tar.bz2  mod_mono-2.10/  mod_mono-2.10.tar.bz2  mono-2.10.9/  mono-2.10.9.tar.bz2  xsp-2.10.2/  xsp-2.10.2.tar.bz2

ダウンロード&展開されたパッケージ群

 次に実際にこれらのパッケージをコンパイルするわけだが、その前にこれらのパッケージに依存するパッケージを先にインストールしてしまおう。各パッケージのディレクトリ内で「./configure」コマンドを実行すれば足りないパッケージが指摘されるので、逐次、インストールしてもよいのだが、面倒なので以下に必要なパッケージを列記しておく。

 なおこの記事では、CentOS 6(64bit)上での実行を前提とするが、ほかディストリビューションでも必要とするものは大差ないので、適宜読み替えてほしい(コマンドや配置先などが一部異なる場合もある)。

  • gcc-c++.x86_64: 全てのコンパイルのために。
  • glib2-devel.x86_64: libgdi+のコンパイルに必要。
  • cairo-devel.x86_64: libgdi+でベクトルデータを扱うために必要。
  • libpng-devel.x86_64: libgdi+で PNGファイルを扱うために必要。
  • giflib-devel.x86_64: libgdi+で GIFファイルを扱うために必要。
  • libjpeg-devel.x86_64: libgdi+で JPEGファイルを扱うために必要。
  • libtiff-devel.x86_64: libgdi+で TIFFファイルを扱うために必要。
  • libexif-devel.x86_64: libgdi+で EXIFを扱うために必要。
  • httpd-devel.x86_64: mod_monoのコンパイルに必要。
  • bison.x86_64: monoのコンパイルに必要。
  • gettext.x86_64: monoのコンパイルに必要。

 上記のパッケージをインストールするには、下記のコマンドを実行すればい。

# yes | yum install gcc-c++.x86_64 glib2-devel.x86_64 cairo-devel.x86_64 libpng-devel.x86_64 giflib-devel.x86_64 libjpeg-devel.x86_64 libtiff-devel.x86_64 libexif-devel.x86_64 httpd-devel.x86_64 bison.x86_64 gettext.x86_64

依存パッケージ群をまとめてインストールするためのコマンド例
上記のコマンドでインストールできないパッケージがあった場合や、このほかにインストールが必要なパッケージがあった場合は(具体的には後述の「./configure」コマンド実行時に「You need to install <パッケージ名>.」のようなエラーが表示されたとき)、「yum list | grep <パッケージ名の一部(libjpegなど)>」というコマンドで、パッケージを探してから、「yum install <適切なパッケージ名(libjpeg-turbo-devel.x86_64など)>」というコマンドでパッケージをインストールし直せばよい。

 以上の手順により必要なパッケージがインストールできたら、各パッケージを順にコンパイルしていこう。

●libgdi+パッケージのコンパイル

 まずはlibgdi+パッケージからだ。Monoでは画像処理関係の機能(=System.Drawing名前空間に所属する機能)はMono本体とは独立して、「libgdi+」として提供されている。画像関係の処理を行わないのであれば、この項は飛ばしてもよいが、せっかくなのでコンパイルしておこう。

 ソース・ファイル群をコンパイルしてインストールする際の基本は、「./configure」「make」「make install」というコマンドを実行することだ。大抵のOSSはこれでインストールできる。ここでも基本にのっとって進めていく。

 まずはconfigureスクリプトを実行するためのコマンドを次の例のように実行する。configureスクリプトは、環境をチェックしてコンパイルに必要な設定を構成してくれる。

# cd /usr/local/src/libgdiplus-2.10.9
# ./configure

「./configure」コマンドの実行(libgdi+パッケージ)

 最後に、以下のように表示されれば成功だ。

Configuration summary

   * Installation prefix = /usr/local
   * Cairo = 1.8.8 (system)
   * Text = cairo
   * EXIF tags = yes
   * Codecs supported:

      - TIFF: yes
      - JPEG: yes
      - GIF: yes
      - PNG: yes

「./configure」コマンドの実行結果(成功例)(libgdi+パッケージ)

 パッケージの一部がインストールされていない場合は、(「yes」の部分が)「no」と表示され、その形式はサポートしない形でコンパイルされる。そのほか、何かパッケージが足りなければ、

configure: error: no acceptable C compiler found in $PATH

などと表示されるので(このエラー・メッセージはgccがインストールされていない場合の例)、エラー・メッセージの内容から必要なパッケージをインストールして、configureコマンドを再実行しよう。

 configureコマンドの結果に問題がなければ、

# make

コンパイルを行うコマンドの実行(libgdi+パッケージ)

というコマンドで実際のコンパイルを実行しよう。環境によるが、コンパイルには数分かかることもあるので、気長に待つことにしよう(筆者の環境では約7分かかった)。

 コンパイルが問題なく終われば(configureコマンドがエラーなく終わった状態でコンパイルしたのであれば、ほぼ間違いなくコンパイルは成功するはずだ)、

# make install

インストールを行うコマンドの実行(libgdi+パッケージ)

というコマンドで、コンパイル後のパッケージが「/usr/local/lib」ディレクトリにインストール(=コピー)される。その際、

If you ever happen to want to link against installed libraries ……

というメッセージが表示されるが、今回はMono本体のコンパイル時にパスを明示的に指定するので、取りあえず無視してもらって構わない。

       1|2 次のページへ

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。