10. ApacheとPHPでブラウザリモコン作成

お勉強を兼ねて、Apache2(2.4.25)とPHP(7.0.30-0+deb9u1)を導入してwebサーバを構築し、ブラウザでリモコン操作とタイマー設定が出来るようにした。タイマー設定ではATコマンドを利用するためcronの役目は変更した。

雑誌ラズパイマガジン(2018/4)を参考に、Apache2とPHPの導入と基本的な動作確認(ブラウザでアクセス表示)を行い特に問題無く完了。 雑誌の情報はここまでなので、以降はネットで調べながら手探りで構築。

デフォルトのホームディレクトリ /var/www/html は管理者権限でファイルの書き込みや削除を行うが、頻繁に追加、削除や変更を行うので不便。そこで、個人用フォルダの作成方法をネットで調べたが、見つけ方が悪い所為か古い情報やOSの違い等で現物と異なる情報が多く、やっと見つけたサイトの情報を元に以下を実施。

  1. /home/xxx(user)/に 'public_html'のフォルダ作成
  2. Apache2のuserdir モジュールを有効にする(/etc/apache2/mods-available/userdir.confはデフォルトのまま)
     $sudo a2enmod userdir
  3. Apache2 を再起動
     $sudo /etc/init.d/apache2 restart ('sudo systemctl restart apache2'でも良いのかな)
  4. public_htmlフォルダにindex.htmlファイルを置いてブラウザから「localhost/~xxx(user)/」へアクセス OK
  5. public_htmlフォルダに簡易phpファイルを置いてブラウザからアクセス NG

何と、phpが実行できない。
ネットで調べたがやはり古い類似情報しか見つからず、その類似情報を元に/etcフォルダ内を調べ、結局、下記で自力解決した(自力解決した後で見つけた導入情報サイトで同じ処置をしていたので間違いではなさそう)


  /etc/apache2/mod-available/php7.0.confの中身で以下をコメントアウト
  php_admin_flag engine Off  # php_admin_flag engine Off

これで、phpもOKになったので、リモコンhtmlと関連php、pythonを作成。

作成したリモコンページ (2018/08/30)

リモコンボタンのページ

タイマー設定のページ

しかし、今度は、「タイマー設定用python」で実行させたatコマンドが権限が無いと云うエラーで実行できない事象発生。
調べると、ブラウザからphp経由で実行されたpythonのユーザは'www-data'と云うApache2のユーザで、atコマンドが拒否するユーザー一覧'/etc/at.deny'に登録されていた。
取り敢えず、この登録をコメントアウトしたら、実行出来るようになった。

ところが、atの時間登録ユーザが'www-data'になってしまい、atコマンドが1ショットで消えてしまう対策の定期的なタイマー設定とユーザが異なってしまい不都合だ。(at.denyは元に戻した)
ネットで色々調べた結果、'sudo -u xxx(user) at ...'で実行ユーザを'www-data'から'xxx(user)'に変更する方法を試してみた。
先ずは、php経由pythonでsudoが使えるように'sudo visudo'(必ずこのコマンド使用とのこと)で起動された'/etc/sudoers'に以下を追記


 www-data ALL=(ALL) NOPASSWD:/usr/bin/at

pythonで'sudo -u xxx(user) at ...'を実行するように変えて動作確認し、期待通りのユーザでジョブ登録が出来た。
atコマンドで登録したジョブは設定時間に実行されたら登録解除されるので、繰り返しタイマーとなるようにcronで定期的に「タイマー設定用python」を起動してatコマンド登録を行うようにした。

webサーバのセキュリティについて、外部からはアクセス出来ないと思うのだが、念のため、'Apache2.conf'と'userdir.conf'に「Require」でアクセス制限の設定をした。

【参考】下記サイトの情報を参考にさせて頂きました。
  1. Apach2の基本設定
  2. ubuntu 18.04 インストール(6) apache, php - kashiの日記
  3. ApacheユーザでPHPからsudo権限のシェルをたたく - 日報 #130
  4. Apache 2.4系でのモダンなアクセス制御の書き方