# Ubuntu 24 nginx サーバー 522 エラー原因調査手順
Ubuntu 24 で nginx サーバーを運用している際に、522 エラーが急に発生した場合の原因調査手順を解説します。
522 エラーは、Cloudflare などの CDN やプロキシサービス経由でアクセスしている場合に発生するエラーコードで、オリジンサーバー(nginx)との接続がタイムアウトしたことを示します。
# 522 エラーとは
522 エラーは、Cloudflare がオリジンサーバーに接続しようとした際に、接続タイムアウトが発生した場合に表示されるエラーです。
| エラーコード | 説明 |
|---|---|
| 522 | Connection timed out(接続タイムアウト) |
| 520 | Web server is returning an unknown error |
| 521 | Web server is down |
| 523 | Origin is unreachable |
| 524 | A timeout occurred |
522 エラーの特徴
- Cloudflare がオリジンサーバーに接続できない
- サーバーが応答しない、またはタイムアウトしている
- サーバー自体は稼働しているが、ネットワークやファイアウォールの問題の可能性
# 原因の可能性
522 エラーが発生する主な原因は以下の通りです。
| 原因カテゴリ | 具体的な原因 |
|---|---|
| サーバー停止 | nginx プロセスが停止している |
| ファイアウォール | ポート 80/443 がブロックされている |
| ネットワーク | サーバーへのネットワーク接続が切断されている |
| リソース不足 | CPU、メモリ、ディスク容量が不足している |
| nginx 設定エラー | 設定ファイルの構文エラーや設定ミス |
| タイムアウト設定 | nginx のタイムアウト設定が短すぎる |
| SSL 証明書 | SSL 証明書の期限切れや設定ミス |
# 調査手順
# フェーズ 1: 基本確認(最初に確認すべき項目)
# 1. サーバーへの接続確認
# SSH接続を試みる
ssh user@your-server-ip
# サーバーの稼働状況を確認
uptime
接続できない場合
SSH 接続ができない場合は、サーバー自体がダウンしているか、ネットワークの問題が考えられます。クラウドプロバイダーのコンソールでサーバーの状態を確認してください。
# 2. nginx プロセスの確認
# nginx プロセスの確認
sudo systemctl status nginx
# プロセスの詳細確認
ps aux | grep nginx
sudo systemctl status nginx -l
正常な場合の出力例:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-01-27 10:00:00 JST; 1h 30min ago
異常な場合(停止している):
# nginx を起動
sudo systemctl start nginx
sudo systemctl enable nginx
# 3. ポートの確認
# ポート80と443がリッスンしているか確認
sudo ss -tlnp | grep -E ':(80|443)'
# または
sudo netstat -tlnp | grep -E ':(80|443)'
# より詳細な情報を取得
sudo lsof -i :80
sudo lsof -i :443
正常な場合の出力例:
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=7))
ポートがリッスンしていない場合
nginx が起動していてもポートがリッスンしていない場合は、設定ファイルに問題がある可能性があります。
# 4. ファイアウォールの確認
# ファイアウォールの状態確認
sudo ufw status verbose
# ポートが閉じている場合は開放
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
# iptablesのルールも確認
sudo iptables -L -n -v | grep -E '(80|443)'
# 5. nginx 設定ファイルの確認
# 設定ファイルの構文チェック
sudo nginx -t
# より詳細な情報を表示
sudo nginx -T
正常な場合の出力例:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
設定エラーがある場合
エラーが表示された場合は、該当する行を修正してください。エラーメッセージに表示されているファイル名と行番号を確認し、構文エラーを修正します。
# フェーズ 2: ログとリソースの確認
# 6. ログファイルの確認
nginx ログの確認
# エラーログの最新50行を表示
sudo tail -n 50 /var/log/nginx/error.log
# リアルタイムでログを監視
sudo tail -f /var/log/nginx/error.log
# アクセスログの確認
sudo tail -n 50 /var/log/nginx/access.log
# ログファイルの場所を確認
sudo nginx -T 2>/dev/null | grep -E "access_log|error_log"
確認すべきエラーパターン:
connect() failed (111: Connection refused)upstream timed outSSL_do_handshake() failedtoo many open filesworker_connections are not enoughno live upstreamsconnection reset by peer
ログ調査コマンド
# エラーログから特定の時間帯のエラーを抽出
sudo grep "2025-01-27 10:" /var/log/nginx/error.log
# エラーログから重複を除いてユニークなエラーを表示
sudo grep -i error /var/log/nginx/error.log | sort | uniq -c | sort -rn
# タイムアウト関連のエラーを検索
sudo grep -i "timeout\|timed out" /var/log/nginx/error.log
# SSL/TLS関連のエラーを検索
sudo grep -i "ssl\|tls\|certificate" /var/log/nginx/error.log
# アクセスログから特定のステータスコードを検索
sudo grep " 522 \| 502 \| 504 " /var/log/nginx/access.log
# アクセスログから最もアクセスが多いIPアドレスを表示
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
システムログの確認
# システム全体のログを確認
sudo journalctl -xe
# 最近のシステムログを確認(最新50行)
sudo journalctl -n 50
# エラーレベルのログのみを確認
sudo journalctl -p err -n 50
# nginx関連のログを確認
sudo journalctl -u nginx -n 100
sudo journalctl -u nginx --since "1 hour ago"
# カーネルログの確認
sudo dmesg | tail -n 50 | grep -i error
# 7. システムリソースの確認
CPU 使用状況
# CPU使用率をリアルタイムで確認
top
# または(より見やすい)
htop
# CPUコア数と情報を確認
nproc
lscpu
# プロセスごとのCPU使用率を表示
ps aux --sort=-%cpu | head -20
メモリ使用状況
# メモリ使用状況を確認
free -h
# プロセスごとのメモリ使用率を表示
ps aux --sort=-%mem | head -20
# nginxプロセスのメモリ使用量を確認
ps aux | grep nginx | awk '{sum+=$6} END {print sum/1024 " MB"}'
# スワップ使用状況を確認
swapon --show
ディスク使用状況
# ディスク使用率を確認
df -h
# inode使用率を確認
df -i
# 特定のディレクトリの使用量を確認
du -sh /var/log /var/www /etc/nginx
# 大きなログファイルを検索
find /var/log -type f -size +100M
システムリソースの総合確認
# システムリソースを総合的に確認
vmstat 1 5
# ディスクI/O統計を確認
iostat -x 1 5
確認ポイント:
- CPU 使用率が 100%に近い
- メモリ使用率が 90%以上
- スワップが頻繁に使用されている
- ディスク使用率が 90%以上
- ディスク I/O が飽和している
リソース不足の場合
リソースが不足している場合は、不要なプロセスを停止するか、サーバーのスペックを上げることを検討してください。
# フェーズ 3: 詳細調査(基本確認で原因が特定できない場合)
# 8. ネットワーク関連の詳細調査
基本的な接続テスト
# サーバーから外部への接続テスト
ping -c 4 8.8.8.8
ping -c 4 google.com
# サーバー自身のポート80/443への接続テスト
curl -I http://localhost
curl -I https://localhost
curl -v http://localhost
# nc(netcat)を使用した接続テスト
nc -zv localhost 80
nc -zv localhost 443
ネットワークインターフェース
# ネットワークインターフェースの状態を確認
ip addr show
# ネットワークインターフェースの統計情報を確認
ip -s link show
cat /proc/net/dev
# ネットワークインターフェースのエラーを確認
ethtool -S eth0 | grep -i error
ネットワーク接続の詳細
# アクティブなネットワーク接続を確認
ss -tuln
# 接続状態別の接続数を確認
ss -s
# 特定のポートへの接続を確認
ss -an | grep -E ':(80|443)'
# 接続数の統計を確認
ss -ant | awk '{print $1}' | sort | uniq -c
# ESTABLISHED状態の接続数を確認
ss -ant | grep ESTAB | wc -l
ルーティングと DNS
# ルーティングテーブルを確認
ip route show
# デフォルトゲートウェイを確認
ip route | grep default
# DNS解決をテスト
dig example.com
nslookup example.com
# DNSサーバーの設定を確認
cat /etc/resolv.conf
Cloudflare 経由の接続確認
# サーバーのパブリックIPアドレスを確認
curl ifconfig.me
curl ipinfo.io/ip
# サーバーからCloudflareへの接続をテスト
curl -I https://www.cloudflare.com
# リバースDNSを確認
dig -x $(curl -s ifconfig.me)
# 9. プロセスの詳細確認
# プロセスツリーを表示
pstree -p
# nginx関連のプロセスを詳細に確認
ps auxf | grep nginx
pgrep -a nginx
# プロセスのリソース使用状況を確認
pidstat -p $(pgrep nginx | head -1) 1 5
# プロセスのオープンファイル数を確認
lsof -p $(pgrep nginx | head -1) | wc -l
# ゾンビプロセスの確認
ps aux | grep -w Z
# 10. ディスクとファイルシステムの詳細確認
# ディスクI/Oの詳細を確認
sudo iotop
# ファイルシステムのエラーを確認
dmesg | grep -i "filesystem\|i/o error"
# ディスクの健康状態を確認(SMART情報)
sudo smartctl -a /dev/sda
# ログファイルのサイズを時系列で確認
ls -lhS /var/log/nginx/
# ログファイルの総サイズを確認
du -ch /var/log/nginx/*.log | tail -1
# 11. SSL 証明書の確認
# SSL証明書の有効期限を確認
sudo openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates
# 証明書の詳細を確認
sudo openssl x509 -in /etc/nginx/ssl/cert.pem -noout -text
# Let's Encrypt証明書の場合
sudo certbot certificates
SSL 証明書の期限切れ
証明書が期限切れの場合、HTTPS 接続が失敗し、522 エラーが発生する可能性があります。証明書を更新してください。
# 12. Cloudflare の設定確認
Cloudflare を使用している場合、Cloudflare 側の設定も確認します。
確認項目:
- DNS 設定: A レコードが正しい IP アドレスを指しているか
- プロキシ設定: プロキシが有効になっているか(オレンジの雲アイコン)
- SSL/TLS 設定: SSL/TLS モードが適切に設定されているか
- ファイアウォールルール: サーバーの IP アドレスがブロックされていないか
# フェーズ 4: 調査ツールの活用
# 13. システム監視ツール
# htopのインストールと使用(より見やすいtop)
sudo apt-get install htop
htop
# iotopのインストールと使用(ディスクI/O監視)
sudo apt-get install iotop
sudo iotop
# nethogsのインストールと使用(ネットワーク使用量)
sudo apt-get install nethogs
sudo nethogs
# nloadのインストールと使用(ネットワーク帯域監視)
sudo apt-get install nload
nload
# 14. ネットワーク診断ツール
# tcpdumpのインストールと使用(パケットキャプチャ)
sudo apt-get install tcpdump
sudo tcpdump -i eth0 port 80
# nmapのインストールと使用(ポートスキャン)
sudo apt-get install nmap
sudo nmap -p 80,443 localhost
# mtrのインストールと使用(ネットワーク診断)
sudo apt-get install mtr
mtr 8.8.8.8
# 15. ログ分析ツール
# goaccessのインストールと使用(アクセスログ分析)
sudo apt-get install goaccess
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED -o report.html
# logwatchのインストールと使用(ログ分析)
sudo apt-get install logwatch
sudo logwatch
# 16. パフォーマンス分析ツール
# sysstatのインストールと使用(システム統計)
sudo apt-get install sysstat
sar -u 1 10 # CPU使用率
sar -r 1 10 # メモリ使用率
sar -b 1 10 # I/O統計
sar -n DEV 1 10 # ネットワーク統計
# straceのインストールと使用(システムコールトレース)
sudo apt-get install strace
sudo strace -p $(pgrep nginx | head -1)
# 17. 自動化された調査スクリプト
# 包括的な調査を自動実行するスクリプト
cat > /tmp/nginx-troubleshoot.sh << 'EOF'
#!/bin/bash
echo "=== Nginx Troubleshooting Report ==="
echo "Generated: $(date)"
echo ""
echo "=== 1. System Status ==="
uptime
echo ""
echo "=== 2. Nginx Process Status ==="
systemctl status nginx --no-pager -l | head -20
echo ""
echo "=== 3. Port Status ==="
ss -tlnp | grep -E ':(80|443)'
echo ""
echo "=== 4. Recent Errors ==="
tail -n 30 /var/log/nginx/error.log
echo ""
echo "=== 5. Resource Usage ==="
echo "CPU:"
top -bn1 | grep "Cpu(s)"
echo "Memory:"
free -h
echo "Disk:"
df -h | grep -E '^/dev/'
echo ""
echo "=== 6. Active Connections ==="
ss -s
echo ""
echo "=== 7. Network Interfaces ==="
ip addr show | grep -E "^[0-9]+:|inet "
echo ""
echo "=== 8. Firewall Status ==="
ufw status
echo ""
echo "=== 9. SSL Certificate Status ==="
if [ -f /etc/nginx/ssl/cert.pem ]; then
openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates
fi
echo ""
echo "=== Report Complete ==="
EOF
chmod +x /tmp/nginx-troubleshoot.sh
sudo /tmp/nginx-troubleshoot.sh > /tmp/nginx-troubleshoot-report.txt
cat /tmp/nginx-troubleshoot-report.txt
# 解決方法
# 解決方法 1: nginx の再起動
最も簡単な解決方法として、nginx を再起動します。
# nginx を再起動
sudo systemctl restart nginx
# 再起動後の状態を確認
sudo systemctl status nginx
# 解決方法 2: タイムアウト設定の調整
nginx のタイムアウト設定を調整します。
/etc/nginx/nginx.conf を編集:
http {
# タイムアウト設定を延長
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
# KeepAlive設定
keepalive_timeout 65;
keepalive_requests 100;
}
設定を反映:
# 設定ファイルの構文チェック
sudo nginx -t
# nginx を再読み込み
sudo systemctl reload nginx
# 解決方法 3: worker_connections の調整
接続数が上限に達している場合、worker_connections を増やします。
/etc/nginx/nginx.conf を編集:
events {
worker_connections 2048;
use epoll;
multi_accept on;
}
# 解決方法 4: ファイルディスクリプタの上限を上げる
too many open files エラーが発生している場合、ファイルディスクリプタの上限を上げます。
# 現在の上限を確認
ulimit -n
# 一時的に上限を上げる
ulimit -n 65535
# 永続的に設定する場合、/etc/security/limits.conf を編集
sudo vim /etc/security/limits.conf
/etc/security/limits.conf に追加:
* soft nofile 65535
* hard nofile 65535
# 解決方法 5: ログローテーション
ログファイルが大きくなりすぎている場合、ログローテーションを実行します。
# ログローテーションを手動実行
sudo logrotate -f /etc/logrotate.d/nginx
# 古いログを削除(注意して実行)
sudo find /var/log/nginx -name "*.log" -mtime +30 -delete
# 解決方法 6: ディスク容量の確保
ディスク容量が不足している場合、不要なファイルを削除します。
# 一時ファイルを削除
sudo find /tmp -type f -atime +7 -delete
sudo find /var/tmp -type f -atime +7 -delete
# 古いログファイルを削除
sudo find /var/log -name "*.log" -mtime +30 -delete
sudo find /var/log -name "*.gz" -mtime +90 -delete
# パッケージキャッシュをクリーンアップ
sudo apt-get clean
sudo apt-get autoremove
# システムの不要なファイルをクリーンアップ
sudo journalctl --vacuum-time=7d
# 予防策
522 エラーを予防するための設定を紹介します。
# 1. モニタリングの設定
# systemd の自動再起動設定を確認
sudo systemctl edit nginx
# 以下の内容を追加
[Service]
Restart=always
RestartSec=10
# 2. ヘルスチェックの設定
nginx のヘルスチェックエンドポイントを設定:
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
# 3. ログ監視の設定
# エラーログを監視するスクリプトを作成
sudo vim /usr/local/bin/nginx-monitor.sh
#!/bin/bash
ERROR_COUNT=$(tail -n 100 /var/log/nginx/error.log | grep -c "error")
if [ $ERROR_COUNT -gt 10 ]; then
systemctl restart nginx
echo "$(date): Nginx restarted due to high error count" >> /var/log/nginx-restart.log
fi
# スクリプトに実行権限を付与
sudo chmod +x /usr/local/bin/nginx-monitor.sh
# crontabに追加(5分ごとに実行)
sudo crontab -e
# 以下を追加: */5 * * * * /usr/local/bin/nginx-monitor.sh
# 実装時の注意点
Ubuntu 24 nginx サーバーで 522 エラーが発生した場合の調査手順。
# 調査の優先順位
フェーズ 1: 基本確認(最初に実行)
- サーバーへの接続確認
- nginx プロセスの確認
- ポートの確認
- ファイアウォールの確認
- nginx 設定ファイルの確認
フェーズ 2: ログとリソースの確認
- ログファイルの確認
- システムリソースの確認
フェーズ 3: 詳細調査(基本確認で原因が特定できない場合)
- ネットワーク関連の詳細調査
- プロセスの詳細確認
- ディスクとファイルシステムの詳細確認
- SSL 証明書の確認
- Cloudflare の設定確認
フェーズ 4: 調査ツールの活用
- システム監視ツール
- ネットワーク診断ツール
- ログ分析ツール
- パフォーマンス分析ツール
- 自動化された調査スクリプト
# よくある原因と解決方法
| 原因 | 解決方法 |
|---|---|
| nginx が停止 | sudo systemctl start nginx |
| ポートが閉じている | sudo ufw allow 80/tcp |
| 設定ファイルエラー | sudo nginx -t で確認して修正 |
| リソース不足 | サーバースペックの見直し |
| SSL 証明書期限切れ | 証明書の更新 |
| ディスク容量不足 | 不要なファイルの削除 |
# 推奨事項
- 定期的なログ監視とアラート設定
- 自動再起動設定の有効化
- ヘルスチェックエンドポイントの設定
- リソース使用状況の定期的な確認
- ディスク容量の監視
522 エラーは、サーバー側の問題であることが多いため、上記の手順に従って段階的に調査することで、原因を特定しやすくなります。
関連情報: nginx 公式ドキュメント (opens new window), Cloudflare 522 エラー (opens new window)