質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

ラズパイ上のapache2で出力されるエラーログ(LC_ALL、Unable to extract result)を直したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 736

hiten

score 23

【前提・実現したいこと】
プログラム初心者で、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

    追記2 をもう少し詳しく書いてみました。
    envvars で LANG=ja_JP.utf8 を設定したうえで、passenv LANG が設定されれば、期待通りに動くと思うんですが なんでしょうね・・・。

    キャンセル

  • 2019/12/08 23:41

    take88さん、いつもありがとうございます。
    おかげさまで連絡いただいた内容で、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をいじっていたのが問題を引き起こしたのかもしれません。
    ながきにわたりサポートして頂き、大変助かりました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る