wiz.code

CentOSのASP.NETで苦戦

このページの記事は前ページから続いています。

XSPのインストール

Monoのインストールが終わったので、ASP.NETを動かすためのXSPをインストールします。 Mono Projectのインストール方法を解説するページのUsageに、こんな表記を見つけました。

The module mono-xsp4 should be installed for running ASP.NET applications.

monoインストールのログ

「ASP.NETアプリケーションを実行するには mono-xsp4 をインストールしないとだめだよ」と読みました。 Monoに引き続き、XSPのインストールもできるっぽいです。 てか、mono-completeには含まれていないのかな? 端末のログを少し遡って探してみます。

xspをインストール

インストールされた項目の中にはそれっぽいものがありませんね。 んじゃ、インストールしましょう。

# yum install mono-xsp4
xspインストール失敗

「パッケージ mono-xsp4 は利用できません。」

むむ…。 そういえば、Usageの他の項目は「package」って書いてあるけど、「mono-xsp4」だけ「module」になってるな。 パッケージじゃないから、yumからはインストールできないのか?

Mono Projectに各WebサーバーでASP.NETを使う方法が解説されてた。 "ASP.NET hosting with Apache"のところを見ると次のように書いてある。

The mod_mono Apache module is used to run ASP.NET applications within the Apache web server.

「Apacheのモジュールである"mod_mono"は、ApacheでASP.NETアプリケーションを実行するときに使いますよ。」 その次。

The mod_mono module runs within an Apache process and passes all the requests to ASP.NET applications to an external Mono process that actually hosts your ASP.NET applications. The external ASP.NET host is called “mod-mono-server” and is part of the XSP module.

「Apacheプロセスのmod_monoモジュールは、リクエストをすべてASP.NETへ送り、外部のMonoプロセスが実際にホストされているYouのASP.NETアプリケーションを処理する。」 (翻訳、だんだん自信なくなってきた)

「外部のASP.NETホストは"mod-mono-server"と呼ばれ、それはXPSモジュールの一部です」(あってる?)

え~っと…つまり。 Apacheにリクエストが届く。 それが、monoのプロセスに送られる。 それを処理するのは、XPSモジュールで"mod-mono-server"と呼ばれている、ってこと??

で…、XPSのインストール方法は?

"ASP.NET hosting with XSP"のセクションを見てみよう。

XSP is a standalone web server written in C# that can be used to run your ASP.NET applications with minimal effort. XSP works under both the Mono and Microsoft runtimes. The code is available from our download page (look for XSP web server) or from the git repository (module name: xsp).

えぇ…っと。 「XPSはスタンドアロンWebサーバーで、C#で書かれていて、YOUのASP.NETアプリケーションを実行できて、最少のエフォートですよ。」 「XPSはMonoとMicrosoftの両ランタイムの下で働きますよ。」 「コードは私たちのダウンロードページ(XSP web server参照)か、GITリポジトリから利用できますよ。(モジュール名は xsp ね)」。

む…、GITリポジトリが必要か。 いや、その前に、モジュール名は「xsp」だと書いてある。 一度、yum install xsp で試してみよう。

xspパッケージを検索
# yum install xsp

あ、出てきた。 EPELリポジトリのもので、Version 4.2だけどいいのかな…。

まぁでも、mono-xsp4って書いてあったからいいんだな。 続行。

XSPのインストール完了。

mod_monoモジュール

mod_monoをインストール

あとはApacheのmod_monoモジュールだね。 yum list で mod_monoを探したら見つかったので、インストール。

# yum install mod_mono
mod_monoインストール完了

こっちはちゃんと、mono-projectからインストールされます。 [y]で続行して、インストール完了。

ASP.NETの動作確認

準備はこれでいいのかな…。 んでは、/var/www/html/に「.aspx」ファイルを作成して、呼び出してみよう。

cdでディレクトリを移動

まず、端末でディレクトリを移動。 これは、Windowsと同じく「cd」でいけた。

# cd /ver/www/html/
index.aspxを作成

次にファイル「index.aspx」をviコマンドで作成。

ASP.NETが処理する<%@ Page %>ディレクティブを使ってページを定義します。 次のようなソースで動作するか確認。

<%@ Page Language="C#" %>
<!DOCTYPE html>
<html lang="ja">
<body><asp:Label runat="server" Text="ASP.NET is ok!" /></body>
</html>
index.aspxの中身

書き終わったら保存[:w]して終了[:q]。

Apacheを再起動

index.aspxファイルが作成されました。 ファイルアイコンがブラウザっぽい感じになっているあたり、うまくいきそうで期待しちゃいます。

<asp:Label runat="server" Text="ASP.NET is ok!" /> が処理されれば、<span>タグとしてテキストが出力されるはずです。

おっと、その前にApacheを再起動しておきます。

# systemctl restart httpd.service

再起動完了。 では、ブラウザで開くぞっ!

Service Unavailable

orz...

Apacheが……息をしていない……。

