作業ノート

様々なまとめ、雑感など

apache + php + curlで外部Webサーバにアクセスできなくてはまった

新しくサーバを構築したときにはまったのでメモ。

環境はphp5 + curl。Webページとしてアクセスしたときに、プログラムでcurlのモジュールを用いて外部のWebサーバにアクセスし、その結果に基づいて処理を行う。

起きた現象は、Webページとしてアクセスしたときに外部サーバに接続できず、期待した結果が得られなかったこと。

curlのエラーメッセージを確認すると、

  • エラー番号: 6
  • メッセージ: Couldn't resolve host '....'

エラーメッセージから、URLの名前解決ができていないということが判明。

で、はまったのはここから。

どうして名前解決できていないかを調べるために以下を試した。

  • nslookupコマンドで外部サーバの名前が解決するか。
  • pingコマンドで応答があるか。
  • wgetコマンドで該当URLのリクエスト結果が取得できるか。
  • curlコマンドでで該当URLのリクエスト結果が取得できるか。

すべて問題なし。つまり名前解決はできている。この時点で、原因の見当がつかなくなり、色々調べる。

調べている中で、今回構築したサーバの/etc/hostsに該当URLを直接書いてみてはどうかとアドバイスをもらい、試したところ、接続できた。

ひとまず問題が解決できたのだが、何か解せない。

さらに調査していると、 [SOLVED] cURL, PHP, Apache, Insanity! (Page 1) / Networking, Server, and Protection / Arch Linux Forumsのやりとり読んでいて、ふと/etc/resolve.confが書き換えられた可能性を思いつく。

まず、psコマンドのhttpdプロセスのSTARTと、/etc/resolve.confのタイムスタンプを比較。/etc/resolve.confの方が後であることが判明。

そして、この件を知っていそうな人に聞いたところ、その可能性はあるという答え。

そこで、/etc/hostsの設定を元に戻してhttpdを再起動。Webページにアクセスしたところ、問題が解決された。

結果から見て、/etc/resolve.confを編集したらhttpdは再起動すべきだ、というのが、今回の自分の結論。

参考