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

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

ただいまの
回答率

90.35%

  • Python

    9122questions

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

  • Python 3.x

    7329questions

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

  • Apache

    1901questions

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

  • CGI

    25questions

    CGIはCommon Gateway Interfaceの略称です。

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

解決済

回答 2

投稿 編集

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

takanash

score 1

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のソースコード

#!/Users/(ユーザー名)/.pyenv/shims/python

print ('Content-Type: text/html\n\n')
print ("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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • takanash

    2018/07/06 00:38

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

    キャンセル

  • otn

    2018/07/06 00:44

    大丈夫そうですね。

    キャンセル

  • otn

    2018/07/06 01:12

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

    キャンセル

回答 2

checkベストアンサー

+1

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

#!/usr/bin/env /Users/(ユーザー名)/.pyenv/shims/python

print ('Content-Type: text/html\n\n')
print ("Hello world!")


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/09 23:36

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/05 15:10

    回答ありがとうございます。
    原因と思しきものが分かり、ホッとしています。

    システムデフォルトのpythonを使って試しましたが、Internal Server Errorは変わらずでした。
    (実行ユーザを確認したところ、こちらも自分のユーザー名だったため、同様の理由でNG?)

    wwwユーザー用のpyenvインストールはこれから試してみます。
    ちなみに、よろしければお聞きしたいのですが、Apache側のユーザを変更したり、Apacheインストール時にpyenv側に合わせることはできないのでしょうか?

    キャンセル

  • 2018/07/05 15:20

    > Apache側のユーザを変更
    これは、先ほども述べましたがhttpd.confの記載次第です。セキュリティ的な面で、実在するユーザで動かす、というのはあまり聞いたことがありません。

    > Apacheインストール時にpyenv側に合わせる
    これは、pyenvの仕様上、厳しいんじゃないかなと思います。pyenvを使うには、シェル上で初期化を行う必要があります。(eval "$(pyenv init -)" ってやつです)
    この初期化を、Apache起動時に行えばイケそうな気はします。wwwユーザのホームディレクトリにbashrc作って、そこでやるんでしょうかね?ちょっと試す環境が無いのであてずっぽうです。すみません。

    キャンセル

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

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

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

  • Python

    9122questions

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

  • Python 3.x

    7329questions

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

  • Apache

    1901questions

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

  • CGI

    25questions

    CGIはCommon Gateway Interfaceの略称です。