相關(guān)模塊 | 相關(guān)指令 |
---|---|
Apache啟動(dòng)時(shí),會綁定本機(jī)上的 地址 和 端口 ,然后等待請求的進(jìn)入。默認(rèn)情況下,它會監(jiān)聽本機(jī)的所有地址。但是,當(dāng)需要監(jiān)聽特定的地址或端口或地址與端口的組合,或者需要對不同的IP地址、主機(jī)名、端口作出不同的響應(yīng)(如 使用 虛擬主機(jī))時(shí),就必須明確指定。
Listen
指令告訴 服務(wù)器 接只受來自特定端口(或地址+端口的組合)的請求。如果Listen
指令僅指定了端口,則服務(wù)器會監(jiān)聽所有的IP地址;如果指定了地址+端口的組合,則服務(wù)器只監(jiān)聽來自此特定地址上特定端口的請求。使用多個(gè)Listen
指令,可以指定在多個(gè)地址和端口上進(jìn)行監(jiān)聽。
例如:使服務(wù)器同時(shí)接受來自端口80和8000的請求,可以這樣寫:
Listen 80
Listen 8000
接受來自兩個(gè)指定的地址+端口的組合:
Listen 192.170.2.1:80
Listen 192.170.2.5:8000
IPv6地址必須用方括號括起來:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
有越來越多的平臺開始支持IPv6 ,而APR在大多數(shù)平臺上也支持IPv6 ,使Apache能夠獲得IPv6套接字,并處理通過IPv6發(fā)送的請求。
一個(gè)經(jīng)常令Apache管理員疑惑的 問題 是IPv6的套接字能否同時(shí)處理IPv4和IPv6的連接。IPv6套接字在處理IPv4連接時(shí)使用的是將IPv6映射到IPv4的地址(IPv4-mapped IPv6 addresses),這樣做在大多數(shù)平臺上默認(rèn)是允許的,而在FreeBSD、NetBSD、OpenBSD上,為了配合其系統(tǒng)全局策略,默認(rèn)卻是禁止的。即使在這些默認(rèn)禁止的平臺上,Apache也可以通過特殊的編譯選項(xiàng)
來改變這種行為。
另一方面,在某些平臺上(如Linux和Tru64)同時(shí)處理IPv6和IPv4的 唯一 方法就是使用映射地址(mapped addresses)。如果你希望Apache以最少的套接字同時(shí)處理IPv4和IPv6的連接,就必須使用映射到IPv4的IPv6地址,也就是必須指定--enable-v4-mapped
編譯選項(xiàng)
。
在除FreeBSD、NetBSD、OpenBSD以外的其他平臺上,--enable-v4-mapped
是編譯時(shí)的默認(rèn)值。因此你正在使用的Apache很可能就是按照這種方式編譯的。
要使Apache僅僅只處理IPv4連接,無論你的平臺是什么或者APR是否支持,只須對所有Listen
指令都指定IPv4地址即可,如下所示:
Listen 0.0.0.0:80
Listen 192.170.2.1:80
如果你的平臺支持從IPv6到IPv4的地址映射,但是你又希望Apache使用不同的套接字分別處理IPv4和IPv6的連接(也就是禁用地址映射),必須明確指定--disable-v4-mapped
編譯選項(xiàng)
。注意:--disable-v4-mapped
在FreeBSD、NetBSD、OpenBSD上是默認(rèn)值。
Listen
指令并不實(shí)現(xiàn)虛擬主機(jī),它只是告訴主服務(wù)器(main server )去監(jiān)聽哪些地址和端口。如果沒有<VirtualHost>
指令,服務(wù)器將對所有請求一視同仁;但是如果有<VirtualHost>
指令,則服務(wù)器會對不同的地址和端口作出不同的響應(yīng)。要實(shí)現(xiàn)虛擬主機(jī),首先必須告訴服務(wù)器需要監(jiān)聽哪些地址和端口,然后為每個(gè)特定的地址和端口建立一個(gè)<VirtualHost>
段來執(zhí)行特定的相應(yīng)。注意,如果將<VirtualHost>
段設(shè)置為服務(wù)器沒有監(jiān)聽的地址和端口,則此段無效。