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

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

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

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Apache

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5859閲覧

Apacheでlocalhost:8080/cgi-bin/test.pyがInternal Server Errorとなり表示されない

takanash

総合スコア9

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Apache

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/04 13:58

編集2018/07/05 15:18

macOS 10.13.5/python3.6.5/Apache2.4.33

発生している問題・エラーメッセージ

Apacheを起動し、http://localhost:8080/cgi-bin/test.pyにアクセスしてtest.pyファイルをブラウザ上で開きたいのですが、Internal Server Errorとなり表示されません。

error_logを見たところ、(8)Exec format errorが原因と考えられたため、調べられる範囲で対処法を試してみましたが、解決には至っておりません。
エラーの原因が分かる方がございましたら、ご指摘いただけると非常に助かります。
初学者ゆえに、初歩的な部分が抜けている可能性もございますが、何卒よろしくお願い致します。

test.pyのソースコード

python

1#!/Users/(ユーザー名)/.pyenv/shims/python 2 3print ('Content-Type: text/html\n\n') 4print ("Hello world!")

ディレクトリ構造は以下の通りです。
[www]
. ├[cgi-bin]
. ├test.py
. ├test.pl
. └test.html
. └index.html

test.plとtest.htmlはブラウザ上で表示されましたが、test.pyのみInternal Server Errorの状態です。

試したこと

・パーミッションの変更
cgi-binおよびtest.pyは$ chmod 755 でパーミッションを変更しました。
($ ls -al でパーミッションが変更されていることも確認しております)

・設定の変更(httpd.conf書き換え)
.#LoadModule cgi_module libexec/apache2/mod_cgi.so
.#AddHandler cgi-script .cgi

コメントアウトになっている上2つの#を消しました。

<Directory "/usr/local/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
AddHandler cgi-script .py .pyc
AddHandler text/html .html .txt
</Directory>

太字部分を追加致しました。

・ScriptAriasの設定
ScriptAlias /cgi-bin/ "/usr/local/var/www/cgi-bin/"

・su www実行時の内容

$ su root Password: sh-3.2# su www sh-3.2# id uid=0(root) gid=0(wheel) groups=0(wheel),1(daemon),2(kmem),3(sys),4(tty),5(operator),8(procview),9(procmod),12(everyone),20(staff),29(certusers),61(localaccounts),80(admin),33(_appstore),98(_lpadmin),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),701(com.apple.sharepoint.group.1) sh-3.2# python test.py Content-Type: text/html Hello world!
$ su root Password: sh-3.2# su www -s /usr/local/var/www/cgi-bin/test.py sh-3.2#
$ su root Password: sh-3.2# su www -s /bin/sh sh-3.2# id uid=0(root) gid=0(wheel) groups=0(wheel),1(daemon),2(kmem),3(sys),4(tty),5(operator),8(procview),9(procmod),12(everyone),20(staff),29(certusers),61(localaccounts),80(admin),33(_appstore),98(_lpadmin),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),701(com.apple.sharepoint.group.1) sh-3.2# /usr/local/var/www/cgi-bin/test.py /usr/local/var/www/cgi-bin/test.py: line 3: syntax error near unexpected token `'Content-Type: text/html\n\n'' /usr/local/var/www/cgi-bin/test.py: line 3: `print ('Content-Type: text/html\n\n')' sh-3.2#
$ su root Password: sh-3.2# su www -s /bin/sh sh-3.2# /Users/(ユーザー)/.pyenv/shims/python -V Python 3.6.5 sh-3.2#
$ su root Password: bash-3.2# chsh -s /bin/bash www Changing shell for _www. bash-3.2# su www bash-3.2$ id uid=70(_www) gid=70(_www) groups=70(_www),12(everyone),61(localaccounts),100(_lpoperator),701(com.apple.sharepoint.group.1) bash-3.2$ cat /Users/(user)/.pyenv/shims/python #!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x program="${0##*/}" if [[ "$program" = "python"* ]]; then for arg; do case "$arg" in -c* | -- ) break ;; */* ) if [ -f "$arg" ]; then export PYENV_FILE_ARG="$arg" break fi ;; esac done fi export PYENV_ROOT="/Users/(user)/.pyenv" exec "/Users/(user)/.pyenv/libexec/pyenv" exec "$program" "$@" bash-3.2$ /Users/(user)/.pyenv/shims/python -V Python 3.6.5 bash-3.2$
$ /usr/local/var/www/cgi-bin/test.py /usr/local/var/www/cgi-bin/test.py: line 3: syntax error near unexpected token `'Content-Type: text/html\n\n'' /usr/local/var/www/cgi-bin/test.py: line 3: `print ('Content-Type: text/html\n\n')'

