1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django REST frameworkをmodwsgi + apacheでデプロイするときはVirtualHostを設定した方が良いみたい

Posted at

症状が発生してなんとか直ったけど、何故なのか良く分からなかった
という備忘録的な記事です

1. 症状と対処

以下のようにAPIをデプロイしました
・Django REST frameworkで作成したAPI
・mod_wsgiを使ってapacheサーバーにより公開
・WSL2環境にdockerでデプロイ
・dockerイメージはubuntuを使用

以下のような症状が出ました
・JavaScriptでfetchコマンドを使ってGETするとAPIが応答しなくなる
・最初にfetchコマンドを使ったときには結果を正常に受け取れる
・PythonのrequestsパッケージでGETしても止まらない
・ブラウザでAPIのURLを叩いていても何かの拍子に応答しなくなることがある
・応答が止まるとapacheのaccess.logもerror.logも書きだされなくなる
・応答が止まるとブラウザでURLを開いても応答しない
・docker exec -it xxxxx bashで入るとbashは正常に動いている
・docker statsで見ても負荷はほとんどかかっていない
・python manage.py runserverで実行しているときはこの症状は出ない

対処と結果
・デフォルトサーバーでをで記載した
・応答しなくなる不具合がまったく発生しなくなった
・全体にレスポンスが早くなった

2. apache.conf

問題が発生していたapache.conf

apache.conf
WSGIRestrictStdout Off

ServerName localhost:80

Define project_dir /var/web
Define project_name mysite
Define python_path /var/web/mysite

WSGIPassAuthorization On

WSGIDaemonProcess ${project_name} python-path=${python_path} inactivity-timeout=300
WSGIProcessGroup ${project_name}

WSGIScriptAlias / ${project_dir}/${project_name}/${project_name}/wsgi.py

ErrorLog /dev/stderr
CustomLog /dev/stdout combined

<Directory ${project_dir}/${project_name}/${project_name}>
<Files wsgi.py>
  Require all granted
</Files>
</Directory>

Alias /static/ ${project_dir}/${project_name}/static/
<Directory ${project_dir}/${project_name}/static>
  Require all granted
</Directory>

問題が直ったapache.conf

apache.conf
WSGIRestrictStdout Off

<VirtualHost *:80>
  ServerName localhost
  ServerAlias 127.0.0.1

  Define project_dir /var/web
  Define project_name mysite
  Define python_path /var/web/mysite

  WSGIPassAuthorization On

  WSGIDaemonProcess ${project_name} python-path=${python_path} inactivity-timeout=300
  WSGIProcessGroup ${project_name}

  WSGIScriptAlias / ${project_dir}/${project_name}/${project_name}/wsgi.py

  ErrorLog /dev/stderr
  CustomLog /dev/stdout combined

  <Directory ${project_dir}/${project_name}/${project_name}>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>

  Alias /static/ ${project_dir}/${project_name}/static/
  <Directory ${project_dir}/${project_name}/static>
    Require all granted
  </Directory>
</VirtualHost>

3. 原因の推測

原因が分からなかったのでChatGPTに聞いてみたら以下のように回答されました

「VirtualHostブロックで設定することで、WSGIProcessGroupのライフサイクルが明確に管理されて繰り返しのリクエストや並行リクエストで安定性が向上する」んだそうです

Django公式にそんなこと書いてあったかな?というのを確認しましたが、VirtualHostブロックを使って複数アプリをデプロイできるという記載はあるものの、繰り返しリクエスト時の安定性などについての記載はないようです
https://docs.djangoproject.com/ja/5.1/howto/deployment/wsgi/modwsgi/

4. 結論

apache自体あまり分かっていないのでそこから勉強したいと思います
もし原因が分かる方がいらっしゃいましたら教えてください

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?