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

每次 Ubuntu 安裝好 [Apache HTTP Server](http://httpd.apache.org/) 之後，在第一次啟用時都會遇到一個很明顯的錯誤訊息，也就是無法找到可靠的 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**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/81682093e298e19052ef-image_1558.png)

以往為了解決這個問題，我都是手動將 [ServerName](http://httpd.apache.org/docs/2.0/mod/core.html#servername) 加到 **/etc/apache2/httpd.conf** 檔案中，在 Ubuntu 這個檔案通常是空的（也就是完全沒有內容），所以我會執行以下指令加入 [ServerName 參數](http://httpd.apache.org/docs/2.0/mod/core.html#servername)：

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

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5f85dfe54d23386204a2-image_1559.png)

上網查了許多資料，發現大多的解法都是像我上述這樣，卻沒人提到如何讓 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 名稱了，但卻還是得到不同的警示訊息：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b1e51635c7c3dadbb7f1-image_1560.png)

也因為還有警示訊息，我還是不死心，非要找到問題發生的主因不可，便依據原本錯誤訊息的線索找到關於 [apr\_sockaddr\_info\_get](http://apr.apache.org/docs/apr/1.4/group__apr__network__io.html#gaa2f399ca2b60b35c0abf7630298c6c9f) 的執行錯誤：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0c848a44f47647682826-image_1561.png)

因此我也找到 [Apache Portable Runtime](http://apr.apache.org/) (APR) [文件](http://apr.apache.org/docs/apr/1.4/)中關於 [apr\_sockaddr\_info\_get](http://apr.apache.org/docs/apr/1.4/group__apr__network__io.html#gaa2f399ca2b60b35c0abf7630298c6c9f) 方法的說明文件，這個方法主要是用在 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，果真得到一個漂亮的結果！ ^\_^

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ebda09966840900e3dd8-image_1562.png)

**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 也可以：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9f6efb17c731f4f09e03-image_1563.png)

**技術筆記**

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

**相關連結**

-   [Download Ubuntu Server 12.04 LTS](http://www.ubuntu.com/download/server)
-   [Ubuntu Server Guide](https://help.ubuntu.com/12.04/serverguide/) ( Ubuntu Server 12.04 LTS )

-   [Ubuntu Server Guide](https://help.ubuntu.com/12.04/serverguide/index.html) » [Web Servers](https://help.ubuntu.com/12.04/serverguide/web-servers.html) » [HTTPD - Apache2 Web Server](https://help.ubuntu.com/12.04/serverguide/httpd.html)

-   [The Apache HTTP Server Project](http://httpd.apache.org/)

-   [ServerName Directive](http://httpd.apache.org/docs/2.0/mod/core.html#servername)

-   [The Apache Portable Runtime Project](http://apr.apache.org/)

-   [apr\_sockaddr\_info\_get](http://apr.apache.org/docs/apr/1.4/group__apr__network__io.html#gaa2f399ca2b60b35c0abf7630298c6c9f)