・lsコマンドの結果

drwxr-xr-x+ 32 (ユーザー名) staff 1024 7 5 13:29 /Users/(ユーザー名) drwxr-xr-x 26 (ユーザー名) staff 832 7 2 21:23 /Users/(ユーザー名)/.pyenv drwxr-xr-x 31 (ユーザー名) staff 992 7 5 14:28 /Users/(ユーザー名)/.pyenv/shims/ -rwxr-xr-x@ 1 (ユーザー名) staff 422 6 9 19:59 /Users/(ユーザー名)/.pyenv/shims/python

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

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

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

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

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

otn

2018/07/04 14:22

/Users/(ユーザー名)/.pyenv/shims/python は、実行可能ですか?
takanash

2018/07/04 14:32

実行可能です。バージョンが3.6.5であることも確認致しました。
otn

2018/07/04 14:51

python3ならprintに括弧が要ります。このエラーはそこに行く前のはずですが、念のため修正して下さい。
takanash

2018/07/04 16:03

あっそうですね、お恥ずかしい…ちなみに変えた後も状況に変わりありません。
kazto

2018/07/05 01:30

/Users/(ユーザー名)/.pyenv/shims/python の実行は確認されたとのことですが、Apacheの実行ユーザでの確認という認識で間違いないでしょうか。
CHERRY

2018/07/05 01:42

cgi-bin に置いているということですが、ScriptAlias の設定はされているのでしょうか? そうであれば、ScriptAlias を Alias に書き換えたら動いたりしますか?
takanash

2018/07/05 03:09

>kazto様 python, Apacheともに同一ユーザがインストールおよび実行確認しているため、問題ないと考えているのですが、いかがでしょうか。
takanash

2018/07/05 03:15

>CHERRY様 ScriptAliasの設定は、試したこと欄に追記した内容で設定されております。Aliasに書き換えたところ、403 forbiddenとなりました。
otn

2018/07/05 04:15

test.pyを端末から実行するとどういうエラーメッセージが出ますか?正常だった場合は、suでユーザーをapacheに切り替えて再度実行してみてください。
takanash

2018/07/05 04:59

>kazto様 httpd.confのUser, Groupは_wwwでした(ps aux | grep httpで確認した実行ユーザも同じ)。pythonの実行ユーザは自分のユーザー名で、これらが一致してないので実行できないのでしょうか…。
takanash

2018/07/05 05:11

>otn様 端末で実行したら、正常に実行されました。今は、suでユーザをapacheに切り替えられず手間取っています…すいません(su - apacheコマンドを叩いてもsu: Sorryとなります)
kazto

2018/07/05 05:11

そうなりますね。特にpyenvはbashrcなどでinitしないと使えないはずで、wwwユーザではそれが行われないことが予想されます。
otn

2018/07/05 05:18

実行ユーザーがwwwということなので、su wwwですね。
takanash

2018/07/05 05:37

>otn様 su wwwを叩いても同様にsu: Sorryとなってしまいます。/etc/passwdが原因かと思って/usr/bin/falseを/bin/bashに変えたりしてみたのですが、特に状況は変わらずでした…。
otn

2018/07/05 05:43

ちゃんといったんrootになってから、su wwwしていますか?
takanash

2018/07/05 05:55

>otn様 前のはrootになっていませんでした、失礼致しました。手順を確認したいのですが、suでスーパーユーザになる→su wwwでユーザー切り替え→test.pyを実行でよろしいでしょうか?(結果はユーザーを切り替える前と同じく正常でした)
otn

2018/07/05 06:06 編集

