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

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

ただいまの
回答率

89.13%

Python:Apacheでflaskを動かす際のapacheのhttpd.confの設定

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 6,943

jacky

score 45

pythonのflaskでwebアプリを作るときの
apacheのhttpd.confの設定について質問です。

単純にapacheでmod_wsgiモジュールを使った場合は
ただしく動作しました。

mod_wsgiモジュールで実行した場合

<VirtualHost *:80>
    LoadModule wsgi_module /usr/local/python/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

    WSGIDaemonProcess myapp user=my_user group=my_user
    WSGIProcessGroup myapp
    #WSGISocketPrefix /var/run/wsgi
    WSGIScriptAlias / /var/www/example.com/public/index.py
    ServerName example.com
    DocumentRoot "/var/www/example.com/public"
    <Directory "/var/www/example.com/public">
        AllowOverride All
        Options All
        MultiViewsMatch Handlers
        AddHandler wsgi-script .py
        AddHandler wsgi-script .wsgi
        DirectoryIndex index.html index.py index.php app.wsgi
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

mod_wsgiで動かす場合のpythonスクリプト

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return [b'Hello, world']


上記のようなよく見るソースで問題なく動かせました。

次にflaskで実行させる場合のapacheの設定をwebで調べたところ
人様のサイトですが以下のURLから引用させてもらいました。
http://blog.akashisn.info/entry/%3Fp%3D258
上記の文献の場合

flaskが動くと思われるapacheの設定

#flask.conf
<VirtualHost *:80>
    ServerName localhost

    WSGIDaemonProcess flask_app user=www-data group=www-data threads=5
    WSGIScriptAlias / /var/www/flask/flask_app.wsgi

    <Directory /var/www/flask>
        WSGIProcessGroup flask_app
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>


上記のようになっておりました。

そのため上記のような設定を踏まえて設定を変えたところ以下のようなシンタックスエラーがでました。

以下がエラー内容です
Syntax error on line 211 of /usr/local/apache/conf/httpd.conf:
Invalid command 'WSGIDaemonProcess', perhaps misspelled or defined by a module not included in the server configuration

結果的に動作させるためには

    LoadModule wsgi_module /usr/local/python/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so


上記のmod_wsgiモジュールを読み込ませないと動作しませんでした。

実際にflaskが動いた設定

<VirtualHost *:80>
    ServerName ***
    LoadModule wsgi_module /usr/local/python/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
    WSGIDaemonProcess app user=*** group=*** threads=5
    WSGIScriptAlias / /var/www/***/public/index.wsgi
    <Directory /var/www/***/public>
        Allowoverride All
        WSGIProcessGroup app
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

さて,質問としては
(1)このApacheの組み込みとして動かすためのmod_wsgiモジュールがなくてもflaskが動くという場合はどのような設定にすれば良いのでしょうか?

(2)また,flaskをつかった場合,スクリプトを修正してもapacheを再起動させないと,スクリプトの変更が反映されませんでした。
しかし,冒頭のflaskを使わずにpython+apacheのmod_wsgiで実行させる場合のようにapacheを再起動させずに
スクリプトを修正してその修正を反映さえるにはどのようにしたら良いのでしょうか?

(3)apacheのmod_wsgiを使った場合の動作とはphpなどのphp5_moduleやrubyのpassengerなどと同様にapacheのプロセスとして実行させるという認識でよろしいでしょうか?

以上,有識者の方ご教授いただけますと幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

mod_wsgiモジュールがなくてもflaskが動く

mod_wsgi を使いたくないということでしょうか・・・?

Flaskを使ったWebアプリケーションを動かすには WSGI に準拠したサーバーが必ず要ります。Apache 単体では動きません。(なお FastCGI も使えますが、Flask や Django など主要なフレームワークは WSGI を推奨しています)

主なWSGI環境として、mod_wsgi、uWSGI、Gunicorn などがあります。

mod_wsgi はあなたがやったように数行の設定を書くだけで自動で連携してれます。Apache を使うのであれば、mod_wsgi を使うのが最も手軽でパフォーマンスも出るのでおすすめです。

一方で uWSGI/Gunicorn を使う場合は uWSGI/Gunicorn をHTTPサーバーとして起動させつつ、そこに Apache や NGINX からリバースプロキシさせるのが一般的です。つまり2つのサーバーを動かして連携させてやる必要があるため、構築や運用が比較的難しい・面倒になります。


スクリプトを修正してもapacheを再起動させないと変更が反映されません

mod_wsgi の場合、設定ファイルに WSGIScriptReloading を入れることでファイルの更新を検出した場合に WSGI アプリケーションを自動で再起動してくれます。

WSGIDaemonProcess myapp user=hoge group=hoge threads=5
WSGIScriptAlias / /home/hoge/myapp/webapp.wsgi
WSGIScriptReloading On # ←これ

ただし Apache は WSGIScriptAlias で指定したファイルの更新しか監視しないのでそのへんはうまく対処してください。


mod_wsgiを使った場合apacheのプロセスとして実行

設定によって選べます。

mod_php のように Apache ウェブサーバーのプロセスで動くモードを 組み込みモード / embedded mode といいます。一方で、Apache とは独立したプロセスで動くモードを デーモンモード / daemon mode といいます。

あなたが設定した WSGIDaemonProcess app user=*** group=*** threads=5 は daemon mode で動かすための設定です。各フレームワークは daemon mode で動かすことを推奨していますし、自由度も高いのでこのまま daemon mode を使うことをおすすめします。

もし PHP のように embedded mode で動かしたい場合は WSGIScriptAlias / /var/www/***/public/index.wsgi の一行だけ書けばよいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/27 19:44

    ご回答ありがとうとざいmす!
    mod_wsgiモジュールは必須なのですね!

    >mod_wsgi を使いたくないということでしょうか・・・?

    >Flaskを使ったWebアプリケーションを動かすには WSGI に準拠したサーバーが必ず要ります。Apache >単体では動きません。(なお FastCGI も使えますが、Flask や Django など主要なフレームワークは >WSGI を推奨しています)

    上記の件は,幾つかflaskを動かしているブログをのぞいたのですが全て
    LoadModuleの記述がなかったので,mod_wsgiナシでも動くの?と思った次第です。
    とりあえずmod_wsgi必須なのはわかったのでたすかりました。

    キャンセル

  • 2017/08/28 11:56

    通常、パッケージマネージャ(yum, apt-get)で mod_wsgi をインストールすれば自動で LoadModule の設定が追加されるため、ほとんどのサイトでは同設定に触れていないのだと思います。

    原因としては
    ・自動追加された LoadModule の設定より先に Flask 関連の設定を書いてしまっている(Apache設定ファイルがいくつもあるため、ロード順を意識して設定しなければなりません)
    ・Ubuntu を使っている場合:モジュールの有効化コマンド(sudo a2enmod mod-wsgi )をし忘れている
    ・特殊な方法で mod_wsgi をインストールした
    などが考えられます。

    まあ今動いているのであればそのまま使うのも良いと思います。

    キャンセル

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

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