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

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

ただいまの
回答率

88.06%

apache(ubuntu)+cgiでflaskアプリを実行する方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,132

score 14

こんにちは。
今、WEBサーバの勉強していますが、アプリケーションが上手く実行できなかったのでここで質問させて頂きました。

質問内容としては、下記諸環境下でapacheにflaskアプリケーションを設置し、ブラウザからアクセスしてもブラウザには下記のような表記しか出ないことです。

NOT FOUND
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.


最近の主流がHerokuなどであることは承知していますが、WEBサーバの動きやサーバプログラムを稼働させるためのインターフェイスの機能や動きを理解しようと考え、静的ファイルの表示から動的ファイル表示(CGI->FastCGI->mod_wsgi->WSGI)へという流れで勉強を進めようとしているところです。

下記に諸設定と私が推測する原因をまとめていますの解決方法(flaskを利用した簡易的なアプリケーションの実行とブラウザでの表示)をご教示頂ければと思います。

なお、ローカル環境を汚したくないのでdockerを利用し、また実際のセルフデプロイ、WEBサーバ構築を想定してubuntuからインストールする形をとっています(OSにubuntuを選んでいるのはLinux系のサーバOSのシェアが世界No.1なので、ubuntuやdebian系LinuxOSの使い方を知っておいて損はないだろうとの考えからです)。

(環境)

docker=18.0.9
ubuntu=18.04
apache=2.4.29(ubuntu)

(dockerの構築方法)

$ docker --name apache-test -it -p 2000:80 ubuntu:latest


(apacheの環境構築)

:/# apt install -y apache2 vim python3.6 python3-pip
:/# pip3 install flask


(apache内の設定)
・mod_cgid有効化済み
・/etc/apache/conf-enabled/serve-cgi-bin.conf

<IfModule mod_alias.c>
        <IfModule mod_cgi.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfModule mod_cgid.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfDefine ENABLE_USR_LIB_CGI_BIN>
                ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/index.cgi
                <Directory "/usr/lib/cgi-bin">
                        AllowOverride None
                        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                        Require all granted
                        AddHandler cgi-script .cgi .py
                </Directory>
        </IfDefine>
</IfModule>


・/etc/apache2/apache2.conf -> SERVERNAMEを追加したのみ(hogehoge)

・/etc/apache2/sites-enabled/000-default.conf -> 初期設定のまま
※他の設定ファイルについては、特にいじっていません。またどういう動き、機能であるかを理解することに主眼を置いているので、細かい事務的なような設定は今回施していません。

(アプリケーション関連のスクリプト)
・/usr/lib/cgi-bin/index.cgi

!/usr/bin/python3.6
import os
from wsgiref.handlers import CGIHandler
from flaskr import app

if __name__=="__main__":
    os.environ['SERVER_NAME'] = 'hogehoge'
    os.environ['SERVER_PORT'] = "80"
    os.environ['REQUEST_METHOD'] = "GET"
    CGIHandler().run(app)

※os.environ部分はpycharmでエラーが出たので手動しています

・/usr/lib/cgi-bin/flaskr.py

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
import flask

app = flask.Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

if __name__=="__main__":
    app.run(debug=True)


※画面に'Hello World'が単純に表示されるものです。

以上が環境です。pycharmで実行コードの結果などを見ても、apacheの諸設定よりもflaskrのappかまたはCGIHandlerの実行結果が空か何も返さないので、結果的に404 Not Foundになるのかなと考えています。
実際、flaskr.pyでわざとエラーを起こすと500 Internal Errorに変わります。

mod_rewriteや.htaccessはURLの表示や実際のファイルへの移動などを行うものだと認識しており、ScriptAliasの設定だけでアプリの実行自体には影響はないのではないかと思い、設置していません(実際にflask公式サイトを参考に設置してもうまくいきませんでした)。

上記のように推測してはいるのですが、理由が全くわからず、四苦八苦しています。

flaskやApacheの公式ドキュメントを主に参照していますが、適宜ググって出て来たサイトも参考にしています。

どうぞよろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

回答がつかないので、一旦解決したものとして、募集を終了します。

docker環境であることか、またはpathか何かの非明示的に取り込まれ、設定される部分が不適切なような気がしますが、おいおいまた色々と試して見たいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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