su wwwしてtest.pyが正常実行できたと言う事ですか?てっきり、wwwからの実行権限がないものだとばかり思っていました。
takanash

2018/07/05 06:07

test.pyは正常実行できましたが、恐れ入りますが、su wwwで実行ユーザがちゃんとwwwに切り替わっているかは正直なところ自信がありません。確認する方法など、ございましたらご教示いただけないでしょうか?
otn

2018/07/05 06:08

idコマンドで、ユーザーが表示されます。
kazto

2018/07/05 06:09

suして確認、は、確認にならないのではないでしょうか?環境変数が引き継がれてしまうと、元のユーザがpyenvを使える状況なので、apache経由の場合の再現になりません。やるならハイフン入れて「su - www」でないといけませんね。
takanash

2018/07/05 06:26

su wwwではなくsu - wwwした後にtest.pyを実行致しましたが、同じく正常実行されました。ただ、su, su - 両方とも実行した後にidコマンドで確認したところ、wwwはございませんでした。
otn

2018/07/05 06:50 編集

>kaztoさん。私は実行権限を疑ったので、su wwwでいいです。環境変数についてはフルパスで指定しているのであまり関係無いかと。apache起動時も別にログイン処理するわけじゃない(ログインシェルが動くわけではない)ので、su - での検証は意味ないです。そもそも/sbin/nologinだとsu -できないし。
otn

2018/07/05 06:45

su wwwして、エラーが出ないのに、idでwwwが出ないというのは不審です。su rootするところから最後まで、端末画面の内容を質問文に追記してください。
takanash

2018/07/05 06:58

su rootからtest.pyを実行するまでの内容を質問文の最後に追記致しました。よろしくお願い致します。
otn

2018/07/05 07:04

失礼しました。su - でなくてもログインシェルを見るんですね。しまった。
otn

2018/07/05 07:06

rootで、su www -s /usr/local/var/www/cgi-bin/test.py
otn

2018/07/05 07:15

あと、もっと早く聞いておけば良かったけど、ls コマンドの結果。ls -ld /Users/(ユーザー名) /Users/(ユーザー名)/.pyenv /Users/(ユーザー名)/.pyenv/shims/ /Users/(ユーザー名)/.pyenv/shims/python
takanash

2018/07/05 07:15

実行しましたが、エラーや実行結果は特に何も出ませんでした。(こちらも質問文の最後に追記しました)
otn

2018/07/05 07:17

書いた通りにやってください。
takanash

2018/07/05 07:27

失礼致しました、結果的には先程と同じでした。また、lsコマンドの結果も追記致しました。
otn

2018/07/05 07:34

実行権限付いてますね。それだと何故su www -s で何も出ないのか謎。
otn

2018/07/05 07:36

念のため、su www -s /bin/sh して、id して、/usr/local/var/www/cgi-bin/test.py してみてください。
takanash

2018/07/05 07:43

/usr/local/var/www/cgi-bin/test.py する際には、pythonコマンドは不要でしょうか?
otn

2018/07/05 07:44

pythonコマンド使ったらテストになりません
kazto

2018/07/05 07:52

wwwユーザの権限では /home/(user)/.pyenv にアクセスする権限がない、とかでしょうかねぇ?「su www -s /bin/sh して、/home/(user)/.pyenv/shims/python -V」で確認できます。
otn

2018/07/05 08:03

Macのsuの-sオプションはLinuxのsuとは違う機能みたいですね。
takanash

2018/07/05 08:09

/home/(user)/.pyenv/shims/python -Vの実行結果も追記致しました。すいません、知識不足で言われるままに実行している状態なのですが…よろしくお願い致します。
otn

2018/07/05 08:10

lsの結果のdrwxr-xr-x+の最後の+は、MacOSの拡張セキュリティ属性のようですが、これが原因なのかも。Macは持ってないので分かりません。SELinuxみたいなものでしょうか。
otn

2018/07/05 08:18

test.pyを実行した際の3行目のエラーは、シェルからのexecの失敗による物で、原因はもともとの質問のものと同じです。
otn

2018/07/05 08:23 編集

