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

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

ただいまの
回答率

90.48%

  • Python

    8694questions

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

  • Apache

    1874questions

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

  • Raspberry Pi

    856questions

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

apache2、CGIでpythonが実行されず、ソースが表示されてしまいます

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 6,094

bin_300K

score 48

前提・実現したいこと

Raspberry PiでWebサーバーを構築中ですが、
apache2、CGI設定をしたところ、
pythonが実行されず、ソースが表示されてしまうところを改善したいのです。
どなたか改善点わかるかたいらっしゃいますでしょうか。

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

発生している問題は上記の症状です。私が行った設定・経緯を下記に書きます。

経緯

Raspberry PiでWebサーバーを構築中ですが、
apache2、CGI設定をしたところ、

経緯1:ドキュメントルート(/var/www/)にディレクトリ/cgi-bin/を作って、そこに以下のソースのテストスクリプトを配置しました。

test.cgiのファイルです↓(ディレクトリ /var/www/cgi-bin/)

#! /usr/bin/env python

print "Content-type: text/html\n"
print "<html><body>hello python page!</body></html>"


経緯2:apache2.confを下記のようにいじりました(設定ファイル長くてすみません。。。)

# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.

# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
#       /etc/apache2/
#       |-- apache2.conf
#       |       `--  ports.conf
#       |-- mods-enabled
#       |       |-- *.load
#       |       `-- *.conf
#       |-- conf-enabled
#       |       `-- *.conf
#       `-- sites-enabled
#               `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
#   together by including all remaining configuration files when starting up the
#   web server.
#
# * ports.conf is always included from the main configuration file. It is
#   supposed to determine listening ports for incoming connections which can be
#   customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
#   directories contain particular configuration snippets which manage modules,
#   global configuration fragments, or virtual host configurations,
#   respectively.
#
#   They are activated by symlinking available configuration files from their
#   respective *-available/ counterparts. These should be managed by using our
#   helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
#   their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
#   the default configuration, apache2 needs to be started/stopped with
#   /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
#   work with the default configuration.


# Global configuration
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
Mutex file:${APACHE_LOCK_DIR} default

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5


# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log

#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf


# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>




# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#
AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>


#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/test.cgi" #←ここから下を追記しています

<Directory "/var/www/cgi-bin/">
        AllowOverride None
        Options ExecCGI
        Order allow,deny
        Allow from all
</Directory>

AddHandler cgi-script .cgi


経緯3:apache2の設定を読み込むためにapache2再起動しました。

経緯4:ここで、IPアドレス/cgi-bin/ にアクセスしたところ、

#! /usr/bin/env python

print "Content-type: text/html\n"
print "<html><body>hello python page!</body></html>"


と、cgiが実行されなくて、ソースが表示されてしまいます。

試したこと

IPアドレス/cgi-bin/test.cgiにアクセスしてみましたが、404エラーでした。

どなたか、原因がお分かりになる方、アドバイスなどいただけると大変助かります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

デフォルトではpythonを実行することはできないと思います。

  • Pythonスクリプトを実行するためにCGIの設定を行う
  • test.cgiではなくtest.pyにファイル名を変更

こちらが参考にして設定されてはいかがでしょうか。
http://qiita.com/aryoa/items/2c28b466e911a3dd101d

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/13 22:30

    lightson さま ありがとうございます!今いただいた参考サイトで試しておりますが、まだはまっております。写し間違えなどないかチェックして進めようと思います。

    取り急ぎ お礼まで

    キャンセル

  • 2016/05/14 00:22

    lichtsonさま 

    先ほどはアドバイスいただきありがとうございました。

    経過ご報告いたします。いただいたリンク先のチュートリアル通りに、apache2を3回ほどインストールからやりなおしたのですが、うまくいっておりません。。。すみません。

    http://(IPアドレス)/~(ユーザー名)/cgi-bin/test.pyにアクセスすると、

    タブ:「500 Internal Server Error」
    本文:「Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at webmaster@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.

    Apache/2.4.10 (Raspbian) Server at (私のラズパイのIPアドレス) Port 80」

    とでてしまいます。


    http://(IPアドレス)/~(ユーザー名)/cgi-bin/のディレクトリにアクセスすると、test.pyがこのディレクトリにあります という表示がでますし、

    http://(IPアドレス)/~(ユーザー名)/index.html (ディレクトリにテストhtmlを配置しています)は、無事に表示されています。

    ここから、CGIの設定の直前まではうまくいっているように思われますが、なにか良いお知恵はございますでしょうか。すみません。

    キャンセル

  • 2016/05/14 00:49

    追記 状況を詳細に記述するため、別途質問を投稿いたしました。
    https://teratail.com/questions/34880

    もしご都合よろしければアドバイスいただけると大変助かります。

    キャンセル

  • 2016/05/14 11:32

    経過後報告です。

    文字コードを見直したところ、おかげさまで、無事CGIが動きました! ご協力、ありがとうございました!

    $ file test.py
    test.py: Python script, UTF-8 Unicode (with BOM) text executable, with CRLF line terminators

    となっているのが、問題となるケースもあるようでしたので、with BOMを消して、CRLF改行を消すと、無事実行されました!!

    ご協力いただきありがとうございました。

    キャンセル

