CGIで動くプロデルWebアプリを公開する


VPS上にWebサーバを立ち上げて、CGIで動くプロデルWebアプリを公開してみましたので、その時の方法をご紹介します。

基本構成

今回は、Linux系のサーバでプロデルWebアプリを動かしてみます。サーバOSには、CentOSを使います。UbuntuでもOK(のはず)です。VPSは月額360円ほどで試せるWebARENA VPSクラウドを使ってみました。

  • VPS
  • CentOS 7.4
  • Apache 2.4 (Let’s EncryptのSSL設定済み)
  • Mono 5.20.1 Stable
  • プロデルmono版(1.6.961)

Linuxでは.NET Frameworkに相当するMonoという実行環境でプロデルを動かせます。安定したサーバとして利用できるようにWebサーバにはApacheを使うことにします。プロデルmono版には、FastCGIモジュールが含まれていますのでApacheなどFastCGIが利用できるWebサーバであれば、快適にプロデルWebアプリを実行できます。

CentOS/Apache/Monoのインストール

VPSの多くのサービスでは、インスタンスを作成する際にOSイメージを指定できます。WebARENA VPSクラウドでもいくつかのイメージからインスタンスを選択できました。今回は、CentOS 7.4のイメージからインスタンスを作成しました。VPSサーバへのSSHログイン方法やセキュリティ設定などの説明ついては、「CentOS」で検索すると多くの解説資料が出てくるので、設定方法は省略します。Webサーバを設定する所から紹介します。

yumを使って、サーバにApacheをインストールします。FastCGIという機能を利用するためmod_fcgidモジュールもインストールします。

yum -y install httpd mod_fcgid

次にMonoをインストールします。サーバ用モジュールであるxspも必要ですのでインストールします。

https://www.mono-project.com/download/stable/#download-lin-centos

rpm --import "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'
yum -y install mono-complete mono-locale-extras xsp

プロデルmono版のダウンロード

プロデルmono版をダウンロードします。

https://rdr.utopiat.net/files/mono.html

プロデルをダウンロードし解凍して、/usr/lib/ディレクトリへ移動します。

wget https://rdr.utopiat.net/files/mono/produire-mono-1.6.961.tar.gz
tar xvf produire-mono-1.6.961.tar.gz
mv produire-mono /usr/lib/
cd /usr/lib/produire-mono/
mv /usr/lib/produire-mono/Samples/公開フォルダ/ /var/www/html/samples/

httpd.confを設定します

/etc/httpd.confには、次のように指定します。ExecCGIでCGIを利用可能にして、AddHandlerおよびFCGIWrapperを指定して.rdrファイルをWebアプリとして実行可能にしておきます。

<Directory "/var/www/html/">
    Options ExecCGI FollowSymLinks
    AllowOverride All
    Require all granted

    Addhandler cgi-script .cgi
    AddHandler fcgid-script .rdr
    FCGIWrapper "/usr/bin/mono /usr/lib/produire-mono/rdrcgi-mono-fastcgi.exe" .rdr

    DirectoryIndex index.rdr index.html index.htm
</Directory>

※バーチャルホスト環境下でLet’s Encryptのcertbotを使ってSSL証明書を登録した場合、443ポート用に.confファイルが別に生成されるようです。設定を書くべき.confファイルの場所には注意してください

systemctl reload httpd

プロデルWebアプリの配置

次のようなプログラムを保存して、アプリが実行されるか確認してみます。

cd /var/www/html/
vi test.cgi
chmod 755 test.cgi

test.cgi (パーミッションは755)

#!/usr/bin/mono /usr/lib/produire-mono/rdrcgi.exe
応答として「<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
現在は、[時刻]です。
</body></html>
」を送る

保存したらWebブラウザで「https://(サーバのホスト名)/test.cgi」にアクセスしてみてください。設定がうまくいくと時刻が表示されます。

標準的なLinuxの環境では、以上の方法でうまく表示されますが、CentOSのデフォルトの環境下ではうまく表示されません。その時の対処方法を後ほどの「トラブルシューティング」にまとめました。

また.cgiファイルでは、ページを読み込む度にプロデルのライブラリが読み込まれるため、表示までに時間がかかります。そこでmod_fcgidを使って.rdrで動かしてみます。設定作業は済んでいますので、拡張子を.rdrに変えれば動作します。

test.rdr (パーミッションは644)

応答として「<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
現在は、[時刻]です。
</body></html>
」を送る

トラブルシューティング

CentOSではSELinuxが有効になっています。そのためWebサーバでプログラムを動かすために必要な機能に権限がなくて拒否されることがあります。うまく動かないときは次の点を確認してみて下さい。

1. エラーログ(/var/log/http/ssl_error.logなど)に次のようなメッセージが残っている場合は、パーミッションが577などになっているか確認して下さい。

AH01215: (13)Permission denied: exec of

2. CGIを使えるようにドキュメントルートのコンテキストを変更します。

chcon system_u:object_r:httpd_sys_script_rw_t:s0 /var/www/html -R

同様にプロデルmono版のコンテキストも変更します。

chcon system_u:object_r:lib_t:s0 /usr/lib/produire-mono/ -R

3. SELinuxのログ(/var/log/audit/audit.log) を確認して「denied { execmem }」などとあれば、monoがCGIで実行できるようにブールを変更します。

setsebool -P httpd_execmem 1

(この設定をオンにすると、バッファオーバーフローを使った攻撃などに弱くなるので、サーバのプログラムを常に最新にするなど対策してください)

自分で試した限りでは上記の設定変更で正しく動くようになりました。

プロデル付属サンプル

今度は、プロデルに付属するサンプルを開いてみましょう。

https://(サーバのホスト名)/samples/

でアクセスすると、サンプルのトップページが表示されます。それぞれ簡単なサンプルになっていますので、プログラムと比較しながら開いてみて下さい。

まとめ

Apacheやmonoのインストールよりも、CGIを動かせるようにSELinuxの設定を直すのに苦労してしまいました。サーバでプロデルCGIを利用してみたい方の参考になれば幸いです。次(?)はちょっとしたWebアプリを作ってみようと思います。


別の構成で公開する方法も掲載しました。
関連記事: CentOS/Apache環境下でプロデルWebサーバを公開する

  • いいね (1)
  • 続きを読みたい (3)

コメントを残す