レンタルサーバーでJavaのCGIを動かすことに苦戦した。

レンタルサーバーのcoreserverのCGIの公表する対応言語にJavaは含まれていない。
だが、sshに対応しているのでユーザー自身でJREまたはJDKをcoreserverのサーバーの自分のディレクトリにインストールするとJavaでCGIを作れる。
実際にやってみた。
Linuxはバイナリ互換があまりないので最新版のJRE 1.7は起動しなかった。
忘れたがglibc 2.4が無い見たいなエラー。
新しいJREには新しいLinuxが必要。
そこで古いJRE 1.6をサーバーにインストールしたところssh上でちゃんと動いた。
(動くかどうかはサーバーのLinuxのバージョンとJREのバージョンの組み合わせに依存します。)
これで、JavaでCGIが作れるはずと思ったが、CGIからではJavaは起動しなかった。
以下のメッセージが出る。
Script Error

The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. Depending on the server configuration, you can also run thisscript under CGIWrap debugging. Usually, either rename or linkthe script temporarily to a file which ends with .cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.

デバッグするために、CGIを置いたフォルダのディレクトリに、.htaccess という名前のファイルを作り、その中身に、
AddHandler cgi-script-debug .cgi
と書いた。

すると、今度はJavaが起動中に出したエラーメッセージが表示された。、
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

結論から言うと、Javaコマンドを呼び出す時にオプションの引数を次のように渡せば動いた。
(以下、シェルスクリプトの中身。)
#!/bin/sh
/virtual/username/jre1.6.0_45/bin/java -client -Xms5m -Xmx20m -Xss10m -XX:ReservedCodeCacheSize=10m -XX:PermSize=5m -XX:MaxPermSize=20m -cp /virtual/username/public_html javaclassname

javaclassnameは実際呼び出すJavaクラスの名前に置き換える。
javaがある絶対パス、public_htmlの絶対パスは実際のものに置き換える。
要は各種メモリの設定を引数で渡したわけだが、メモリ確保が少なすぎるのか多すぎるのかは良く分からない。
とりあえず起動したというだけだ。
実際に運用するには指定する数値を適切な値に設定しなおす必要があると思う。

今まで知らなかったが、Java VMには、Client VMモードとServer VMモードの二種類ある。
デフォルトがどっちになっているかは、java -version と入力して、「Client VM」または「Server VM」のどちらの文字列が出力文字列に含まれるかで分かる。
サーバー上のLinux版のJREのデフォルトはServer VMになっていた。
Server VMはJavaサーブレットなどで使うことを考慮して指定無しだと起動時にメモリを大量確保しようとするようだ。
coreserverではCGIの使用メモリ制限は160MBになっているようだがそれでも指定なしだとメモリ確保できずに起動しない。
javaコマンドの引数で、-client を指定すると、Client VMモードになってあまりメモリを使わないらしいがこの指定だけしてもやはり同じようにメモリ確保できずに起動しなかった。
JavaはCGIにも使えるのだが、デフォルトの設定は、CGIで使うことを全く想定していない。
だから、各レンタルサーバー会社はJavaをCGI対応言語に入れないのだろう。
CGI用の設定を簡単にしてCGI対応をアピールしていれば、もう少しJavaが普及していたのではないかと思う。
誰もJavaがCGI用言語になりうることを知らないのが現状。
もしかしたらメモリの食い具合でCGIに向いていないのかも知れないけどね。