Railsのエラー『SystemCallError: getaddrinfo: Name or service not known』の解決方法

Railsのエラー『SystemCallError: getaddrinfo: Name or service not known』の解決方法

Railsアプリケーションで「SystemCallError: getaddrinfo: Name or service not known」というエラーが発生することがある。このエラーは、DNSの名前解決に失敗した場合に発生する。リモートサーバーへの接続処理で誤ったホスト名が指定された場合や、インターネット接続に問題がある場合に起こることが多い。エラーの発生条件と解決方法を詳しく解説する。

エラーの発生条件

このエラーは、主に以下の状況で発生する。

  • Net::HTTPopen-uri などのHTTPリクエストで無効なホスト名が指定されている
  • database.yml などの設定ファイルで無効なホスト名が設定されている
  • SMTPRedis などの外部サービスへの接続設定が間違っている
  • ネットワーク接続が遮断されている
  • DNSサーバーが適切に設定されていない

エラーメッセージの例

SystemCallError: getaddrinfo: Name or service not known

もしくは、次のようなメッセージが表示される場合もある。

SocketError: getaddrinfo: Name or service not known

原因1: 無効なホスト名が指定されている

無効なホスト名を指定すると、DNSの名前解決ができずエラーが発生する。

require 'net/http'

Net::HTTP.get(URI("http://invalid.example.com"))

解決策: 正しいホスト名を指定する。

Net::HTTP.get(URI("http://example.com"))

原因2: `database.yml` に誤ったホスト名が設定されている

database.yml に存在しないホストを設定すると、データベース接続に失敗する。

default: &default
  adapter: postgresql
  host: invalid-db-host
  database: my_app

解決策: host を正しいものに修正する。

host: localhost

原因3: `SMTP` 設定の誤り

メール送信時に config/environments/production.rb で無効なSMTPサーバーを指定するとエラーになる。

config.action_mailer.smtp_settings = {
  address: "invalid.smtp.server",
  port: 587,
  domain: "example.com",
  user_name: "user@example.com",
  password: "password",
  authentication: "plain"
}

解決策: SMTPのホスト名を修正する。

address: "smtp.example.com"

原因4: `Redis` などの外部サービスのホスト名が誤っている

Redisなどの外部サービスを使う場合、設定が間違っていると接続に失敗する。

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://invalid.redis.server:6379/0' }
end

解決策: 正しいホストを設定する。

url: 'redis://localhost:6379/0'

原因5: ネットワーク接続の問題

インターネット接続が切断されている場合、DNSの解決に失敗する。

解決策: ネットワーク接続を確認する。

ping google.com

問題がある場合、Wi-Fiを再接続するか、DNS設定を変更する。

原因6: DNSサーバーの設定ミス

ローカルのDNS設定が正しくない場合、名前解決ができない。

解決策: resolv.conf を確認し、GoogleのDNSを設定する。

nameserver 8.8.8.8
nameserver 8.8.4.4

まとめ

  • 無効なホスト名を指定していないか確認する
  • database.yml などの設定ファイルの host を正しいものに修正する
  • SMTPRedis の設定を確認し、正しいホストを指定する
  • ネットワーク接続をチェックし、DNS設定を見直す

これらの手順を試すことで、「SystemCallError: getaddrinfo: Name or service not known」のエラーを解決できる。