Apache HTTP Server 2.4 版
相關模組 | 相關指令 |
---|---|
httpd 啟動時,它會繫結至本機上的其中一個埠號和地址,並等待傳入要求。預設情況下,它會監聽本機上的所有地址。然而,可能需要指示它監聽特定埠號,或僅監聽選定的地址,或兩者結合。這通常會與 虛擬主機 功能結合使用,這會決定 httpd 如何回應不同的 IP 地址、主機名稱和埠號。
Listen
指令會指示伺服器僅在指定的埠號或地址和埠號組合上接受傳入要求。如果僅在 Listen
指令中指定一個埠號,則伺服器會在所有介面上監聽指定的埠號。如果指定一個 IP 地址和一個埠號,則伺服器會在指定的埠號和介面上監聽。可以將多個 Listen
指令用於指定多個要監聽的地址和埠號。伺服器將回應來自任何列出的地址和埠號的要求。
例如,要讓伺服器在所有介面上接受埠號 80 和埠號 8000 上的連線,請使用
Listen 80 Listen 8000
要讓伺服器在一個介面上接受埠號 80 上的連線,而在另一個介面上接受埠號 8000 上的連線,請使用
Listen 192.0.2.1:80 Listen 192.0.2.5:8000
IPv6 地址必須加在方括號中,如下例所示
Listen [2001:db8::a00:20ff:fea7:ccea]:80
當 httpd 重新啟動時,對於變更 監聽
指令,必須特別考量。在重新啟動期間,httpd 會維持已繫結的埠(如下列原始組態),以避免對嘗試連線到伺服器的新連線產生「連線遭拒絕」錯誤。如果對使用的 監聽
指令組變更為與舊組態衝突的內容,組態就會失敗,而伺服器也會終止。
例如,從組態
Listen 127.0.0.1:80
變更為下列內容可能會失敗,因為繫結到所有位址的埠 80 會與僅在 127.0.0.1 上繫結到埠 80 產生衝突。
Listen 80
要讓此類組態變更生效,必須停止伺服器,然後重新啟動。
越來越多平台實作 IPv6,而 APR 支援大多數這些平台上的 IPv6,讓 httpd 能夠配置 IPv6 socket,並處理透過 IPv6 傳送的請求。
對於 httpd 管理員而言,一個令人困惑的因素是 IPv6 socket 是否可以同時處理 IPv4 連線和 IPv6 連線。使用 IPv6 socket 處理 IPv4 連線時,會使用 IPv4 對應 IPv6 位址,大多數平台預設允許這種作法,但 FreeBSD、NetBSD 和 OpenBSD 預設不允許,這是為了配合這些平台上的系統層級政策。在預設不允許的系統上,一個特別的 configure
參數可以為 httpd 變更這個行為。
另一方面,在某些平台上,例如 Linux 和 Tru64,處理 IPv6 和 IPv4 的唯一方式就是使用對應位址。如果您希望 httpd
使用最少 socket 數量處理 IPv4 和 IPv6 連線(這需要使用 IPv4 對應 IPv6 位址),請指定 --enable-v4-mapped
configure
選項。
除了 FreeBSD、NetBSD 和 OpenBSD 之外,所有平台上預設值都是 --enable-v4-mapped
,所以這可能是您的 httpd 建置方式。
如果您希望 httpd 只處理 IPv4 連線,而不論您的平台和 APR 支援什麼,請在所有 監聽
指令上指定 IPv4 位址,如下列範例所示
Listen 0.0.0.0:80 Listen 192.0.2.1:80
如果您的平台支援,而您希望 httpd 在分開 socket 上處理 IPv4 和 IPv6(也就是停用 IPv4 對應位址),請指定 --disable-v4-mapped
configure
選項。FreeBSD、NetBSD 和 OpenBSD 上的預設值是 --disable-v4-mapped
。
對大多數設定而言,Listen
的第二個可選參數 protocol
並非必要。若未指定的話,連接埠 443 的預設協定為https
,所有其他連接埠的預設協定為http
。協定會用來決定由哪個模組來處理要求,以及透過 AcceptFilter
指令來套用特定於協定的最佳化。
只有在非標準連接埠上執行時,您才需要設定協定。例如,在連接埠 8443 上執行 https
網站
Listen 192.170.2.1:8443 https
Listen
指令並未實作虛擬主機 - 它只會告知主伺服器要監聽哪些位址與連接埠。如果沒有使用 <VirtualHost>
指令,那麼伺服器對所有接受到的要求,會以相同的方式處理。不過,<VirtualHost>
可以用來對一個或多個位址或連接埠指定不同的處理方式。若要實作虛擬主機,伺服器首先必須收到要監聽的位址與連接埠的指示。然後應為指定的位址與連接埠建立 <VirtualHost>
區段,以設定此虛擬主機的處理方式。請注意,如果 <VirtualHost>
設定給伺服器未監聽的位址與連接埠,則無法存取該設定。