PHPのとあるライブラリ経由でJavaの処理を呼び出せる環境を整備した


こういう分野ってどうやって勉強したらいいですか?
ひとつひとつを調べるのに時間がかかりすぎてしまいました。
反省の意を込めた備忘録です。

環境構築

Javaをインストールする

# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel

java -versionjavac -version でバージョンが返ってくればインストール完了。

参考

CentOS 7 に Java 8 (OpenJDK) を yum インストールする手順 | WEB ARCH LABO

Javaを環境変数に設定する

java.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
# source java.sh

printenv で環境変数が設定されていることが確認できればOK。

参考

CentOS7にJava OpenJDK8のインストール

composerをインストールする

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php

llcomposer.phar がダウンロードされていることが確認できればOK。

参考

Composer を CentOS にインストールする手順 | WEB ARCH LABO

問題解決

コマンドラインで実行した時には問題なかったのに、Apache経由でエラーが発生したため、追加で行った作業。

SELinuxにポリシーを登録する

/var/log/messages に出力されているログで検索したところ、原因はSELinuxであることを突き止めました。
ところが、解決方法を調べると setenforce 0 の実行によるSELinuxの無効化ばかりです。
これはセキュリティが緩くなりすぎるため、さらに調べて見つけたSELinuxにポリシーを登録する方法で解決します。
ツールの導入も検討したのですが、あまり環境を汚したくなかったので、/var/log/audit/audit.log を解析して自作しました。

javalocal.te
module javalocal 1.0;
require {
    type httpd_sys_script_t;
    type proc_net_t;
    class process { execmem };
    class file { read open getattr };
}
allow httpd_sys_script_t self:process { execmem };
allow httpd_sys_script_t proc_net_t:file { read open getattr };
# make -f /usr/share/selinux/devel/Makefile
# semodule -i javalocal.pp

参考

selinux上のCGIでjavaを動かせるようにする方法 - muibrog
SELinuxのポリシー・モジュールを自作する - わんこいん
「SELinuxのせいで動かない」撲滅ガイド
理由がわかれば怖くない!SELinux とのつきあい方

ロケールを日本に設定する

さて、ようやくApache経由でも実行されるようになったのですが、日本語を含むと想定の結果が返ってきません。
これは調べたところ、原因はPHPの execescapeshellcmd によって日本語が切り捨てられたことでした。試しに実行コマンドを文字列として出力させたところ、日本語が抜け落ちていました。
この解決は有識者が行ったため、私は詳細を把握していないのですが、おそらくPHPとApacheで日本語を扱えるよう設定を変更したのだと思います。

参考

PHPでexecを走らせると日本語だけ消える