• Apache基本常見問題解答(faq)

    1
    PHP HTML Apache C/C++ Go 15719 次瀏覽
    下面是apache使用過程中經常遇到的一些問題:
     
     
    1、如果找不到文件的具體位置,在Linux下可以用類似locate httpd.conf的指令來搜索文件的位置。如果搜索不到,可以先用updatedb指令更新索引數據庫再用locate搜索。

    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/

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色