7月6日から、IPAが秋季の情報処理技術者試験の受付を開始したようだ。
クレジットカードだけで申し込みできる。
受験料は 5,700円。まあ、ケジメには良い。受ける。
Apache から直接 pythonスクリプトを実行したいが、どうしてもエラーになる。
You don't have permission to access /test.py on this server.
環境は以下。
・fedora 20
ーーー
解決手順
① まずログをみる
$ sudo -s
# ls -sharlt /var/log/httpd/ | grep error | tail -n 5
# vim virtual.host-error_log
エラーがわかった。
because search permissions are missing on a component of the path
② cgi-bin がどこにあるかを conf ファイルで確認する
$ sudo -s
# cd /etc/http/conf/
cgi-bin という文字列で検索をかける。
↑ このconfの行数でいうと
・756行目にScriptAlias
ブラウザから http://test.com/cgi-bin/ と表記したときに、/var/www/cgi-bin にアクセスできるようにする(ショートカットを作る)機能。
・770行目のDirectory
cgiの実行権限を決める場所。Options +ExecCGI と Require all granted が無いと pythonスクリプトが動かない。
なお、Apache は Ver2.4から「Require all granted」という表記になったらしい。Ver2.2だと表記方法が違う。
③ cgi-bin フォルダの権限が「drwxr-xr-x」になっているか確認
④ 実行するスクリプトのファイル権限が「-rwxr-xr-x」になっているか確認
⑤ cgi-bin フォルダの所有者が httpd を実行しているユーザーになっているか確認
実行ユーザーは「www-data」であることがわかった。③と④から、cgi-binフォルダも、test.pyスクリプトも、どちらも所有者が www-data なので、問題なし。
python スクリプトに「 Content-type: text/html¥n 」の記述があるか確認する。これがないと(①の手順でログを見たときに)「malformed header from script」というエラーが出てしまう。
http://www.futomi.com/lecture/apache/cgier
# vim test.py
⑦ Apache を再起動する
ここまで設定したら、Apache を再起動する。
$ sudo -s
# systemctl restart httpd.service
ーーー
ここまでの設定で cgi-bin は動くと思うが、VirtualHost を立てている(複数のWEBアドレスを使って運用している)ときはさらに /etc/httpd/conf.d/vhost.conf も見る。
$ sudo -s
# vim /etc/httpd/conf.d/vhost.conf
↑ このconfの Directory の設定を、上記の 756行目と770行目と同じにしないといけない。
設定を変えたので、もう一度 Apache を再起動する。
$ sudo -s
# systemctl restart httpd.service
ブラウザ からアクセスして、動くか試してみる。
無事動いた。
ーーー
2017/7/16 追記
python3 から ヘッダーをprintしないとうまくいかないことがあることもわかった。
fedora の場合、エラーは /etc/httpd/logs/ の中にある。ログファイル名は環境によって違うので読み替える。
$ sudo -s
# vim /etc/httpd/logs/virtual.host-hoge-error_log
実際に出たエラーごとに見てみる。
ーーー
エラー① python3 スクリプト内に日本語文字列が含まれている
# vim /etc/httpd/logs/virtual.host-hoge-error_log
python3 の print文に、日本語文字列を含んでいたためにエラーになった。「u753b…」のような部分で、日本語がうまく処理できていないとわかる。pythonスクリプトを見てみる。
# vim twAllDL.py
確かに日本語を出力しているが、処理するための記述(ヘッダでのutf8宣言)には問題なさそう。 ちゃんと # -*- coding:utf-8 -*- と書いているし。
原因調査は面倒なので、日本語のところを英語にして対応しちゃう。
これで エラー①は消えた。
ーーー
エラー② ヘッダ出力する print文を書いてない
# vim /etc/httpd/logs/virtual.host-hoge-error_log
Bad header というエラーになるようだ。python3ソースを見てみる。
# vim twAllDL.py
うむ。確かにヘッダのprint文が無い。print("Content-type: text/html¥n") を書き足してみる。 ← python3 なのでprint文にはカッコがつくので注意。
ーーー
2017/7/17 追記
・ヘッダに注意
#!/usr/bin/python3 ← python2か3か
・日本語をutf-8でラップする
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
・print文の前行に必ず Content-type ヘッダ出力が必要
http://ura22.sakura.ne.jp/pycgi/practice.html
↑ 改行コードは ¥n だけでいけた。
コマンドまとめ
(www-data は httpd の実行ユーザ)
$ sudo -s
# cd /var/www/
# sudo chmod www-data:www-data cgi-bin
# sudo chmod 755 cgi-bin
# cd cgi-bin
# sudo chmod www-data:www-data twAllDL.py
# sudo chmod 755 twAllDL.py
# vim twAllDL.py
print("Content-type: text/html¥n")
# systemctl restart httpd.service
# vim /etc/httpd/logs/virtual.host-hoge-error_log
ーーー
注意点まとめ
・PythonスクリプトはPython2か、3か(3なら、print文にカッコがついているはず)
・Pythonスクリプトで字下げは半角スペースかタブかどちらかで統一されているか
print("Content-type: text/html¥n")
または
print('Content-type: text/html; charset=UTF-8\r\n')
ーーー
参考(Python3 スクリプト)
ーーー
参考(cgi-bin配下のhtml)
/cgi-bin/ディレクトリ配下の画像やHTMLが表示できない
RaspberryPi や fedora の bash にて。
「あるフォルダの中の全てのファイルを調べて、ファイル名の頭が数字3桁のものだけ表示する」をやりたい。
ーーー
まず「あるフォルダの中の全てのファイルを調べる」のは、超簡単。毎日やっている。
$ for i in *; do echo "$i"; done
ーーー
これに、if文をつけて「ファイル名の頭が数字3桁だったら表示する」の条件をつける。
$ for i in *; do if [[ "$i" =~ ^[1-9]{3} ]]; then echo "$i"; fi; done
(全角のカッコ [ ]は実際は半角なんだけど、このブログの制限で全角表示にしてる)
RaspberryPi(初代)の cron に radiko の起動スクリプトを設定して、毎日決まった時間にテレビのスピーカーからラジオが流れるようにしたつもりなのに、なぜか音が鳴らない。
ーーー
RaspberryPi 3 のほうはうまくいっているので、比較して調べたら、音声デバイスを認識してなかった。初代のほうの /boot/config.txt を編集する。
$ sudo vim /boot/config.txt
dtparam=audio=on
を記載して再起動したら、無事ラジオを聴けた。/boot/config.txt のデフォルトではこの記述があるんだけど。以前 MPEG の記述を入れる編集をした時に、まちがって消したのかもしれない。