症状が発生してなんとか直ったけど、何故なのか良く分からなかった
という備忘録的な記事です
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
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
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自体あまり分かっていないのでそこから勉強したいと思います
もし原因が分かる方がいらっしゃいましたら教えてください