専用ユーザでPHPプログラムをデーモンとして動かす
◎構想記録
・ブラウザの操作でgitサーバにpushする仕組みの一環としてphpプログラムのデーモン化を検討し実践してみる
・バックアップやセットアップなどをブラウザから制御するための仕組みの土台とする
◎当面の目標
・専用ユーザを追加し、セキュリティ対策を施す
・phpのプログラムをデーモン化する方法を調べ、今回の用途に合ったものを見極める
・apacheで動くphpのプログラムからデーモンに指示を出す方法を調べ、今回の用途に合ったものを見極める
◎TODO
・ユーザを追加した際に注意すべきことを調べる
◎検討記録
・やるべきこと
・sshで外からログインできないが、自分自身にログインは出来、プログラムを起動できるようにする。
・今やろうとしていることにsudoの設定は約立たないか
・今回は権限の有無どうのではなく、どこかにsshでログイン出来ること、そして、出来る限り安全であることを求めているので、解決にならない
◎作業記録
・ローカルのvodマシンを使って実験した結果、sshd_configにユーザが専用に追加したユーザでアドレスがローカルのときパスワード認証を許可し、
次の条件で、ユーザがそのユーザのときはパスワード認証を許可しないよう設定すれば良いことが分かった
◎結論
・上記のようにsshd_configを設定する
◎TODO
・phpのプログラムをデーモン化する方法を調べ、今回の用途に合ったものを見極める
◎検討記録
・今回の要件を整理してみる
・apacheで起動されたプログラムから指示を受け、コマンドを実行して、結果を返す。
・例外処理はデーモン側で対応して結果だけ返す
・apacheのプログラムからの対話的処理は必要ない
・apacheのプログラムからの指示は単独で閉じたもので連続性を意識する必要はない
・コマンド文字列はデーモンを呼び出す時のパラメータとし大きなデータは共有できるファイルシステムを使う
・デーモンの役割
・サービスを自動で起動する
・何らかの理由でサービスが終了したら自動で再起動する
・一般的なデーモンの作り方を調べる
・Unit定義ファイルを作成して登録すればできるらしいことが分かった
・どのような待受け方法があるか調べる
・ソケットの接続を待つ
・ファイルのアクセスを待つ
・マルチタスクの必要性と競合の解決方法を考える
・複数の利用者からの依頼を並行して処理する必要がある場合はマルチタスクにする必要がある
・受け付けたものから順次に処理してもそれほど時間が変わらないものは、受付方法だけ考慮すればいい
・実行するところが一つで結局またされる場合
・そもそも処理時間が短く待っても支障がない
・競合の解決方法としてはバッファに溜め、ある法則の元に実行していく方法が考えられる
・phpで作る場合の注意点を調べる
・ファイルアクセス検知APIを使えるか確認する必要がある
◎検討結果
・いずれはソケットを使ってマルチタスクで対話処理をする必要があるが、現在必要な要件はファイル検知APIの利用でも出来そうなので、
その方向で実装を始める
◎作業記録
・ファイル検知APIを使う方法を調べ、実装してみる
・dnfでinotify-toolsをインストールできそうなので、inotifywaitを使う方法を考える
・サービス側 所定のディレクトリにファイルが書き込まれるのを待つ
・apache側 要求を書き込み、同時に結果を返すディレクトリを指定する。そのディレクトリに書き込まれるのを待つ
・サービス側 書き込まれた要求にしたがって処理を行い、結果を指定されたディレクトリに書き込むみ、処理した要求を消す
他に要求があれば処理を繰り返し、なければ、書き込みを待つ
・apache側 結果ファイルを受け取って次の処理に進む
・この時点での懸念材料
・サービスが要求が無くなったことを確認してから、書き込み待ちになるまでの間にapache側が要求を書き込むことはないか
・phpでinotifyのapiを使えそうなのでinotifywaitでapiを使って非ブロッキングモードを活用すれば、待ち状態になってからもチェックできる
◎実験記録
・phpでinotifyのapiを使い所定のディレクトリにファイルが作られたことを検知できることを確認。まずはブロッキングで
・ちなみにusleep(100)でループを回したらcpuの占有率が3から4%となった。実際は100000(0.1秒)でよく、このときは0.3%程だった
・readするまでに受け取ったイベントはいくつあっても配列で取り出せるし、取り出して処理している間も監視し、受け取っている
◎考察
・本格運営時はともかく、現段階ではデーモンにする必要もなく、boot時にrootで立ち上げ、ずっと走らせっぱなしで良いと思われる
その運用の中でエラーで止まるようなことがあれば、自動起動を期待できるデーモンにすればいい
◎結論
・常駐側と依頼側の実装を進めて、ハンドシェークの方法を確立する
◎終結
※今後は『全ページをgit管理する』に戻って、常駐側と依頼側の要件整理から要件決定、仕様検討、仕様決定、実装、要件調整、仕様再検討・・・と進める
<TODOと状況>