Nginx: upstream timed out
Nginxでバックエンドサーバーへの接続がタイムアウトした場合の原因と解決策
概要
Nginxがリバースプロキシとしてバックエンドサーバーに接続する際にタイムアウトするエラーです。
エラーメッセージ
``` upstream timed out (110: Connection timed out) while reading response header from upstream ```
原因
- バックエンドの処理時間超過: 重い処理でタイムアウト
- バックエンドの障害: サーバーが応答しない
- ネットワークの問題: 通信経路の遅延
- タイムアウト設定が短すぎる: デフォルト60秒
解決策
1. タイムアウト値を増加
```nginx
nginx.conf または server ブロック
location /api { proxy_pass http://backend;
# 接続タイムアウト
proxy_connect_timeout 60s;
# データ送信タイムアウト
proxy_send_timeout 60s;
# データ受信タイムアウト
proxy_read_timeout 300s; # 5分
} ```
2. upstreamの設定
```nginx upstream backend { server 127.0.0.1:3000 max_fails=3 fail_timeout=30s; server 127.0.0.1:3001 max_fails=3 fail_timeout=30s backup;
keepalive 32;
}
location /api { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection “”; } ```
3. バッファ設定を調整
```nginx location /api { proxy_pass http://backend;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
} ```
4. ヘルスチェックを設定
```nginx
nginx plus または lua-nginx-module が必要
upstream backend { zone backend 64k; server 127.0.0.1:3000;
# アクティブヘルスチェック
health_check interval=10 fails=3 passes=2;
} ```
5. FastCGI(PHP-FPM等)の場合
```nginx location ~ .php$ { fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 300s;
} ```
6. ログで詳細を確認
```bash
エラーログを確認
tail -f /var/log/nginx/error.log
より詳細なログ
error_log /var/log/nginx/error.log debug; ```
よくある間違い
- タイムアウトを無制限に大きくする
- バックエンドの問題を放置
- keepalive を設定しない
関連エラー
関連エラー
Nginx の他のエラー
この記事は役に立ちましたか?