当サイト、Webサーバはnginxを使用しています。
ゲームのサーバ部分はJavaで作っていますので、ゲームへのパスだけアプリケーションサーバへ転送をしています。
今回のゲームではCometを使用しているので、サーバではクライアントからの接続が保留されている状態です。
この接続がnginxのタイムアウトで切断される、という事態が発生しました。
クライアントに返されるエラーコードは504(Gateway Timeout)です。
調べたところ、今回のタイムアウトの設定に関係しそうな設定値は
「proxy_connect_timeout」「proxy_send_timeout」「proxy_read_timeout」あたりでした。
- proxy_connect_timeout バックエンドサーバとの接続タイムアウト時間
- proxy_send_timeout バックエンドサーバへのデータ送出のタイムアウト時間
- proxy_read_timeout バックエンドからのデータ受信のタイムアウト時間
nginxがバックエンドサーバにTCPコネクションを張る時間が「proxy_connect_timeout」、コネクションを張った後、バックエンドサーバにリクエストを送信する時間が「proxy_send_timeout」、バックエンドサーバからのレスポンスを受信する時間が「proxy_read_timeout」ということでしょうか。
今回はアプリケーションサーバからレスポンスが返ってこなくてエラーが発生したので、「proxy_read_timeout」の設定を変更し、無事にタイムアウトが発生しなくなりました。
nginxの「proxy_read_timeout」のデフォルト値は60(秒)です。
本来なら、Webサーバの設定は変えず、アプリケーションの方で60秒以内に再接続する仕組みの方がよさそうなので、アプリケーションを改良したいと思っています。