+1

ログにエラーが出ていませんか?
明らかに、設定ファイルの書き方がおかしいです。

<Directory /var/www/>
        Require all granted
</Directory>

これは、apache2.4の書き方。

<Directory "/var/www/cgi-bin/">
        Order allow,deny
        Allow from all
</Directory>

これは、apache2.2以前の書き方です。

お使いのapacheのバージョンはいくつかわかりませんが(まぁ、多分2.4だと思うけど)、どのバージョンでも一緒に書くとエラーになると思います。
バージョンに合わせて書きなおしてください。

CGIのソースが表示される、というのが一番の謎だったのだけど、おそらくブラウザのキャッシュが残って表示されているんじゃないですかね。

(追記)
最初「起動しなくなる」と書きましたが、ちょっと怪しいので消しました。
でも、確認はしたほうがいいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/13 22:31

    katsukoさま アドバイスありがとうございます。まだはまっていますが、参考にさせていただきます! 取り急ぎ お礼まで

    キャンセル

+1

cgi_module または cgid_module が有効になっていないのだと思います。

$ sudo /usr/sbin/a2enmod cgid
$ ls /etc/apache2/mods-enabled/cgi*
/etc/apache2/mods-enabled/cgid.conf
/etc/apache2/mods-enabled/cgid.load
$ sudo /usr/sbin/service apache2 restart

また、標準では、/etc/apache2/conf-enabled/serve-cgi-bin.conf (../conf-available/serve-cgi-bin.conf へのシンボリックリンク)で ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ が定義されていて、apache2.conf に追加した設定と競合します。
apache2.conf の方を削除するか、または、下記のように serve-cgi-bin.conf を無効にする必要があります。

$ sudo /usr/sbin/a2disconf serv-cgi-bin
$ sudo /usr/sbin/service apache2 restart

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/14 01:11

    TaichiYanagiyaさま どうもありがとうございます。仰せのようにコマンドを打ちましたが、相変わらずエラーが出てしまっております。エラーログは以下のようになっております。もし何かわかれば教えていただけると大変助かります。夜分遅くありがとうございました。
    「[Sat May 14 01:06:51.355833 2016] [cgi:error] [pid 21505:tid 1953494064] [client (IPアドレス):50311] AH01215: (8)Exec format error: exec of '/home/(ユーザー名)/public_html/cgi-bin/test.py' failed, referer: http://(IPアドレス)/~(ユーザー名)/cgi-bin/
    [Sat May 14 01:06:51.358138 2016] [cgi:error] [pid 21505:tid 1953494064] [client (IPアドレス):50311] End of script output before headers: test.py, referer: http://(IPアドレス)/~(ユーザー名)/cgi-bin」

    以上の2点のエラーがでてしまいます・・・ほんとに夜分遅くにありがとうございます。

    キャンセル

  • 2016/05/14 11:34

    経過後報告です。

    その後アドバイスを踏まえ色々試行錯誤した結果、スクリプトの文字コードを見直したところ、おかげさまで、無事CGIが動きました! ご協力、ありがとうございました!

    となっているのが、問題となるケースもあるようでしたので、with BOMを消して、CRLF改行を消すと、無事実行されました!!

    ご協力いただきありがとうございました。

    キャンセル

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

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

関連した質問

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

  • Python

    8694questions

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

  • Apache

    1874questions

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

  • Raspberry Pi

    856questions

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