# 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 out
  • SSL_do_handshake() failed
  • too many open files
  • worker_connections are not enough
  • no live upstreams
  • connection 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 側の設定も確認します。

確認項目:

  1. DNS 設定: A レコードが正しい IP アドレスを指しているか
  2. プロキシ設定: プロキシが有効になっているか(オレンジの雲アイコン)
  3. SSL/TLS 設定: SSL/TLS モードが適切に設定されているか
  4. ファイアウォールルール: サーバーの 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: 基本確認(最初に実行)

  1. サーバーへの接続確認
  2. nginx プロセスの確認
  3. ポートの確認
  4. ファイアウォールの確認
  5. nginx 設定ファイルの確認

フェーズ 2: ログとリソースの確認

  1. ログファイルの確認
  2. システムリソースの確認

フェーズ 3: 詳細調査(基本確認で原因が特定できない場合)

  1. ネットワーク関連の詳細調査
  2. プロセスの詳細確認
  3. ディスクとファイルシステムの詳細確認
  4. SSL 証明書の確認
  5. Cloudflare の設定確認

フェーズ 4: 調査ツールの活用

  1. システム監視ツール
  2. ネットワーク診断ツール
  3. ログ分析ツール
  4. パフォーマンス分析ツール
  5. 自動化された調査スクリプト

# よくある原因と解決方法

原因 解決方法
nginx が停止 sudo systemctl start nginx
ポートが閉じている sudo ufw allow 80/tcp
設定ファイルエラー sudo nginx -t で確認して修正
リソース不足 サーバースペックの見直し
SSL 証明書期限切れ 証明書の更新
ディスク容量不足 不要なファイルの削除

# 推奨事項

  • 定期的なログ監視とアラート設定
  • 自動再起動設定の有効化
  • ヘルスチェックエンドポイントの設定
  • リソース使用状況の定期的な確認
  • ディスク容量の監視

522 エラーは、サーバー側の問題であることが多いため、上記の手順に従って段階的に調査することで、原因を特定しやすくなります。


関連情報: nginx 公式ドキュメント (opens new window), Cloudflare 522 エラー (opens new window)

同じタグを持つ記事をピックアップしました。