每次 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 還能繼續使用,也順便複習一下年久未使用的指令與設定!^_^
相關連結