Mono 2.8上でSmart.Web.Mobileを使ってみる

最近、ちまちまとMonoを試していたのでメモ。


Monoも、Linux上でyumやapt-get一発で最新版がインストールされるようになると、もう少し弄ってみる気になるんですが(・ω・)
手動インストールも一つや二つなら良いんですが、依存関係が多くなってくると面倒で(´・ω・`)
…などと思いつつWebをブラブラしていたら、インストール用のスクリプト*1を作っている人が居たので、MonoでASP.NET 4.0する環境を自分も作ってみました。
元情報はこちら。
Setting up Mono 2.8 with Asp.Net 4.0 and MVC2 on Ubuntu with MySql Membership
スクリプトUbuntu用とFedora用があるみたいですが、今回はUbuntuで試してみました。*2

Ubuntu

まずはUbuntuの用意から(・ω・)
自分はVMwareを使ってVM上に環境を構築。
Ubuntu Server 10.04をダウンロードしてきてインストール。
以下、Ubuntu Serverのインストールについてざっくりと(・ω・)

  • VMUbuntu Linux (64-bit)で作成
  • インストール開始、Languageは日本語
  • キーボードは適当なのを選択、なんとなくMicrosoft Natural Wireless Ergonomic Keyboard 7000とかで、レイアウトはJapanで
  • ネットワークはDHCPで入れて後で固定に変更
  • パーティションとかはデフォルトでディスクに書き込み
  • ユーザー名、パスワードを入れて、ホームディレクトリの暗号化はしない
  • プロキシを入力、自動アップデートは無しで、ソフトウエアの選択ではOpenSSH serverのみを選択しておく
  • ブートローダーはデフォルト

これでインストールは完了(・ω・)
ついで初期設定。

とりあえずIPアドレスを固定に変更。

sudo vi /etc/network/interfaces
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address x.x.x.x
netmask x.x.x.x
gateway x.x.x.x
sudo /etc/init.d/networking restart

ついでソフトウエアを最新版に更新。

sudo apt-get update
sudo apt-get upgrade

VMware Toolsのインストールについては省略。
これでOSの準備はOK、次はMonoのインスコ(・ω・)

Mono

GitHubからインストールスクリプトを取得して実行。

wget --no-check-certificate https://github.com/nathanb/iws-snippets/raw/master/mono-install-scripts/ubuntu/install_mono-2.8.sh
chmod +x install_mono-2.8.sh
./install_mono-2.8.sh

コンパイルに時間がかかるのでしばらくおやつタイム(・∀・)
コンパイルが終わったら、/etc/environmentにパスを追加。

sudo vi /etc/environment
PATH="/opt/mono-2.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

GUI周りをインストールするとMono 2.4が入るようですが、自分で入れた2.8を優先するように設定。
っで、設定を反映させた後で実行結果の確認。

machi@vm-mono-ubuntu:/srv/www$ mono -V
Mono JIT compiler version 2.8 (tarball 2010121日 水曜日 18:19:26 JST)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       altstack
        Notifications: epoll
        Architecture:  amd64
        Disabled:      none
        Misc:          debugger softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC and Parallel Mark)

MonoのインストールまではこれでOK。
後はApacheでmod_monoを有効にするための設定を。

cd /etc/apache2
sudo mv mod_mono.conf mods-avail*
sudo ln -s /etc/apache2/mods-available/mod_mono.conf /etc/apache2/mods-enabled/mono.conf
sudo service apache2 restart

Ubuntuだと設定ファイルが細かく管理されてんのね(・ω・)

Webアプリ

次にアプリケーションの設定を。
今回はSmart.Web.Mobileのサンプルと、それとは別に新規作成したWebアプリケーションの2つを、別アプリケーションプールに配置するような設定にしてみます(・ω・)
Smart.Web.Mobileのサンプルと、新規に作成したWebアプリケーションをそれぞれVisual Studio 2010でビルドしておきます。


っで、サーバ上の設定については、/srv/wwwディレクトリ下を各アプリ用の仮想ディレクトリとして使用する事にします。
まずはディレクトリを用意して。

sudo mkdir /srv/www

次に、この下にビルドしたアプリケーションを配置します。
今回はSmart.Web.Mobileのサンプルをmobileディレクトリに、新規に作成したWebアプリケーションをsampleディレクトリに配置します。
っで、配置が終わったら権限をば設定。

sudo chown root:www-data /srv/www -R
sudo chmod 775 /srv/www -R

こんな状態になっていればよかとですたい(・ω・)

machi@vm-mono-ubuntu:/srv/www$ ls -al
合計 24
drwxr-xr-x  6 root www-data 4096 2010-12-02 18:57 .
drwxr-xr-x  4 root root     4096 2010-12-02 18:24 ..
drwxr-xr-x 16 root www-data 4096 2010-12-02 17:03 mobile
drwxr-xr-x 11 root www-data 4096 2010-12-02 18:56 sample

machi@vm-mono-ubuntu:/srv/www$ ls -al mobile/
合計 92
drwxr-xr-x 16 root www-data 4096 2010-12-02 14:03 .
drwxr-xr-x  6 root www-data 4096 2010-12-02 13:57 ..
drwxr-xr-x  2 root www-data 4096 2010-12-02 18:49 App_Browsers
drwxr-xr-x  3 root www-data 4096 2010-12-02 18:49 App_Data
drwxr-xr-x  2 root www-data 4096 2010-12-02 18:49 Content
...

そして仮想ディレクトリの設定を行います。

sudo vi /etc/apache2/sites-available/mono.conf

内容についてはこんな感じで。

Alias /mobile/ "/srv/www/mobile"
Alias /sample/ "/srv/www/sample"
#Alias /sample2/ "/srv/www/sample2"

AddMonoApplications mobile "/mobile:/srv/www/mobile"
AddMonoApplications sample "/sample:/srv/www/sample"
AddMonoApplications sample "/sample:/srv/www/sample2"

MonoServerPath mobile "/opt/mono-2.8/bin/mod-mono-server4"
#MonoDebug mobile true
MonoSetEnv mobile MONO_IOMAP=all

MonoServerPath sample "/opt/mono-2.8/bin/mod-mono-server4"
#MonoDebug sample true
MonoSetEnv sample MONO_IOMAP=all

<Location "/mobile">
    MonoSetServerAlias mobile
    SetHandler mono
</Location>

<Location "/sample">
    MonoSetServerAlias sample
    SetHandler mono
</Location>

#<Location "/sample2">
#    MonoSetServerAlias sample
#    SetHandler mono
#</Location>

mobileとsampleの2つのアプリケーションプールを作って、Smart.Web.Mobileのサンプルと新規作成したサンプルをそれぞれに設定する感じ(・ω・)
っで、sites-enabledの方にもリンクを張って再起動。

sudo ln -s /etc/apache2/sites-available/mono.conf /etc/apache2/sites-enabled/000-mono.conf
sudo service apache2 restart

これで、http://server/mobile/にアクセスするとSmart.Web.Mobileのサンプルが、http://server/sample/にアクセスすると新規作成したサンプルにアクセスできることが確認できます(・∀・)
プロセスもこんな感じでMonoが動いている事を確認できます。

machi@vm-mono-ubuntu:~$ ps -aux | grep mono
www-data  1242  0.5  5.3 197356 55008 ?        Ssl  19:39   0:02 /opt/mono-2.8/bin/mono **debug /opt/mono-2.8/lib/mono/4.0/mod-mono-server4.exe **filename /tmp/mod_mono_server_mobile **applications /mobile:/srv/www/mobile **nonstop
www-data  1244  0.3  3.2 173100 33268 ?        Ssl  19:39   0:01 /opt/mono-2.8/bin/mono **debug /opt/mono-2.8/lib/mono/4.0/mod-mono-server4.exe **filename /tmp/mod_mono_server_sample **applications /sample:/srv/www/sample **nonstop

動作確認

ssbでの表示結果ですが、レスポンスヘッダの所を参照(・∀・)


まとめ

っで、これでLinuxサーバ上でMonoを使い、Smart.Web.Mobileを使ってガラケー向けサイトも作れるようになった(?)わけですが…。
ぶっちゃけ、公開サービスで.NETしたかったら、実際にはクラウドなりなんなり使えば良いと思うので、こんなことしないと思うんだけどね(・∀・;)
むしろ、イントラとかでLinux上に載らなければいけないケースで、でもWebアプリは.NETで作りたいな〜なんて時にはありかもしれない(`・ω・´)
色々動かしてみた感じ、思った以上に問題なく動く感じだし(・∀・)


今回はMonoDevelopは入れていないので、Visual Studio 2010上でビルドしたものをそのままサーバにコピーして実行しましたが。
出来れば、サーバ上で自動ビルド、自動テスト、自動デプロイまでの環境を構築したいところですね(・∀・)

*1:やっていることはダウンロード、makeのバッチ実行だけど。

*2:普段はCentOSを使っている自分なのでFedoraの方が填らなかったのかも(´д`;)