Files
rogaining_srv/debug_502_error.py
2025-09-06 02:56:50 +09:00

319 lines
11 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
502エラー調査スクリプト: checkin_from_rogappエンドポイントのデバッグ
"""
import subprocess
import time
import requests
import json
from datetime import datetime
def test_checkin_endpoint():
"""
checkin_from_rogappエンドポイントをテストして502エラーを再現
"""
print("🔍 502エラー調査: checkin_from_rogappエンドポイント")
print("=" * 60)
# テストデータ
test_data = {
"event_code": "fc_gifu_2025",
"team_name": "テストチーム",
"cp_number": "1",
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABA...", # 短縮版
"buy_flag": False,
"gps_coordinates": {
"latitude": 35.6762,
"longitude": 139.6503,
"accuracy": 5.0,
"timestamp": datetime.now().isoformat()
},
"camera_metadata": {
"capture_time": datetime.now().isoformat(),
"device_info": "debug_script"
}
}
# URLを構築
base_url = "http://localhost:8100"
checkin_url = f"{base_url}/gifuroge/checkin_from_rogapp"
print(f"🎯 テスト対象URL: {checkin_url}")
print(f"📊 テストデータ: {json.dumps({k: v if k != 'image' else '[BASE64_DATA]' for k, v in test_data.items()}, indent=2, ensure_ascii=False)}")
# まず、GETリクエストでエンドポイントの存在確認
print(f"\n🔍 エンドポイント存在確認GETリクエスト")
try:
get_response = requests.get(checkin_url, timeout=10)
print(f"GET レスポンス: {get_response.status_code}")
if get_response.status_code == 405:
print(f"✅ エンドポイントは存在するが、GETメソッドは許可されていない正常")
elif get_response.status_code == 404:
print(f"❌ エンドポイントが見つからない")
return False
except Exception as e:
print(f"❌ GET テストエラー: {e}")
# 正しいURLパターンでもテスト
alternative_urls = [
f"{base_url}/rog/checkin_from_rogapp",
f"{base_url}/api/checkin_from_rogapp",
f"{base_url}/checkin_from_rogapp"
]
print(f"\n🔍 代替URLパターンテスト")
for url in alternative_urls:
try:
resp = requests.get(url, timeout=5)
print(f" {url}: {resp.status_code}")
if resp.status_code in [200, 405]:
print(f" ✅ このURLが正しい可能性があります")
except:
print(f" {url}: 接続エラー")
try:
print(f"\n🚀 POSTリクエスト送信中...")
# リクエスト送信
response = requests.post(
checkin_url,
json=test_data,
headers={
'Content-Type': 'application/json',
'User-Agent': 'Debug-Script/1.0'
},
timeout=30
)
print(f"📥 レスポンス受信:")
print(f" ステータスコード: {response.status_code}")
print(f" ヘッダー: {dict(response.headers)}")
if response.status_code == 405:
print(f"❌ 405 Method Not Allowed エラー")
print(f" 💡 原因: エンドポイントが存在するが、POSTメソッドが許可されていない")
print(f" 📋 許可されているメソッドを確認が必要")
print(f" レスポンステキスト: {response.text}")
return False
elif response.status_code == 502:
print(f"❌ 502 Bad Gateway エラーを確認しました")
print(f" レスポンステキスト: {response.text}")
return False
elif response.status_code == 200:
print(f"✅ 正常レスポンス")
print(f" レスポンスデータ: {response.json()}")
return True
else:
print(f"⚠️ 予期しないステータスコード: {response.status_code}")
print(f" レスポンステキスト: {response.text}")
return False
except requests.exceptions.ConnectionError as e:
print(f"❌ 接続エラー: {e}")
return False
except requests.exceptions.Timeout as e:
print(f"❌ タイムアウトエラー: {e}")
return False
except Exception as e:
print(f"❌ その他のエラー: {e}")
return False
def monitor_logs_during_test():
"""
テスト実行中のログを監視
"""
print(f"\n🔍 ログ監視開始")
print("-" * 40)
try:
# アプリケーションログを監視
result = subprocess.run(
['docker', 'compose', 'logs', '--tail=20', '--follow', 'app'],
capture_output=True,
text=True,
timeout=10
)
print(f"📋 アプリケーションログ:")
print(result.stdout)
if result.stderr:
print(f"⚠️ エラー出力:")
print(result.stderr)
except subprocess.TimeoutExpired:
print(f"⏰ ログ監視タイムアウト(正常)")
except Exception as e:
print(f"❌ ログ監視エラー: {e}")
def check_docker_services():
"""
Dockerサービスの状態確認
"""
print(f"\n🐳 Dockerサービス状態確認")
print("-" * 40)
try:
# サービス状態確認
result = subprocess.run(
['docker', 'compose', 'ps'],
capture_output=True,
text=True,
check=True
)
print(f"📊 サービス状態:")
print(result.stdout)
# ヘルスチェック
health_result = subprocess.run(
['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'check'],
capture_output=True,
text=True
)
if health_result.returncode == 0:
print(f"✅ Djangoアプリケーション: 正常")
print(health_result.stdout)
else:
print(f"❌ Djangoアプリケーション: エラー")
print(health_result.stderr)
except subprocess.CalledProcessError as e:
print(f"❌ Dockerコマンドエラー: {e}")
print(f"stderr: {e.stderr}")
except Exception as e:
print(f"❌ その他のエラー: {e}")
def analyze_nginx_config():
"""
nginx設定の確認
"""
print(f"\n🌐 nginx設定確認")
print("-" * 40)
try:
# nginx設定テスト
result = subprocess.run(
['docker', 'compose', 'exec', 'nginx', 'nginx', '-t'],
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"✅ nginx設定: 正常")
print(result.stdout)
else:
print(f"❌ nginx設定: エラー")
print(result.stderr)
# 最近のnginxエラーログ
error_log_result = subprocess.run(
['docker', 'compose', 'logs', '--tail=10', 'nginx'],
capture_output=True,
text=True
)
print(f"\n📋 nginx最近のログ:")
print(error_log_result.stdout)
except Exception as e:
print(f"❌ nginx確認エラー: {e}")
def check_django_configuration():
"""
Django設定の確認
"""
print(f"\n⚙️ Django設定確認")
print("-" * 40)
try:
# Django URL設定の確認
result = subprocess.run(
['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'show_urls'],
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"✅ URL確認コマンド実行成功")
# checkin_from_rogappが含まれているかチェック
if 'checkin_from_rogapp' in result.stdout:
print(f"✅ checkin_from_rogappエンドポイントがURL設定に存在")
else:
print(f"❌ checkin_from_rogappエンドポイントがURL設定に見つからない")
print(f"URL一覧抜粋:")
for line in result.stdout.split('\n'):
if 'checkin' in line.lower() or 'rogapp' in line.lower():
print(f" {line}")
else:
print(f"⚠️ show_urlsコマンドが利用できません")
# CSRF設定確認
csrf_result = subprocess.run(
['docker', 'compose', 'exec', 'app', 'python', '-c',
"import django; django.setup(); from django.conf import settings; print(f'CSRF_COOKIE_SECURE: {settings.CSRF_COOKIE_SECURE}'); print(f'CSRF_TRUSTED_ORIGINS: {getattr(settings, \"CSRF_TRUSTED_ORIGINS\", \"Not set\")}')"],
capture_output=True,
text=True
)
if csrf_result.returncode == 0:
print(f"\n🔒 CSRF設定:")
print(csrf_result.stdout)
else:
print(f"⚠️ CSRF設定確認エラー: {csrf_result.stderr}")
except Exception as e:
print(f"❌ Django設定確認エラー: {e}")
def main():
"""
メイン実行関数
"""
print(f"🚨 405 Method Not Allowed エラー調査ツール")
print(f"時刻: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 1. Dockerサービス状態確認
check_docker_services()
# 2. nginx設定確認
analyze_nginx_config()
# 3. Django設定確認
check_django_configuration()
# 4. エンドポイントテスト
print(f"\n🎯 エンドポイントテスト実行")
print("-" * 40)
success = test_checkin_endpoint()
# 5. ログ確認
monitor_logs_during_test()
# 結果まとめ
print(f"\n📊 調査結果まとめ")
print("=" * 60)
if success:
print(f"✅ checkin_from_rogappエンドポイントは正常に動作しています")
print(f"💡 502エラーは一時的な問題だった可能性があります")
else:
print(f"❌ 405 Method Not Allowed エラーを確認しました")
print(f"💡 問題の原因と対策:")
print(f" 🔧 考えられる原因:")
print(f" 1. CSRFトークンの問題")
print(f" 2. @api_viewデコレータの設定問題")
print(f" 3. URLパターンの不一致")
print(f" 4. nginx設定でPOSTメソッドがブロックされている")
print(f" 🛠️ 推奨対策:")
print(f" 1. views.pyで@api_view(['POST'])の設定確認")
print(f" 2. urls.pyでのルーティング確認")
print(f" 3. nginx設定でPOSTメソッド許可確認")
print(f" 4. CSRF設定の確認")
if __name__ == "__main__":
main()