ブラウザ経由でデータベースを閲覧したり操作したりする
Webアプリケーションつくってます。
そのデータベースとしてSQLiteを使ってるのですが、
そこではまったのでご報告。
もともとSQLは触ったことがなくて、SELECT分とかINSERT文とかを
よくわからないながらもこわごわ書いては動作テストを繰り返しながら
開発をすすめてきたのだけど、
どうもSQLが実行できたりできなかったりする、と。
その動いたり動かなかったりするのはなんなんだ?!と探っていくと、
ターミナル経由でCGIのスクリプトを実行するときは、
きちんとSQL文は実行されて、行の追加やテーブルの削除はできる。
一方、Webブラウザ経由でCGIスクリプトを実行すると、
SQL文はきちんと発行されているのにデータベースに反映されていない
ということが起きていた。
まったく同じスクリプトを実行しているのに、
ターミナルからのコマンドライン操作のときと、
WEBブラウザ経由の実行のときで、挙動が異なるってなにそれ!
と理由がよくわからずしばし混乱。
引数の渡し方がおかしいのかな?とチェックして、
最終的に、引数はわたさずすべてコードの中に書いた状態で実行しても
やはり結果は変わらず。
そこまでやって、実行権限とかパーミッションの問題ではないかと気づいた。
そもそもCGIはどういう権限をもったユーザーが実行しているのか、
よく知らなかった。
ターミナルで実行する場合は、もちろん自分のシェルアカウントで実行している。
でも、CGIは誰が実行している?
早速、下記のページを参考に確認:
パーミッションと実行権限
結果は「 www 」でした。
よく考えれば、Apacheの設定のhttpd.confにhttodを実行するユーザーとグループを
指定する設定があるのだった。
Apacheのhttpd.confから抜粋
# User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User www Group www
これでわかった。
ターミナルでスクリプトを実行するユーザーとCGIを実行するユーザーが
違うので、その結果付与されているパーミッションも違い、
Webブラウザ経由では実行できなかったのだ。
「SQLite 権限」などというキーワードでググると同じ症状の記事が
いろいろでてくる。
そのなかで、単にdbファイルのパーミッションに書き込み権限を付与するだけでは
だめで、そのdbファイルがあるディレクトリのパーミッションも変えなければ
だめで、ディレクトリには実行権限を付与しないといけないというのが
どの記事にも書いてあった。
追記:書き込み権限も必要でした
実際、そのとおりにパーミッションを変更して
・dbファイル → other に w を付与( o+w)
・dbファイルのあるディレクトリ → other に x を付与(o+x)
・dbファイルのあるディレクトリ → other に wとx を付与(o+wx)
それで、ブラウザ経由の実行でも動くようになった。
それでめでたしめでたしなのだが、
いままでディレクトリのパーミッションというものを真剣に考えたことがなかったので、
今回のディレクトリの権限のことも少し調べて勉強になった。
そもそもで「ディレクトリの実行権限って何よ?」と誰しも疑問に思うのでは。
スクリプトならそれを読み書きすることと実行することは別のことなので、
読む権限、書く権限、実行する権限とわかれているのはわかるのだが、
ディレクトリの場合、「実行」と言われてもよくわかならない。
それでディレクトリの読み書き実行という概念は、ファイルに対するそれとは
違うのだということがぼんやりとわかった。
Linuxカーネルも絡む難しいお話なのねっ、というのがわかっただけだけど、
勉強になった。