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は再起動すべきだ、というのが、今回の自分の結論。