前回、CGIを使ったプロデルWebアプリの公開方法について紹介しましたが、SELinuxの設定などいくつか煩雑な所があり、もう少し簡単にできないものかと考えてみました。その時のメモです。
今回は、Windows版のプロデルWebサーバをコンソール化したrdrwebserverc.exeと、Apache HTTP Server(以下Apache)のリバースプロキシを使って、プロデルWebサーバを公開する方法をまとめました。
なおmonoのインストールやmono版プロデルについては前回の記事で紹介していますので、そちらもご覧下さい。
rdrwebserverc.exeは、コンソール版のプロデルWebサーバ(以下単にプロデルWebサーバ)です。CGI版と動作は同じですが、プロデルのプログラムを実行するだけでなく、簡易Webサーバの機能も備わっています。rdrwebserverc.exeは、mono版プロデルに同梱しました。
今回、rdrwebserverc.exeをサービス化してApacheとは別に常駐させておきます。Apacheにリバースプロキシを設定して、特定のアドレスへアクセスしたときにApacheからプロデルWebサーバへアクセスを仲介するように設定します。
このような構成することで、画像やCSSなどのファイルダウンロードや、アクセス権限などの表のWebサーバの機能はApacheに任せつつ、Webアプリの処理だけはプロデルWebサーバで行う形態にすることができます。またCGIと比べて表示時間が短くなり、SELinuxも最低限リバースプロキシ権限を与えればよいので、サーバ全体のセキュリティもある程度確保できます。
(厳密には、プロデルWebサーバがSELinuxのhttpdコンテキストの管理外になるのでセキュリティ面をよく吟味する必要があります。monoを常に最新版に更新したり、サーバが不正に操作されないように公開するWebアプリを注意深く作る必要があります)
プロデルWebサーバのサービス化
プロデルWebサーバを常駐させるために新しくサービスを作成します。サービス化すると、プロデルWebサーバの起動をOSが管理してくれるので、例えばサーバを再起動した時やプロセスが終了してしまったときに自動的に起動しなおしてくれます。
まずはrdrwebserver.serviceファイルを作成します。
vi /etc/systemd/system/rdrwebserver.service
rdrwebserver.service
[Unit]
Description=Produire Web Server
[Service]
WorkingDirectory=/var/www/html/
ExecStart=/usr/bin/mono /usr/lib/produire-mono/rdrwebserverc.exe -droot /var/www/html/samples/ -port 6543
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=rdrwebserver
User=apache
[Install]
WantedBy=multi-user.target
プロデルWebサーバは、ポート番号6543で受け付けることにします。ドキュメントルートは、テストしやすさからApacheと同じ/var/www/html/samples/にしました。(必要に応じて場所を変えてください)
保存したら、systemctlでサービスを登録して、起動してみます。
systemctl enable rdrwebserver
systemctl start rdrwebserver
なお、プロデルWebサーバは、サーバ内部のApacheのプロセスからのみアクセスされるので、ファイアウォールのポート(6543)は閉じたままで構いません。
Apacheのリバースプロキシの設定
次にhttpd.confにリバースプロキシの設定を加えます。次の設定では、http://(ホスト名)/apps/ にアクセスするとプロデルWebサーバが公開するページへ仲介されます。
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /apps http://127.0.0.1:6543
ProxyPassReverse /apps http://127.0.0.1:6543
ServerName www.example.com
</VirtualHost>
さらに、ApacheがプロデルWebサーバにアクセスできるように、SELinuxのブールを変更します。
setsebool -P httpd_can_network_connect 1
systemctl restart httpd
※前回のCGIでは「httpd_execmem」を1にしましたが、今回の構成では0のままで問題ありません
http://(ホスト名)/apps/
でアクセスすると、サンプルページが表示されました!
まとめ
今回は、プロデルWebサーバ(コンソール版)とApache HTTP Serverのリバースプロキシ機能を組み合わせてプロデルWebアプリを公開する方法を紹介しました。
LAN内などの外部アクセスの心配が無い場所では、SELinuxを無効化してCGIを利用する方法が手っ取り早いかと思います。また最近有名なnginxを使う方法もあり、こちらもお手軽かと思います。使う用途に合わせて構成を考えると良いかと思います。
次こそはプロデルでWebアプリを作ってみたいと思います。