Apacheのエラーログ

Apacheのログを確認します。 ログはどこかな…。 httpd.confを確認したらエラーログのディレクトリとして「/logs/error_log」が指定されていました。 ん…? そんなディレクトリないぞ…。

ログがあるっぽいディレクトリ

/var/log/httpd/というディレクトリを見つけたけど、権限がなくて見られない。

端末でログディレクトリに移動

ならば、端末から移動。

# cd /var/log/httpd/

このディレクトリのファイル一覧を表示したいわけだけど、これは「ls」コマンドを使うらしい。 Windowsの「dir」コマンドと同じかな。

lsコマンドでファイルを列挙
# ls

「access_log」と「error_log」の2つのファイルがある。 error_logをviで見てみる。

# vi error_log

最後のエラーは次の通り。

"Failed to connect to mod-mono-server after several attempts to spawn the process."

mod-mono-serverに接続できないって言ってる。 前述のエラーは、SELinuxが有効になっていると発生することがある、という記事を見つけました。 SELinuxが実行されているかどうかを確認します。

SELinuxの稼働確認
# getenforce
Enforcing

む、"Enforcing"ってことは稼働中。 これが原因か? SELinuxはアクセス制限を管理しているものだから、不用意に止めない方がいいのだろうけど、ここは一旦停止してASP.NETを処理させることを優先。

SELinuxを停止
# setenforce 0

これで無効化されたはず。

Apacheを起動

次に、Apacheを起動します。

# systemctl start httpd.service

もう一度、XSPをインストール

やっぱりApacheが動きません。

error_logをもう一度よく見たら "Failed running '/usr/bin/mod-mono-server2 --filename ...... Reason: No such file or directory"というエラーもありました。 mod-mono-server2 が見つからない…?

/user/bin/ の中を確認します。 うん。ありません♪

やっぱり、XSPのインストールが間違っていたのかなぁ…。 XSPがちゃんとインストールされているかどうか、コマンドを打って確認します。

XSP4のバージョン情報
# xsp4 --version

コマンドはちゃんと応答してますね。 .NET 4.0ってところが少し不安ですが。

ルートからファイルを検索したら「mod-mono-server4」というのが見つかりました。 あれ、「server2」じゃなくて「server4」? ファイルのあるディレクトリは「/usr/bin/」になってる。 Apacheの起動過程のどこかで、読み込むファイルを指定しているところがあるんだろうけど…。 httpd.confと、MonoのApacheに関する設定が書かれた mod_mono.conf の中を見てもそういった設定値は見当たらない。

いろいろ調べていると、少し気になる点を発見。 それは、XSPのバージョン情報の中にある「Novell, Inc.」という表記。 Novellは以前XSPを開発していたところで、現在はMonoと同じくXamarinに移行している、とのこと。 ということは、XSPのバージョンが古い、という可能性。

そもそもEPELリポジトリは、Remiリポジトリの依存性関連として登録されたので、リポジトリ自体の情報が古いのかも?

というわけで、EPELリポジトリをちゃんと登録してみます。

EPELリポジトリを更新
# yum install epel-release

更新完了。

XSPを更新 ... できず

続いて、XSPを更新してみます。 パッケージの更新は、yum update <パッケージ名>でよいようです。

# yum update xsp

む…。 No packages marked for update. と言われました。 アップデートはない、ということですね。

だんだん手詰まりになってきたぞ…。 もう一回、Mono Projectで情報を探そう。

すべてはMono Projectの中に…

Mono ProjectのWebサーバーにmonoを自動設定する方法を解説するページに、 mod-mono-server4を指定する方法が載ってた! これを、mod_mono.confに追記すればいいのかな。

mod_mono.confを編集

細かい手順を飛ばしてしまいますが、viコマンドでmod_mono.confを開いて、次の行を追加しました。

MonoServerPath "/usr/bin/mod-mono-server4"

(補足)mod_mono.confは/etc/httpd/conf.d/ディレクトリの中にあります。 conf.dは、Apacheの設定が自動的に読み込まれるディレクトリです。

そして、Apacheを再起動。

# systemctl restart httpd.service

今度こそ……っ!!

ASP.NET稼働確認!

キター!!!

ソースも確認!

HTMLソースを見ても、ASP.NETのコードが処理されていることが分かります。 いや~、よかったよかった。

この章のまとめ

  • ApacheからXSPに要求を通すには、mod_monoを使う。
  • CentOSにはSELinuxというアクセス制限を管理するサービスが動いている。
  • ASP.NETを使うとき、SELinuxが障害となる場合がある。
  • mod_mono_server#が見つからないときは、mod_mono.confにMonoServerPathでパスを指定する。
  • cdコマンド:端末で開くディレクトリを変更する。
  • lsコマンド:ディレクトリ内のファイル一覧を表示する。
  • getenforceコマンド:SELinuxの状態を表示する。
  • setenforseコマンド:SELinuxの稼働を制御する。