wwwユーザーのログインシェルをbashに変更した状態で、rootから su www して、id して、cat /home/(user)/.pyenv/shims/python して、/home/(user)/.pyenv/shims/python -V してみてください。
takanash

2018/07/05 08:54

ログインシェルをbashに変更して、実行した結果を追記致しました。pyenvがあるのは/home/ではなく/Users/ディレクトリでしたので、その部分は書き換えて実行致しました。よろしくお願い致します。
otn

2018/07/05 12:09

質問冒頭のtest.pyはコピペですよね?あと、ファイルの文字コードがBOM付きUTF-8ということはないでしょうか?
otn

2018/07/05 12:15

cat -v test.pyしたときに、#!の前に M-oM-;M-? があればBOM付きUTF-8です。
takanash

2018/07/05 14:32

1行目以外はコピペです。cat -v test.pyしましたが、M-oM-;M-?はありませんでした。
otn

2018/07/05 14:48

自分のユーザーで、/usr/local/var/www/cgi-bin/test.py したとき正常実行ですか?
takanash

2018/07/05 15:18 編集

3行目でsyntax errorとなりました(実行結果を追記致しました)。
otn

2018/07/05 15:22

本人でも実行できないと言うことだったのか
otn

2018/07/05 15:27

2018/07/05 13:15 以降全部無駄。
otn

2018/07/05 15:32

hexdump est.py の結果を1行目だけで良いので書いてください。
takanash

2018/07/05 15:38

長時間お付き合いいただいたのに申し訳ありません…1行目は 0000000 23 21 2f 55 73 65 72 73 2f 72 79 6f 77 61 6b 61 でした。
otn

2018/07/05 15:44

大丈夫そうですね。
otn

2018/07/05 16:12

MacOSの事情かと思ってググってみると、#! 行でシェルスクリプトは指定できないみたいです。
guest

回答2

0

ベストアンサー

本人でさえ実行できないということで、MacOSの事情かと思ってぐぐってみると、#!のあとにはバイナリ実行ファイルだけで、スクリプトファイルは指定できないようです。
最近、LinuxばかりでUnixを使ってませんでしたが、4BSDでもそうだったような気もしてきました。

Bash

1#!/usr/bin/env /Users/(ユーザー名)/.pyenv/shims/python 2 3print ('Content-Type: text/html\n\n') 4print ("Hello world!")

で、出来るかも。まずは自分ユーザーで端末から。

投稿2018/07/05 16:20

otn

総合スコア84505

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

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

takanash

2018/07/09 14:36

返信が遅くなり申し訳ありません。 上のコードで試したところ正常実行でき、localhostでブラウザ上でも表示させることができました。 非常に助かりました。ありがとうございます。
guest

0

解決策としては、以下のいずれかになりますでしょうか。

  • システムデフォルトのpython(/usr/bin/python)を使う
  • wwwユーザ用にpyenvをインストールする

投稿2018/07/05 05:15

kazto

総合スコア7196

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

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

takanash

2018/07/05 06:10

回答ありがとうございます。 原因と思しきものが分かり、ホッとしています。 システムデフォルトのpythonを使って試しましたが、Internal Server Errorは変わらずでした。 (実行ユーザを確認したところ、こちらも自分のユーザー名だったため、同様の理由でNG?) wwwユーザー用のpyenvインストールはこれから試してみます。 ちなみに、よろしければお聞きしたいのですが、Apache側のユーザを変更したり、Apacheインストール時にpyenv側に合わせることはできないのでしょうか?
kazto

2018/07/05 06:20

> Apache側のユーザを変更 これは、先ほども述べましたがhttpd.confの記載次第です。セキュリティ的な面で、実在するユーザで動かす、というのはあまり聞いたことがありません。 > Apacheインストール時にpyenv側に合わせる これは、pyenvの仕様上、厳しいんじゃないかなと思います。pyenvを使うには、シェル上で初期化を行う必要があります。(eval "$(pyenv init -)" ってやつです) この初期化を、Apache起動時に行えばイケそうな気はします。wwwユーザのホームディレクトリにbashrc作って、そこでやるんでしょうかね?ちょっと試す環境が無いのであてずっぽうです。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問