Apache基本常見問題解答(faq)
2、apachectl configtest或apachectl –t 檢查配置文件是否合法。apachectl一般位于安裝目錄的bin目錄下(如:/usr/local/apache2/bin)。不要直接調用httpd。
3、配置文件是httpd.conf;在Linux系統中,它可能存在于系統配置目錄(如:/etc/httpd/conf/),也可能存在于Apache的安裝目錄(如:/usr/local/apache2/conf)。
4、配置文件中,一行包含一個指令,但行尾可以用\表示續行。\與下一行之間不能有其它任何字符,包括空白字符。
#表示這一行是注釋。
5、指令對大小寫不敏感,但是參數對大小定敏感,在Linux系統下,路徑也要注意大小寫。路徑后不必加/。
6、類似于<Directory></Directory>表示一個配置段。大多數配置段中的指令僅針對配置段所匹配的請 求有 效。但諸如 <IfDefine>、<IfModule>、<IfVersion>之類,是在Apache啟動時,如果條件成立 才有效,并且對所有請求都有效。
httpd.conf的基本配置選項
7、ServerName服務器名稱,它用來創建URL的重導向。ServerName是apache服務器自身識別訪問請求的標記之一,他不必與實際IP或DNS名稱一致。也可以不設置,如果這樣,那apache會試圖用IP來作為請求的標記。端口也可以不設置。
例:ServerName [url=http://www.example.com/][color=#003366]www.example.com:80[/color][/url]
8、ServerAdmin管理員的電子郵件地址。服務器的錯誤提示頁會用到。如果ServerSignature定義為Email的話,將在錯誤頁的頁尾增加ServerAdmin的鏈接。
9、Listen服務器監聽的地址和端口。端口一定要指定。默認情況下,服務器會監聽本機的所有地址。可以同時使用多個Listen指令。
例一:同時所有接受來自端口80和8000的請求
Listen 80
Listen 8080
例二:指定地址+端口,配置虛擬主機時,會需要這樣設置。詳細看虛擬主機的設置。這并不是必要的。
Listen 192.168.0.2:80
Listen 192.168.0.1:8080
注意地址是本機的地址,是指客戶端對本機某個地址的請求。地址可以是域名,但最好是IP地址。
例三:IPv6地址必須用方括號括起來。
Listen [2001:db8::a00:20ff:fea7:ccea]:80
例四:要使Apache只處理IPv4的請求,只需如此:
Listen 0.0.0.0:80
10、ServerRoot 服務器基礎目錄,一般就是Apache的安裝目錄,不必更改。
11、DocumentRoot 指定主目錄。不指定的話,默認目錄一般是ServerRoot目錄下的htdocs目錄(如/usr/local/apache2/htdocs),視版 本而定;但是可能會有例外,所以最好指定。如果指定相對路徑,則認為是相對于ServerRoot目錄的。目錄后不要加/。
12、DirectoryIndex 默認首頁名稱。多個默認頁名稱用空格隔開。
13、ErrorDocument 處理請求出錯時的處理方式。未配置時只返回錯誤代碼。
例:
ErrorDocument 500 "The server made a boo boo."
# 指定本地URL時,該URL是相對于DocumentRoot目錄的。
ErrorDocument 404 /missing.html
ErrorDocument 404 "/cgi-bin/missing_handler.pl"
# 使用絕對URL時,客戶機將無法收到錯誤碼。
ErrorDocument 402
[url=http://www.example.com/subscription_info.html][color=#003366]http://www.example.com/subscription_info.html[/color][/url]
14、ErrorLog,CustomLog 指定錯誤日志和訪問日志。如果指定路徑是相對路徑,則認為是相對ServerRoot目錄的。日志文件可能會很大,以至影響到其它文件的儲存空間,所以有必要把日志文件放到一個單獨的分區。
例一:
ErrorLog /var/log/error_log
# commom是日記文件的格式,由LogFormat定義。不可用于ErrorLog。
Customlog /var/log/access_log common
例二:管道日志,可以用Apache提供的rotatelogs來實現。rotatelogs程序一般位于安裝目錄的bin目錄。
# 這將每24小時建立日志文件/var/log/logfile.nnnn,nnnn是日記建立時的系統時間。
CustomLog “|bin/rotatelogs /var/log/logfile 86400”common
# 日志文件達到5M時建立新日記,文件名類似于logfile.2006-12-30-24_33_12。
ErrorLog “|bin/rotatelogs /var/log/logfile.%Y-%m-%d-%H_%M_%S 5M”
15、User, Group 指定運行服務子進程的用戶和組。Rpm包安裝apache時會自動設置一個用戶和組,但有時會設成nobody或者不設置。為了安全和方便管理,設置為用戶和組為apache是很重要的。
例:User apache
Group apache
注意在Linux系統中手動添加apache用戶和組時,必須把他們的shell指定為nologin
虛擬主機
16、虛擬主機通過<VirtualHost>配置段來配置,配置段里的指令對虛擬主機有效,配置段沒有配置的,將采用全局的配置。檢查虛擬主機的配置可用apachectl –S(可能某些版本這個參數無效)。
17、基于域名的虛擬主機在DNS把多個域名都映射到同一IP的情況下有用。典型的配置如下:
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin [email=webmaster@test.com][color=#003366]webmaster@test.com[/color][/email]
DocumentRoot /www/docs/test.com
ServerName test.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/docs/test2.com
ServerName test2.com
</VirtualHost>
NameVirtualHost *:81
<VirtualHost *:81>
DocumentRoot /www/docs/test3.com
ServerName test3.com
</VirtualHost>
注意一:NameVirtualHost 指定虛擬主機所使用的IP地址或域名,但是最好是IP地址。使用基于域名的虛擬主機時,NameVirtualHost是必要的指令。NameVirtualHost可以定義多個。
注意二:所有符合NameVirtualHost或<VirtualHost>標簽定義的請求,都會被作為虛擬主機處理,而主服務器將不理
會。NameVirtualHost定義了而<VirtualHost>標簽沒有定義的的請求,服務器會找不到相應的虛擬主機而將無法處理。
所以每個NameVirtualHost定義的參數至少要有一個<VirtualHost>相匹配。
注意三:如果設置NameVirtualHost
或<VirtualHost>為*:80的話,所有針對80端口的請求,都會被虛擬主機處理,請求會根據域名指向某個虛擬主機。如果有來自
80端口的請求,而所請求的域名沒有被配置為虛擬主機,那將指向第一個虛擬主機。這樣主服務器將無法收到來自80端口的任何請求。為此也要為主服務器配置
一個虛擬主機。
18、ServerAlias 虛擬主機的別名
例:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName [url=http://www.domain.tld/][color=#003366]www.domain.tld[/color][/url]
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
這表示對 domain.tld和*.domain.tld的請求也由虛擬主機[url=http://www.domain.tld/][color=#003366]www.domain.tld[/color][/url]處理。
19、ServerPath指令是用于讓某些老式瀏覽器也訪問基于域名的虛擬主機的,一般不必設置。
20、基于IP地址的虛擬主機。例:
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName [url=http://www.example.com/][color=#003366]www.example.com[/color][/url]
</VirtualHost>
<VirtualHost 172.20.30.50 192.168.0.10:80>
DocumentRoot /www/example2
ServerName [url=http://www.example.org/][color=#003366]www.example.org[/color][/url]
</VirtualHost>
每個虛擬主機可定義多個IP,之間用空格隔開。
21、各種虛擬主機的混用。例:
Listen 80
Listen 81
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName [url=http://www.example.com/][color=#003366]www.example.com[/color][/url]
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example2
ServerName [url=http://www.example.org/][color=#003366]www.example.org[/color][/url]
</VirtualHost>
NameVirtualHost 172.20.30.40:81
<VirtualHost 172.20.30.40:81>
DocumentRoot /www/example3
ServerName [url=http://www.example3.net/][color=#003366]www.example3.net[/color][/url]
</VirtualHost>
# IP-based
<VirtualHost 172.20.30.50>
DocumentRoot /www/example4
ServerName [url=http://www.example4.edu/][color=#003366]www.example4.edu[/color][/url]
</VirtualHost>
<VirtualHost 172.20.30.60:81 172.20.30.40:81>
DocumentRoot /www/example5
ServerName [url=http://www.example5.gov/][color=#003366]www.example5.gov[/color][/url]
</VirtualHost>
22、虛擬主機混用時的問題:
一、虛擬主機混用可以這樣理解:一行NameVirtualHost指令定義的所有虛擬主機為一組;該組與一個基于IP的虛擬主機平級。即把一行NameVirtualHost定義的整個組看作是一個基于IP的虛擬主機。
二、虛擬主機指定的端口必須是Listen定義的。如果虛擬主機沒有指定端口,則認為是80端口。如果NameVirtualHost * 這樣定義,是指所有地址的所有已定義端口。
三、更具體的地址定義優先。比如NameVirtualHost指令定義了*:80,而某個基于IP的虛擬主機定義為192.168.0.1:80,那么
此時如有對192.168.0.1:80的請求,那請求會被優先指向192.168.0.1:80定義的虛擬主機。所以為了避免混亂,不要定義相互有交叉
或包含的地址區間。
四、一個虛擬主機,可以同時為基于域名和基于IP的。如上一例中最后一個虛擬主機。這樣符合兩種定義的請求都會被指同一個虛擬主機。有時要區別內外網對虛擬主機的訪問時可以這樣,因為來自內網的請求可能和來自外網的請求可能不一樣,但是它們需要指向同一個虛擬主機。
23、使用"_default_"虛擬主機,這個虛擬主機可以理解成基于IP的虛擬主機。例:
<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>
這個虛擬主機將接管與其它虛擬主機IP和端口不匹配的請求。不過如此一來,主服務器將不會處理任何請求。因此把主服務器配置成一個虛擬主機是必要的。
24、本地機器代理在其它機器上運行的虛擬主機。例:
<VirtualHost 158.29.33.248>
ProxyPreserveHost On
ProxyPass /foo/no !
ProxyPass /foo [url=http://192.168.111.2/][color=#003366]http://192.168.111.2[/color][/url]
ProxyPassReverse /foo [url=http://192.168.111.2/][color=#003366]http://192.168.111.2[/color][/url]
ServerName hostname.example.com
</VirtualHost>
一、首先這是一個基于IP的虛擬主機,它接收并處理對IP地址158.29.33.248的請求。
二、ProxyPass /foo
[url=http://192.168.111.2/][color=#003366]http://192.168.111.2[/color][/url]
將把對[url=http://158.29.33.248/foo][color=#003366]http://158.29.33.248
/foo[/color][/url]的請求轉換為一個代理請求,該請求指向[url=http://192.168.111.2/]
[color=#003366]http://192.168.111.2[/color][/url]。
三、ProxyPass /foo/no ! 不代理針對/foo/no的請求。這個必須放在正常代理指令之前。
四、ProxyPreserveHost On 意思是傳送原始請求的Host信息給被代理的機器。
五、ProxyPassReverse /foo
[url=http://192.168.111.2/][color=#003366]http://192.168.111.2[/color][/url]
可以保證請求URL在其它機器上被重定向后,本機處理時也可以保持一致。具體看手冊關于反向代理的部分。
六、基于域名的虛擬主機也是同樣的道理。不管是什么類型的虛擬主機,它只是處理歸它處理的請求而已。
配置段
25、<IfDefine> 只有在用httpd命令行啟動服務器時(最好不要直接使用httpd,用apachectl代替),使用了-D參數定義了相應參數時才生效。如服務器用 apachectl –D test啟動時,<IfDefine test>配置段生效。
26、<IfVersion> 例如:<IfVersion >= 2.0.55> 當Apache版本不低于2.0.55時生效。
27、<IfModule> 服務器啟用了指定的模塊后才生效。這是最常用的。例如<IfModule mod_mine_magic.c>。
28、<Directory> 用于封裝一組指令,使之對某個目錄和下屬的子目錄有效。
例:
<Directory />
Options FollowSymLinks Indexes
AllowOverride None
Order Deny,Allow
Deny from All
Allow from example.com
</Directory>
該配置段對整個根目錄樹有效。
一、Options
常用選項:FollowSymlinks允許在此目錄中使用符號鏈接;Indexes允許目錄列表,即在該目錄沒有默認頁時服務器返回該目錄的列表給客戶
機;SymLinksIfOwnerMatch只有符號鏈接與其目的目錄或文件屬于同一用戶時才有效。
注意:對同一目錄,只有一行Options有效,如果定義某個目錄的Options同時要繼承上級目錄的定義,可以這樣:Options
+Indexes。如果這樣:Options +Indexes
–FollowSymLinks,這將為本級目錄增加Indexes,取消FollowSymLinks。
二、AllowOverride 常用選項:None 不允許使用.htaccess;All允許在.htaccess中使用所有的指令。一般不必使用.htaccess,而且為了安全和效率起見,設置為None比較好。
三、Order 訪問控制,控制條件由Deny行和Allow行定義。Order指令常用選項:Deny,Allow 除了符合條件的外,其它的也允許訪問;Allow,Deny 除了符合條件的外,其它的不允許訪問。
Deny from All是拒絕所有的訪問,Allow from
example.com是允許example.com域訪問該目錄(意思是如果該服務器上有多個虛擬主機的話,只有example.com可以訪問該目
錄)。三行合起來的意思就是只允許example.com域訪問根目錄。當然這只是個例子,應該禁止所有域對根目錄的訪問。注意:Deny,Allow指
令生效的順序取決于Order中Deny和Allow的順序。
注意<Directory>不能嵌套。
這樣為了安全起見常常需要設置:
#拒絕對所有目錄的訪問,注意這里的/是指操作系統的根目錄,而非DocumentRoot目錄。
<Directory />
Options –Indexes -FollowSymLinks
AllowOverride None
Order Allow,Deny
</Directory>
#允許所有對/var/htdocs的訪問,允許對/var/htdocs的文件列表。
<Directory /var/htdocs>
Options +Indexes
Order Deny,Allow
</Directory>
29、<Files>和<Directory>類似,不過它定義的是對文件的訪問控制。它們都可以接受正則表達式為參數, 格式 如<Files ~ "\.(gif|jpe?g|png)$">或者<FilesMatch "\.(gif|jpe?g|png)$">。
30、<Location>與<Files>和<Directory>同,不過它定義的是對URL的訪問控制。
PHP配置
31、加載php模塊:LoadModule php5_module modules/libphp5.so
32、AddModule mod_php5.c (不是必須的)
33、哪種后綴的文件作為php腳本來解析:AddType application/x-httpd-php .php (這是必須的,但是可以用下面的配置代替):
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
</Files>
這種方法還可以為.php文件專門設置更多的配置。
34、哪種后綴的文件是php源文件:Addtype application/x-httpd-php-source .phps (不是必須的)
35、添加index.php為目錄首頁:DirectoryIndex index.php(視情況而定)
36、ScriptAlias /php/ /usr/local/php/ 對類似[url=http://example/php/abc.php][color=#003366]http://example/php /abc.php[/color][/url]的請求將引導執行/usr/local/php/abc.php腳本。 (一些所謂配置指南里有,事實上完全沒有這個必要。并且ScriptAlias這個指令是針對CGI腳本的。他會把php腳本也當作已定義的cgi腳本處 理)。
37、Action application/x-httpd-php "C:/PHP/php.exe" 所有application/x-httpd-php類型的文件都由C:/PHP/php.exe來處理,注意application/x-httpd- php必須是已經定義的文件類型。 (只有在windows中以CGI模式安裝PHP時才有用)。
38、事實上,必要的配置只有這么兩條:
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
來自:http://www.linuxpig.com/2011/06/apache-faq/