The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

解決啟動 Apache 網站伺服器時找不到 ServerName 的問題

每次 Ubuntu 安裝好 Apache HTTP Server 之後,在第一次啟用時都會遇到一個很明顯的錯誤訊息,也就是無法找到可靠的 ServerName 設定,雖然不會影響 Apache 的運作,但每次重新啟動 Apache 都會看到這個警告還挺礙眼的,雖然我知道只要在 httpd.conf 加上 ServerName 的設定就可以,但 Ubuntu 長久以來預設 Apache 安裝都不會加上 ServerName 的設定絕對有他的道理,這次我決定好好的釐清這件事。

首先,我們先來看看首次啟用的警告畫面,雖然 Apache 可以正確被啟動,但會出現提示訊息:

apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

以往為了解決這個問題,我都是手動將 ServerName 加到 /etc/apache2/httpd.conf 檔案中,在 Ubuntu 這個檔案通常是空的(也就是完全沒有內容),所以我會執行以下指令加入 ServerName 參數

echo "ServerName ubuntu.mydomain.com" >> /etc/apache2/httpd.conf

設定好之後,我們重新啟動 Apache 就不會再有錯誤提示了:

 

上網查了許多資料,發現大多的解法都是像我上述這樣,卻沒人提到如何讓 Apache 自動抓到正確 ServerName 所需的 hostname,我找來找去最後有找到有人提到 Apache 在開啟的時候會透過 IP 反查的方式取得ServerName 所需的 hostname,但我已經將這台電腦的 /etc/hostname/etc/hosts 都設定妥當,為什麼還是說抓不到呢?如下是我 /etc/hosts 的設定:

127.0.0.1       localhost ubuntu.mydomain.com
127.0.1.1       ubuntu

設定好了之後我再次重啟 Apache 是抓到正確的主機 FQDN 名稱了,但卻還是得到不同的警示訊息:

 

也因為還有警示訊息,我還是不死心,非要找到問題發生的主因不可,便依據原本錯誤訊息的線索找到關於 apr_sockaddr_info_get 的執行錯誤:

因此我也找到 Apache Portable Runtime (APR) 文件中關於 apr_sockaddr_info_get 方法的說明文件,這個方法主要是用在 Apache 要取得建立 Socket 前所需的 IPv4 或 IPv6 位址資訊,它可以從 hostname 取得 IP 資訊,也可以從 IP 取得 hostname 資訊,由於 Apache 會自動取得 ServerName 參數所需的資料,所以這裡一定是從 IP 取得 hostname 資訊,以便自動設定 ServerName 參數的內容。

幾經嘗試之後,終於被我抓到這個問題的核心,問題要解決,就必須要設定正確的 /etc/hosts 內容,才能讓 IP 反查 hostname 的時候正確執行,也就是需要對外服務的 hostname 不能設定為 127.0.0.1,必須設定成可以讓其他主機連接的 IP 地址!

我們先利用 hostname 指令幫我們查出幾個資訊,以下指令分別說明如下:

  • hostname      取得目前本機設定好的 Hostname
  • hostname –i     取得目前本機 Hostname 對應的 IP
  • hostname –I     取得目前本機設定好的所有 IP 位址(會排除 loopback 介面)
root@ubuntu:~# hostname
ubuntu.mydomain.com
root@ubuntu:~# hostname -i
127.0.0.1
root@ubuntu:~# hostname -I
10.0.3.19

也因為這樣,我嘗試將 10.0.3.19 這個 IP 設定給我的 ubuntu.mydomain.com 使用,最後的 /etc/hosts 內容如下:

127.0.0.1       localhost
127.0.1.1       ubuntu
10.0.3.19       ubuntu.mydomain.com

此時再重新啟動 Apache,果真得到一個漂亮的結果! ^_^

 

2012/7/17 補充

今天又安裝一台電腦,上述試過之後還是無效,後來發現要設定 FQDN 的 hostname 才能徹底解決此問題,在 Linux 下設定 hostname 的方式非常簡單,使用 hostname 指令搭配一個參數即可,如下:

hostname ubuntu.mydomain.com

 

結論

  • 先透過 hostname –I 取得本機掛載的 IP ( 可能不止一個,請挑選一個要給 Apache 用的 )
  • 設定該 IP 與 Hostname 到 /etc/hosts 檔案裡
  • 最後設定完整的 FQDN 主機名稱,也是利用 hostname 指令:hostname F.Q.D.N.

 

NOTE: 事實上你每次登入 Ubuntu Server 時,都會看到本機的 IP 是多少,直接參考這個 IP 也可以:

 

技術筆記

最近裝了幾台 Ubuntu 伺服器,安裝的是目前最新的 Ubuntu Server 12.04 LTS 版本,我個人習慣是,只要 Ubuntu 推出新的 LTS (Long-term support) 版本,我就會手動將現有的伺服器全部重新安裝全部重新設定一遍(包含資料與檔案轉移),因為許多 Linux 下的服務與套件都會不斷更新,所以安裝的過程多少都會有些不一樣,這樣可以確保之前寫好的安裝與設定 SOP 還能繼續使用,也順便複習一下年久未使用的指令與設定!^_^

 

相關連結