ラズパイ上のapache2で出力されるエラーログ(LC_ALL、Unable to extract result)を直したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 736
【前提・実現したいこと】
プログラム初心者で、Python3のみ使っています。
ラズパイ上のapache2でcgiとしてpythonを実行しています。
プログラムは特に問題なく動いているので、現状は支障は無いのですが、
apache2のエラーログが気になっています。
【環境】
Raspberry Pi3 Model B(Raspbian Jessie)
Python 3.5.3
Apache2 2.4.25
【エラーメッセージと実施した内容】
cgi実行後、apache2のエラーログを見ると以下に文言が出てきます。
(1)引用テキストファイル名の文字エンコードに問題があり、環境変数LC_ALLを修正すると解決します。
(2)結果を抽出できません。
error_log
[Sat Nov 30 13:47:10.510945 2019] [cgi:error] [pid 834:tid 1894732848] [client 192.168.11.15:50152] AH01215: WARNING: Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.: /media/pi/cgi-bin/test.py, referer: http://192.168.11.9:8080/index.html
[Sat Nov 30 13:47:14.369682 2019] [cgi:error] [pid 834:tid 1894732848] [client 192.168.11.15:50152] AH01215: WARNING: Unable to extract result entry: /media/pi/cgi-bin/test.py, referer: http://192.168.11.9:8080/index.html
そこで、(1)に対してラズパイ上の端末で以下を実行しました。
pi@raspberrypi:~ $ export LC_ALL=ja_JP.UTF-8
pi@raspberrypi:~ $ printenv LC_ALL
ja_JP.UTF-8
その後にcgiを実行しても、apacheのエラーログは同じように出ています。
【質問内容】
A) (1)のエラーを出さないようにするためには、LC_ALLをどのように設定すればよいでしょうか?
B) (2)が示しているエラーはどのような意味でしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
あてずっぽうですが raspi-config
で ロケールを設定して、再起動したら治りませんか?
(追記)
apache の環境変数は、/etc/apache2/envvars
ファイルで設定されてるのでこれを編集して apache2 を再起動してみてください。
(追記2)
apache の設定で次を追加すると うまくいくかもしれません。
envvars に LANGを設定
unset HOME
if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
SUFFIX="-${APACHE_CONFDIR##/etc/apache2-}"
else
SUFFIX=
fi
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2$SUFFIX/apache2.pid
export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
export LANG=ja_JP.utf8 # ← 日本語UTF8を設定
export LANG
Apacheの設定に PassEnv LANG
を追加
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
AddHandler cgi-script .py
PassEnv LANG # ←envvars で設定したLANGをCGIに引き渡す
</Directory>
サンプルコードを作成して cgi-bin に配置。
#!/usr/bin/env python
import sys
import os
import subprocess
print "Content-type: text/html\n\n"
print "LANG : " + str(os.environ.get('LANG'))
print "sys.getfilesystemencoding: " + sys.getfilesystemencoding()
print "date : " + subprocess.check_output('date')
動作確認
# curl localhost/cgi-bin/hello.py
passenv ありの場合
LANG : ja_JP.utf8
sys.getfilesystemencoding: UTF-8 ← ロケールのエンコードが返ってきた
date : 2019年 12月 2日 月曜日 15:06:22 UTC ←日本語ロケール
passenv なしの場合
LANG : None
sys.getfilesystemencoding: ANSI_X3.4-1968
date : Sun Dec 8 00:10:21 JST 2019
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/11/30 23:34
以下のコマンドから、設定しましたがどうもエラーは出たままとなっています。
pi@raspberrypi:~ $ sudo raspi-config
4 Localisation Options -> I1 Change Locale -> ja_JP.UTF-8
ほかに何かヒントになるようなものは無いでしょうか??
引き続き回答をお待ちしております。
2019/12/01 03:16
微妙に自信ないんですけど、Apache2に環境変数を渡せばいい気がします。
たしか /etc/apache2/envvars ファイルに書けばよかった気がしますので 試してみてください。
2019/12/01 11:27 編集
以下、実施してなぜか(2)が解決する場合がありましたが、(1)はそのままです。
もしよければ、ほかに見るべき点があれば教えて頂けると大変助かります。
実施その1:/etc/apache2/envvarsに以下の変更、その後service stop → service startをしました。
前)export LANG=C
後)export LANG=ja_JP.utf8
結果その1:エラー(1)は発生、エラー(2)が解消したかは未確認
実施その2:/etc/apache2/envvarsに以下の変更、その後service stop → service startをしました。
前)無し
後)LC_CTYPE=ja_JP.utf8
結果その2:エラー(1)は発生、エラー(2)が解消する場合あり
備考その2:更にLC_MESSAGES、LC_ALLを設定しても変わらず、、、
2019/12/01 12:29
youtube-dl の Githubのソースを見ると、Pythonの sys.getfilesystemencoding() が ascii を返してる場合に表示されるエラーのようです。 通常、Linuxだとロケールに合わせて utf-8 になるはずなんですけど、細かい挙動がよくわかりません・・・。
ちなみに local -a で利用可能なロケールを一覧表示すると ja_JP.utf8は 含まれてますか?
2019/12/01 23:15
指示して頂いたコマンドで見たロケール一覧は以下となりました。
pi@raspberrypi:~ $ locale -a
C
C.UTF-8
POSIX
en_US.utf8
ja_JP.utf8
なにかヒント等が存在すれば良いのですが、、、。
take88さんには、だいぶ手間をかけて頂いているので申し訳ないです。
2019/12/02 19:41
2019/12/02 19:59
cgiは動いているので、いまのところログが増える以外の問題は無い(はず)です。
ですので、この質問は一旦ペンディングにしようと思います。
頂いた回答にはベストアンサーにさせて下さい。
2019/12/03 00:08
2019/12/03 13:19 編集
ペンディングと言いつつもコメントお待ちしていました。
早速ですが、実行してみました。
結果、おかげさまでだんだん見えてきた(?)ような気がします。
問題はおそらく2つあると思っています。
①apache上でのロケールのエンコードがasciiのまま
②ラズパイ上のpython3、なぜか出力がascii出力になっている
ここからどこのように見ていけば、問題が解決するでしょうか?
※一人だったら、ここまで来ることは出来なかったと思います。
take88さんのスキルに助けられています。
もしよければ、またコメントを頂けると助かります。
因みに連絡頂いたプログラムを少し修正してみた結果を以下に示します。
ブラウザ:http://localhost:8080/cgi-bin/test.py
設定状況:PassEnv LANG有り/無し共に変化なし
出力結果:LANG : None sys.getfilesystemencoding: ascii b'Tue Dec 3 09:25:01 JST 2019\n'
単体で実行:IDLEからtest.pyで実行
出力結果:
LANG : ja_JP.UTF-8
sys.getfilesystemencoding: utf-8
b'2019\xe5\xb9\xb4 12\xe6\x9c\x88 3\xe6\x97\xa5 \xe7\x81\xab\xe6\x9b\x9c\xe6\x97\xa5 09:20:57 JST\n'
実行したプログラム
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import sys
import os
import subprocess
print ("Content-type: text/html\n\n")
print ("LANG : " + str(os.environ.get('LANG')))
print ("sys.getfilesystemencoding: " + sys.getfilesystemencoding())
print (subprocess.check_output('date'))
ラズパイの環境
pi@raspberrypi:~ $ printenv LANG
ja_JP.UTF-8
2019/12/05 09:19 編集
以下でコンフィグチェックしましたが、特に問題は無かったようです。
pi@raspberrypi:~ $ apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
2019/12/08 00:19
envvars で LANG=ja_JP.utf8 を設定したうえで、passenv LANG が設定されれば、期待通りに動くと思うんですが なんでしょうね・・・。
2019/12/08 23:41
おかげさまで連絡いただいた内容で、utf-8が設定できました。
LANG : ja_JP.utf8 sys.getfilesystemencoding: utf-8 b'2019\xe5\xb9\xb4 12\xe6\x9c\x88 8\xe6\x97\xa5 \xe6\x97\xa5\xe6\x9b\x9c\xe6\x97\xa5 23:04:02 JST\n'
もともとcgiを動かすために、いろいろとapache2をいじっていたのが問題を引き起こしたのかもしれません。
ながきにわたりサポートして頂き、大変助かりました!!