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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

1303閲覧

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

Akihiro_py

総合スコア55

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2019/11/30 05:40

【前提・実現したいこと】
プログラム初心者で、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)が示しているエラーはどのような意味でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あてずっぽうですが 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 に配置。

python

1#!/usr/bin/env python 2import sys 3import os 4import subprocess 5 6print "Content-type: text/html\n\n" 7print "LANG : " + str(os.environ.get('LANG')) 8print "sys.getfilesystemencoding: " + sys.getfilesystemencoding() 9print "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/11/30 13:15

編集2019/12/07 15:15
take88

総合スコア1351

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_py

2019/11/30 14:34

回答ありがとうございます。 以下のコマンドから、設定しましたがどうもエラーは出たままとなっています。 pi@raspberrypi:~ $ sudo raspi-config 4 Localisation Options -> I1 Change Locale -> ja_JP.UTF-8 ほかに何かヒントになるようなものは無いでしょうか?? 引き続き回答をお待ちしております。
take88

2019/11/30 18:16

追記しました。 微妙に自信ないんですけど、Apache2に環境変数を渡せばいい気がします。 たしか /etc/apache2/envvars ファイルに書けばよかった気がしますので 試してみてください。
Akihiro_py

2019/12/01 02:29 編集

引き続きの回答、大変助かります。 以下、実施してなぜか(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を設定しても変わらず、、、
take88

2019/12/01 03:29

うーん。なんでしょう。 youtube-dl の Githubのソースを見ると、Pythonの sys.getfilesystemencoding() が ascii を返してる場合に表示されるエラーのようです。 通常、Linuxだとロケールに合わせて utf-8 になるはずなんですけど、細かい挙動がよくわかりません・・・。 ちなみに local -a で利用可能なロケールを一覧表示すると ja_JP.utf8は 含まれてますか?
Akihiro_py

2019/12/01 14:15

いろいろと付き合って頂き大変ありがとうございます。 指示して頂いたコマンドで見たロケール一覧は以下となりました。 pi@raspberrypi:~ $ locale -a C C.UTF-8 POSIX en_US.utf8 ja_JP.utf8 なにかヒント等が存在すれば良いのですが、、、。 take88さんには、だいぶ手間をかけて頂いているので申し訳ないです。
take88

2019/12/02 10:41

CGIが動かないのはApache2 の SUEXEC あたりのせいじゃないかとは思うんですが・・・。
Akihiro_py

2019/12/02 10:59

take88さん、回答ありがとうございます。 cgiは動いているので、いまのところログが増える以外の問題は無い(はず)です。 ですので、この質問は一旦ペンディングにしようと思います。 頂いた回答にはベストアンサーにさせて下さい。
take88

2019/12/02 15:08

ペンディングということですが、追記しました。Apacheの設定変更で うまくいくかもしれません。
Akihiro_py

2019/12/03 04:22 編集

take88さん、連絡ありがとうございます。 ペンディングと言いつつもコメントお待ちしていました。 早速ですが、実行してみました。 結果、おかげさまでだんだん見えてきた(?)ような気がします。 問題はおそらく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
Akihiro_py

2019/12/05 00: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
take88

2019/12/07 15:19

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

2019/12/08 14: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をいじっていたのが問題を引き起こしたのかもしれません。 ながきにわたりサポートして頂き、大変助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問